Реверс-инжениринг софта из мафона, часть 3

Путем несложного скрипта, который мне накодил знакомый линуксоид, я смог понять тип ФС в rootfs и примонтировать ее и получить содержимое

скрипт :

bsz=512 # or 1024, 2048, 4096 higher = faster

for i in {2..10000000}; do
    echo "--->$i<---"
    mount -o offset=$(($bsz*$i)) -t auto ./rootfs.img ./1
    if [ $? == 0 ]; then # whahoo!
        echo Eureka
        break
    fi
done

Скрипт пытается примонтировать раздел, перебирая смещение предположительного начала ФС, отделяя ее от лоадера.

Структура каталогов привычна, это просто MontaVista Linux ARM 32bit + busybox

корневой каталог

minipic

/lib :

minipic

И так далее. Все счастье занимает около 200-250мб и легко анализируется. Практически весь софт внутри прошивки обычный, интерес представляет только папка VNS в корне. Там весь софт который работает с оборудованием и вобщем все что делает мафон мафоном, а не ящиком с линуксом.

Структура каталогов :

bin\ - Бинарник и его модули
file\ - рингточег
hmidesign\ - пакованная SqushFS с, как это понятно из названия, юзеринтерфейсом.
ko\ - дрова на юсб, устр-во чтения сдкарт и прочее железо
lib\ - конфиг для вайфай, общие либы для проигрывателей айдио, видео, рантаймы
pmng\ - куча bash скриптов, ничего полезного, но однако имнно из одного из них я узнал что
    hmidesign это squashfs.

Для меня большой интерес представлял сам софт, поэтому больше всего времени я потратил на реверсинг именно его. Все бинарники которые меня интересовали были представлены, никакой защиты не имели (в плане защиты от реверсинга, вроде обфускации кода и шифрования имен), но в силу манеры кодинга я потратил доволно много времени чтоб разобраться в том, как это работает. Ведя именно эту запись я расчитываю на то что может быть кто-то будет делать примерно тоже самое и искать в гугле по ключевикам и найдется этот блог с результатами работы.

Итак, весь код поделен на модули, которые оформлены каждый обосбленно и представляет из себя некий черный ящег ящик. Он делает ровно то, что должен и не больше. Модулей 190 штук. Все имена модулей даны так, что сразу понятно кто что делает. Список модулей для гугла и ключевиков

acn.so 84 760 26.11.2015 14:16 -a--
adc.so 53 748 26.11.2015 14:16 -a--
adfs.so 28 388 26.11.2015 14:16 -a--
advc.so 64 848 26.11.2015 14:16 -a--
apc.so 888 732 26.11.2015 14:16 -a--
apldef.so 3 528 26.11.2015 14:16 -a--
arc.so 27 664 26.11.2015 14:16 -a--
audio_cl.so 3 760 26.11.2015 14:16 -a--
audio_hmi_core.so 845 792 26.11.2015 14:16 -a--
audio_hmi_t.so 668 004 26.11.2015 14:16 -a--
audio_sl.so 5 156 26.11.2015 14:16 -a--
audvr.so 71 024 26.11.2015 14:16 -a--
avc_lan.so 71 644 26.11.2015 14:16 -a--
avrgw.so 21 256 26.11.2015 14:16 -a--
avrif.so 36 348 26.11.2015 14:16 -a--
avup.so 26 344 26.11.2015 14:16 -a--
awf.so 106 492 26.11.2015 14:16 -a--
awg.so 351 332 26.11.2015 14:16 -a--
awpf.so 7 432 26.11.2015 14:16 -a--
biflib.so 12 936 26.11.2015 14:16 -a--
bkd.so 43 216 26.11.2015 14:16 -a--
bsi.so 3 436 26.11.2015 14:16 -a--
bta.so 110 472 26.11.2015 14:16 -a--
btac.so 121 536 26.11.2015 14:16 -a--
btcc.so 1 646 396 26.11.2015 14:16 -a--
btmc.so 252 436 26.11.2015 14:16 -a--
cam.so 246 572 26.11.2015 14:16 -a--
can.so 30 612 26.11.2015 14:16 -a--
ccp.so 74 324 26.11.2015 14:16 -a--
cddb.so 2 161 264 26.11.2015 14:16 -a--
cgw.so 137 636 26.11.2015 14:16 -a--
cim.so 176 336 26.11.2015 14:16 -a--
cisi.so 22 552 26.11.2015 14:16 -a--
cl.so 7 148 26.11.2015 14:16 -a--
cld.so 32 668 26.11.2015 14:16 -a--
clk.so 21 452 26.11.2015 14:16 -a--
cma.so 277 588 26.11.2015 14:16 -a--
cmst.so 3 388 26.11.2015 14:16 -a--
cnm.so 683 664 26.11.2015 14:16 -a--
cnminit.so 4 236 26.11.2015 14:16 -a--
cnp.so 39 500 26.11.2015 14:16 -a--
cs.so 61 148 26.11.2015 14:16 -a--
cus.so 65 024 26.11.2015 14:16 -a--
cvo.so 22 188 26.11.2015 14:16 -a--
dab.so 26 992 26.11.2015 14:16 -a--
dbms.so 149 304 26.11.2015 14:16 -a--
dctl.so 13 624 26.11.2015 14:16 -a--
dfw.so 19 956 26.11.2015 14:16 -a--
dghmi.so 268 284 26.11.2015 14:16 -a--
diagp.so 43 336 26.11.2015 14:16 -a--
display_hmi_core.so 916 208 26.11.2015 14:16 -a--
display_hmi_t.so 317 592 26.11.2015 14:16 -a--
dlr.so 69 520 26.11.2015 14:16 -a--
dmau.so 17 272 26.11.2015 14:16 -a--
dmdi.so 17 272 26.11.2015 14:16 -a--
dmna.so 17 360 26.11.2015 14:16 -a--
dmvr.so 17 360 26.11.2015 14:16 -a--
drc.so 4 044 26.11.2015 14:16 -a--
drl.so 104 936 26.11.2015 14:16 -a--
dspc.so 26 572 26.11.2015 14:16 -a--
dtc.so 79 428 26.11.2015 14:16 -a--
dtvepg.so 30 308 26.11.2015 14:16 -a--
dtvimg.so 7 476 26.11.2015 14:16 -a--
du.so 169 100 26.11.2015 14:16 -a--
duc.so 11 648 26.11.2015 14:16 -a--
dvccam.so 15 364 26.11.2015 14:16 -a--
dvup.so 26 956 26.11.2015 14:16 -a--
ecn.so 55 508 26.11.2015 14:16 -a--
eco.so 110 784 26.11.2015 14:16 -a--
excl.so 13 992 26.11.2015 14:16 -a--
exfm.so 13 252 26.11.2015 14:16 -a--
fcm.so 19 028 26.11.2015 14:16 -a--
fhap.so 49 984 26.11.2015 14:16 -a--
file.so 23 512 26.11.2015 14:16 -a--
fm_multi.so 136 304 26.11.2015 14:16 -a--
fmc.so 31 748 26.11.2015 14:16 -a--
fnwf.so 10 884 26.11.2015 14:16 -a--
font.so 1 202 276 26.11.2015 14:16 -a--
gps9lib.so 8 856 26.11.2015 14:16 -a--
gra.so 8 648 26.11.2015 14:16 -a--
hdcp.so 21 652 26.11.2015 14:16 -a--
hdcpm.so 25 680 26.11.2015 14:16 -a--
hdcpul.so 6 500 26.11.2015 14:16 -a--
hfhmi.so 380 892 26.11.2015 14:16 -a--
hfm.so 305 004 26.11.2015 14:16 -a--
hhp.so 21 808 26.11.2015 14:16 -a--
hic.so 39 140 26.11.2015 14:16 -a--
hmictrl.so 5 135 280 26.11.2015 14:16 -a--
hmilib.so 36 036 26.11.2015 14:16 -a--
htf.so 1 067 448 26.11.2015 14:16 -a--
hud.so 7 216 26.11.2015 14:16 -a--
i2chdlr.so 17 460 26.11.2015 14:16 -a--
ifs.so 49 020 26.11.2015 14:16 -a--
imgctl.so 71 780 26.11.2015 14:16 -a--
imglib.so 57 276 26.11.2015 14:16 -a--
inf.so 26 648 26.11.2015 14:16 -a--
info.so 6 896 26.11.2015 14:16 -a--
io_port.so 12 024 26.11.2015 14:16 -a--
ipl.so 30 088 26.11.2015 14:16 -a--
ipodmdl.so 68 928 26.11.2015 14:16 -a--
jsn.so 39 076 26.11.2015 14:16 -a--
key.so 118 440 26.11.2015 14:16 -a--
kmt.so 3 080 26.11.2015 14:16 -a--
lcan.so 30 036 26.11.2015 14:16 -a--
ldg.so 104 304 26.11.2015 14:16 -a--
ldmc.so 12 080 26.11.2015 14:16 -a--
lib_aes.so 10 640 26.11.2015 14:16 -a--
lib_ina.so 32 396 26.11.2015 14:16 -a--
llm_tab2.so 10 948 26.11.2015 14:16 -a--
loc_info.so 45 676 26.11.2015 14:16 -a--
loc_info_g.so 29 300 26.11.2015 14:16 -a--
lop.so 6 884 26.11.2015 14:16 -a--
lout.so 28 708 26.11.2015 14:16 -a--
map_cache.so 79 284 26.11.2015 14:16 -a--
mapview.so 766 084 26.11.2015 14:16 -a--
mawf.so 9 588 26.11.2015 14:16 -a--
mch.so 7 976 26.11.2015 14:16 -a--
mcon.so 73 696 26.11.2015 14:16 -a--
me.so 23 864 26.11.2015 14:16 -a--
me_bk.so 12 000 26.11.2015 14:16 -a--
mea.so 137 428 26.11.2015 14:16 -a--
mec.so 215 440 26.11.2015 14:16 -a--
mfs.so 55 192 26.11.2015 14:16 -a--
mfw.so 2 336 368 26.11.2015 14:16 -a--
mit.so 24 400 26.11.2015 14:16 -a--
mla.so 213 092 26.11.2015 14:16 -a--
mlc.so 299 764 26.11.2015 14:16 -a--
mode.so 753 688 26.11.2015 14:16 -a--
most.so 252 060 26.11.2015 14:16 -a--
msa.so 2 592 772 26.11.2015 14:16 -a--
mui.so 19 868 26.11.2015 14:16 -a--
multiview.so 30 808 26.11.2015 14:16 -a--
mvup.so 123 640 26.11.2015 14:16 -a--
navi_func_core.so 6 063 900 26.11.2015 14:16 -a--
navi_hmi_core.so 1 995 440 26.11.2015 14:16 -a--
navi_hmi_t.so 493 708 26.11.2015 14:16 -a--
navi_madmng.so 25 992 26.11.2015 14:16 -a--
ndc.so 3 480 26.11.2015 14:16 -a--
nim.so 27 296 26.11.2015 14:16 -a--
nm.so 143 432 26.11.2015 14:16 -a--
ntvdef.so 31 512 26.11.2015 14:16 -a--
ophmi.so 167 024 26.11.2015 14:16 -a--
pie.so 13 608 26.11.2015 14:16 -a--
pii.so 15 008 26.11.2015 14:16 -a--
pmw.so 7 148 26.11.2015 14:16 -a--
pup.so 29 436 26.11.2015 14:16 -a--
pvup.so 15 784 26.11.2015 14:16 -a--
rcc.so 46 148 26.11.2015 14:16 -a--
rds.so 17 504 26.11.2015 14:16 -a--
rex.so 22 792 26.11.2015 14:16 -a--
sammc.so 32 612 26.11.2015 14:16 -a--
sbc.so 28 464 26.11.2015 14:16 -a--
sbf.so 19 392 26.11.2015 14:16 -a--
sbp.so 86 992 26.11.2015 14:16 -a--
screen.so 112 828 26.11.2015 14:16 -a--
sd.so 3 123 800 26.11.2015 14:16 -a--
sir.so 23 400 26.11.2015 14:16 -a--
slib.so 162 172 26.11.2015 14:16 -a--
sndif.so 16 312 26.11.2015 14:16 -a--
soc.so 9 232 26.11.2015 14:16 -a--
sound.so 257 012 26.11.2015 14:16 -a--
ssg.so 170 024 26.11.2015 14:16 -a--
stc.so 52 536 26.11.2015 14:16 -a--
std.so 94 800 26.11.2015 14:16 -a--
stdatm.so 25 788 26.11.2015 14:16 -a--
str.so 300 464 26.11.2015 14:16 -a--
svgr.so 9 960 26.11.2015 14:16 -a--
tab2.so 38 324 26.11.2015 14:16 -a--
tac.so 668 948 26.11.2015 14:16 -a--
tal.so 26 884 26.11.2015 14:16 -a--
telmem.so 351 244 26.11.2015 14:16 -a--
tk.so 33 048 26.11.2015 14:16 -a--
tmr.so 8 684 26.11.2015 14:16 -a--
tp.so 44 032 26.11.2015 14:16 -a--
tpc.so 2 800 26.11.2015 14:16 -a--
trk.so 10 400 26.11.2015 14:16 -a--
tts.so 1 988 580 26.11.2015 14:16 -a--
tu.so 29 632 26.11.2015 14:16 -a--
uadd.so 27 364 26.11.2015 14:16 -a--
uic.so 27 052 26.11.2015 14:16 -a--
usv.so 185 592 26.11.2015 14:16 -a--
utl.so 16 704 26.11.2015 14:16 -a--
vd.so 16 536 26.11.2015 14:16 -a--
vmng.so 21 064 26.11.2015 14:16 -a--
vr.so 6 630 080 26.11.2015 14:16 -a--
vrhmi.so 171 880 26.11.2015 14:16 -a--
vsi.so 24 952 26.11.2015 14:16 -a--
wcm.so 72 472 26.11.2015 14:16 -a--
wdc.so 42 332 26.11.2015 14:16 -a--
xe.so 4 501 056 26.11.2015 14:16 -a--

Каждый модуль это, естественно, 32 битный ELF файл, с совершенно классической структурой, есть секция данных, кода, заголовки, все как надо. Описания нигде в модулях не зашито, жаль :( Но, хоть это и бесполезно, можно узнать каким компилятором собиралось это все - GCC: (MontaVista Linux Sourcery G++ 4.4-312) 4.4.1

Каждый модуль хоть и самостоятельный, но в одиночку не может справиться со всем что нужно. Один модуль может обращаться к другому и вообще вызовы могут быть серьезно запутанными с первого взгляда. Самое сложное в этом моменте то, что не сразу понятно (а сначала нихера не понятно) какому именно модулю может быть направлен тот или иной вызов. Пока не понятно почему так сделано, может быть это заморочки оптимизатора кода, а может для того чтоб сделать какое-то подобие хотпатчей. При старте любой (за небольшим исключением) модуль регистрирует функцией FTM_SetInfo (кторая сама находится в /lib/libftm.so) массив указателей на функции, которые доступны для других модулей. У каждой функции есть свой порядоковый номер. Указатель на этот массив запоминается, и затем используется, извлекая его FTM_GetInfo. Обе функции, напомню, в \vns\lib\libftm.so Сама libftm под это дело при старте выделяет довольно много памяти, расчитывая что список модулей будет довольно внушителен (но есть предположение что это все при компиляции расчитывается в места в libftm ровно столько, сколько нужно).

minipic

Хорошо винда инициализация массива под функи и инициализация мутексов для доступа к нему. Кстати, это значит что приложения многопоточные :) По большому счету от самой libftm ничего больше не надо. Только хранить указатели, выдавать таблицы по запросу, регистрировать новые.

minipic minipic

Ну, я не так хорошо разбирасью в АРМ, что сходу в голове анализировать его код. Поэтому вот что вижу я :D (ильфак, спасибо, как программист ты не говно) :

minipic

Это самый мелкий модуль из всех пожалуй, но один из самых часто дергаемых. Любой модуль в котором нужно обратиться к другому сделан так, что он сначала дернет FTM_GetInfo и только после этого вызовет нужную функу. То есть если заменить в этой таблице (внутри libftm,so) какой-то указатель, то категорически сразу все вызовы будут идти через актуальный указатель. Как одна из причин так делать, кстати, это хотпатчинг. Но не понятно на кой он нужен в мафоне. Разве что софт работает где-то еще в более отвественных местах, может обновляться в рантайме без перезагрузки. И так, каждый модуль при старте регистрирует свой массив функций в libftm, однозначно ассоциируя свой массив со своим айди. Чтоб потом обратиться к какой-либо функции из любого места, нужно точно знать в каком именно модуле находится функция, а вернее - знать его айди и знать номер (!) функции в массиве. Это такой некий аналог таблицы импорта в Windows PE файлах. Только вместо имени модуля его айди, а вместо имени функи - ее порядковый номер. Ну, можно сказать что это тоже своеобразный айди, однозначно ее обозначающий. Из этих двух индексов составляется 32 битное значение, в котором одна часть (2 байта) идентифицирует модуль, а другие 2 байта - номер функции. Кстати, это значит, что модулей и функций в модуле может быть максимум 65535. То есть на все-про-все у тех кто кодил это все жалкие 4.2 млрд функций, после исчерпания лимита которых им придется пересаживаться на 64 битный процессор :)) , но вопрос архаичности тойоты можно пока оставить на потом. Каждая функция которая может быть вызвана из внешнего модуля должна быть оформлена особоым (разумеется, стандартным для всех) образом и принимать два параметра - указатель на параметрическую структуру и число с кол-вом параметров в этой структуре. Крайне напоминает виндовый RPC, не так ли ..?

В параметрической структуре 2й дворд зарезервирован под результат, который вернет функа. Вызов такой функи через переходники libftm выглядит так :

minipic

Кстати, тут видно, что +4 байтовый дворд тут остался нулем, в нем вернется вкусное :)

minipic

И тадаааам! номер вызова - 0x1C0C7Cu Если попилить 'дворд то выходит что айди функи (

node.js shell

> 0x1C0C7C >> 16
28

а айди модуля 0xС7C Как это видит враппер который извлекает каждый раз указатель из libftm :

minipic

ARM код для особых цинителей :D

minipic

Ну, тут вроде и без комментариев все ясно. Сначала проверяется глобальный указатель на локальный кеш указателя на таблицу интересущего модуля. Если он не инициализирован, то он получается из libftm и используется дальше. Интересный момент тут. Почемуто в так называемом глобальном индексе функции (тот дворд который включает и индекс функи и индекс модуля) используется только индекс функции. Вероятно, это связано с тем, что компилятор во время построения кода упразднил извлечение айди модуля из этого дворда, оставив один ререходник для множества вариантов вызова для этого же самого модуля 0xC7C. Признаться, я потратил довольно много времени чтоб вообще понять и разобраться в этих таблицах и перекрестных вызовах. Если проанализировать весь граф этих вызовов и построить какую-то диаграму, то получится, наверное, некая круговая паутина. Если не понять саму эту модель то весь дальнейший реверсинг заходит в тупик, так как не понятно где искать продолжение логической цепочки, кроме как (ну еще бы!) отладкой. Сомневаюсь что все это заработало бы в борще или qemu, но я был близок к тому чтоб узнать это поближе.

Как я описал ранее, каждый модуль регистрирует свой айди в этих таблицах. В итоге я дизассемблировал каждый и из каждого выдрал айди, под которым он регистрируется. Это дало мне возможность видя такой вот абстрактный переходник знать какую функу в каком физическом файле сейчас следует анализировать.

2050 - io_port.so
3315 - kmt.so
3306 - ndc.so
3331 - apldef.so
12289 - audio_cl.so
2092 - drc.so
12297 - audio_sl.so
3288 - lop.so
1025 - info.so
3104 - cl.so
3098 - hud.so
3103 - awpf.so
3287 - dtvimg.so
1040 - mch.so
144 - gra.so
4 - tmr.so
3291 - soc.so
3206 - mawf.so
2058 - svgr.so
2059 - svgr.so
2052 - svgr.so
2056 - svgr.so
2057 - svgr.so
21 - trk.so
3197 - lib_aes.so
116 - fnwf.so
2048 - llm_tab2.so
2090 - duc.so
3106 - me_bk.so
1031 - biflib.so
12303 - pie.so
3146 - dctl.so
3199 - excl.so
83 - pii.so
3156 - dvccam.so
3191 - pvup.so
3237 - sndif.so
3084 - vd.so
3242 - utl.so
8201 - dmdi.so
12293 - dmau.so
16393 - dmvr.so
10253 - dmna.so
2049 - rds.so
3172 - fcm.so
3321 - sbf.so
3177 - mui.so
102 - dfw.so
3284 - vmng.so
12295 - avrgw.so
3074 - hdcp.so
3298 - hhp.so
111 - cvo.so
3233,3234,3235 - cisi.so
3131 - rex.so
3079 - sir.so
3075 - file.so
0 - me.so
3148 - mit.so
3078 - vsi.so
3167 - hdcpm.so
3154 - stdatm.so
106 - navi_madmng.so
3188 - dspc.so
8203 - info.so
12302 - tal.so
8204 - uic.so
3099, 3277 - nim.so
12304 - uadd.so
3219 - arc.so
3236 - adfs.so
3238 - sbc.so
3173 - lout.so
3192 - loc_info_g.so
3085 - ipl.so
12296 - dtvepg.so
86 - can.so
3282 - multivew.so
118 - ntvdef.so
136 - fmc.so
3196 - lib_ina.so 
3272 - sammc.so
3076 - awf.so

Если взять пример выше, то C7C это 3196, а 1C (0x1C0C7C >> 16) это 28. Палим мою таблицу, видим что под этим айди регалась lib_ina,so ну и дальше аналогично со всеми остальными вызовами :) Кстати, важно отметить что в модулях полно отладочной информации в виду printf() с названием функи, видимо вкомпиливавшийся как printf (FUNCTION "%s"...), что позволяет довольно легко называть нормальными именами сами функи во время исследования. Например модуль sammc.so (судя по всему это набор функций для шифрования. Есть реализации AES \ RSA \ etc)

minipic

И если там пробежаться по функам модуля и попереименовывать таким образом часть фунок то вообще все становится ясно на примере таблицы того же sammc.so (кстати, у всех модулей первый элемент в таблице всегда 0).

minipic

На этом пока все, на зпрос впочту могу дать архивы, IDB файлы и прочее.


Комментарии
Игорь
Здравствуйте! Тоже ковыряю софт от Lexus GS 350, но европейский. Хотел кое о чём посоветоваться, много времени это не займёт. Суть вопроса изложил, поделившись с Вами записью на Google+, но не знаю, приходит ли Вам информирование о подобном. Других Ваших контактов, к сожалению, найти не смог. Если будет минутка, черканите, пожалуйста, на igor.voronin@gmail.com Заранее большое спасибо)
Mon Mar 20 2017 03:40:27 GMT+0300 (MSK)
Александр
Может чем-то поможет в "препарировании", а может Вы видели уже это, но всё же напишу... у AISIN'а можно скачать сурс системы ГУ. Вот тут: http://www.aisin-aw.co.jp/oss/13mop/
Wed Mar 22 2017 03:05:57 GMT+0300 (MSK)
Andrwe
Александр, спасибо, интересно. Сегодня ознакомлюсь с кодом
Wed Mar 22 2017 06:36:46 GMT+0300 (MSK)
Andrwe
Посмотрел, там только исходники ядра и пары-тройки драйверов. Все остальное, проприетарщина, все это закрыто :(
Wed Mar 22 2017 07:22:43 GMT+0300 (MSK)