Взлом КПК приложений
[Intro]
Число мобильных приложений сейчас стремительно растет и все чаще встречаются среди них триальные программы. Я не буду говорить о .net приложениях – так как они работают и под обычной Windows, так и под кпк. Поговорим о тех прогах, которые скомпилены под arm-процессоры. Рассматриваемая ОС –Windows Mobile. Что побудило меня написать статью на эту тему - так это катастрофическая нехватка материала как в инете, так и на ачате в частности, посвященного взлому КПК приложений..
[Настройка инструментария]
Не каждый имеет кпк (как я например), поэтому будем работать с эмулятором. Что нам понадобиться при исследовании risc кода?
1.Во-первых
IDA. Приложения для КПК дизассемблируются идой на ура (при загрузке файла в дизасм выбираем вкладочку
PDAs/Phones/Handhelds и выбираем тип того, что нам нужно дизассемблировать – exe, dll … ). Я юзаю 5-ю версию.
Есть дизассемблер для кпк ChARMed, но его работой я осталась не очень довольна
Скачать его можно по этой ссылке
http://carolos.za.net/
2. Во –вторых
Device Emulator (Standalone Device Emulator 1.0 with Windows Mobile OS Images – качайте и образы осей сразу, чтобы потом не заморачиваться)
1.0
http://www.microsoft.com/downloads/details.aspx?FamilyId=C62D54A5-183A-4A1E-A7E2-CC500ED1F19A&displaylang=en
2.0
http://www.microsoft.com/downloads/details.aspx?FamilyID=dd567053-f231-4a64-a648-fea5e7061303&displaylang=en
Я пользуюсь первым, но во втором отличий в принципе не много.
Вы можете не скачивать этого, если у вас есть
VisualStudio с Device Emulator и образы операционных систем. У меня сам эмулятор был в студии, но образов нужных не было. Я буду говорить о одиночном эмуляторе, не из студии, и о его настройке.
Также нам нужен будет
ActiveSync, скачайте его по ссылке ниже и установите
http://www.microsoft.com/windowsmobile/activesync/activesync45.mspx
Итак, вы скачали и установили образы и эмулятор (образ ос - скин):
Образы:
pocketpc.nb0 – pocketpc.xml
smartphone.nb0 - smartphone.xml
smartphone_hidpi.nb0 - smartphone_hidpi.xml
Теперь для удобства перенесите их в директорию с DeviceEmulator. По дефолту это C:\Program Files\DeviceEmulator\1.0\
Для того, чтоб было удобней вызывать из cmd я сделала так
C:\1.0\
То есть перенесла папку с образами и эмулятором в корневик диска С. Теперь запускаем cmd.
И вводим
С:\1.0\ DeviceEmulator.exe C:\1.0\ pocketpc.nb0 /memsize 128
Что означает каждый элемент этой строки? Мы запускаем
DeviceEmulator.exe с параметром – образом эмулируемой ОС и указываем количество памяти, которая будет выделена для нее в мегабайтах. Вы можете указать больше, но, желательно не меньше. Так как Windows Mobile будет грузиться медленно и ругаться на недостаток памяти.
Внешний вид эмулятора
После этого следует включить серийный порт, а то приконнектиться ActiveSync мы не сможем –
File->Configure и выбрать вкладочку
Peripherals и включить один из портов (выбрать COM1 вместо Do not map). Так же вы можете выбрать скин (вкладка Display и пункт Skin) для эмулируемой оси, по ум0лчанию скина нет, но впрочем это и не важно вовсе=)
Затем запустите
dvcemumanager.exe, выберите свежесозданное устройство, щелкните по нему правой кнопкой мыши и выберите пункт мену Cradle.
У меня ActiveSync (запущенный в этот момент) коннектился сразу же, но если этого не произошло соедините вручную
File->Connection Settings и потом кнопка Connect ). При конфигурировании обязательно(!) синхронизируйте файлы – это нужно для установки программ на КПК.
Далее по настройке вам все должно быть понятно, так как интерфейс у мелкомягких программ “интуитивно понятный”.
3. Нам нужна какая-либо
КПК shareware-программа. Ей будет FreeNotes. Над ней и будем ставить наши опыты.
4. Нужен какой-нить
мануал по arm-командам. По командам я нашла, а по опкодам нет. Поэтому пришлось соображать в уже в иде какая команда имеет какой опкод (нужно для патча).
http://www.chipnews.ru/html.cgi/arhiv/02_06/6.htm
Почитать можете это. Кое-что по командам.
Команды, нужные нам
[Commands]
B - безусловный переход (аналог jmp)
BL -переход с сохранением адреса возврата в LR (аналог call)
BNE – переход, если не равно
BEQ - переход, если равно
CMP - сравнение
5.
Хекс-редактор (у меня - мой любимый hiew)
[Исследование]
Итак, у нас готовы все инструменты. Сначала установим FreeNotes на нашу виртуальную WindowsMobile. Делается это через
ActiveSync (Tools->Add/Remove Programms).
Установив, запустите программу.
Она просит ключ при каждом запуске и работает только 5 дней.
Скопируем экзешник из папки в виртуальном КПК на Рабочий стол обычного компьютера. И загрузим файл в Иду. Выберем вкладку
PDAs/Phones/Handhelds и пункт
PocketPC ARM Executable и выберем наш файл.
Теперь нужно попытаться найти наш ресурс диалога (NagScreen) в Restorator – это все не в КПК, а в ПК. И находим его=)
Дело в том, что ресторатор такие файлы разрешает просматривать, но иногда поругивается, что этот файл не для Windows NT=). Диалог мы нашли – ид 204. Теперь поищем функции работы с диалогом. Находим уже знакомую нам DialogBoxIndirectParamW. Вот где она вызывается
Код:
.text:0001660C STMFD SP!, {R4-R7,LR}
.text:00016610 SUB SP, SP, #0x40
.text:00016614 MOV R6, R1
.text:00016618 MOV R4, R0
.text:0001661C LDR R5, =unk_2C1D8
.text:00016620 LDR R1, =aFreeNotesForWi
.text:00016624 LDR R0, =aBogo
.text:00016628 STR R4, [R5,#0x50]
.text:0001662C BL FindWindowW
.text:00016630 CMP R0, #0
.text:00016634 BEQ loc_1664C
.text:00016638 ORR R0, R0, #1
.text:0001663C BL SetForegroundWindow
.text:00016640
.text:00016640 loc_16640 ; CODE XREF: sub_1660C+9C j
.text:00016640 MOV R0, #0
.text:00016644 ADD SP, SP, #0x40
.text:00016648 LDMFD SP!, {R4-R7,PC}
.text:0001664C ; ---------------------------------------------------------------------------
.text:0001664C
.text:0001664C loc_1664C ; CODE XREF: sub_1660C+28 j
.text:0001664C LDR R1, =aBogo
.text:00016650 MOV R0, R4
.text:00016654 BL sub_16588
.text:00016658 BL InitRichInkDLL
.text:0001665C ADD R1, SP, #0x54+var_24
.text:00016660 MOV R0, #0
.text:00016664 BL GetClientRect
.text:00016668 LDR R2, =aFreeNotesForWi
.text:0001666C LDR R1, =aBogo
.text:00016670 MOV LR, #0x80000000
.text:00016674 MOV R7, #0
.text:00016678 MOV R3, #0x10000000
.text:0001667C MOV R0, #0
.text:00016680 STR LR, [SP,#0x54+var_48]
.text:00016684 STR LR, [SP,#0x54+var_4C]
.text:00016688 STR LR, [SP,#0x54+var_50]
.text:0001668C STR LR, [SP,#0x54+var_54]
.text:00016690 STR R7, [SP,#0x54+var_38]
.text:00016694 STR R7, [SP,#0x54+var_40]
.text:00016698 STR R7, [SP,#0x54+var_44]
.text:0001669C STR R4, [SP,#0x54+var_3C]
.text:000166A0 BL CreateWindowExW
.text:000166A4 MOVS R4, R0
.text:000166A8 BEQ loc_16640
.text:000166AC ADD R1, SP, #0x54+var_34
.text:000166B0 MOV R0, R4
.text:000166B4 BL GetWindowRect
.text:000166B8 LDR R2, [R5]
.text:000166BC LDR R3, [SP,#0x54+var_28]
.text:000166C0 CMP R2, #0
.text:000166C4 LDRNE R2, [SP,#0x54+var_30]
.text:000166C8 LDRNE R1, [SP,#0x54+var_34]
.text:000166CC SUB LR, R3, #0x1A
.text:000166D0 LDRNE R3, [SP,#0x54+var_2C]
.text:000166D4 MOVNE R0, R4
.text:000166D8 STR LR, [SP,#0x54+var_28]
.text:000166DC STRNE R7, [SP,#0x54+var_50]
.text:000166E0 STRNE LR, [SP,#0x54+var_54]
.text:000166E4 BLNE MoveWindow
.text:000166E8 MOV R1, R6
.text:000166EC MOV R0, R4
.text:000166F0 BL ShowWindow
.text:000166F4 MOV R0, R4
.text:000166F8 BL UpdateWindow
.text:000166FC BL sub_14724
.text:00016700 CMP R0, #0
.text:00016704 BNE loc_1673C
.text:00016708 LDR R0, [R5,#0x50]
.text:0001670C MOV R2, #5
.text:00016710 MOV R1, #0xCC
.text:00016714 BL FindResourceW
.text:00016718 MOV R1, R0
.text:0001671C LDR R0, [R5,#0x50]
.text:00016720 BL LoadResource
.text:00016724 LDR R3, =sub_16338
.text:00016728 MOV R1, R0
.text:0001672C LDR R0, [R5,#0x50]
.text:00016730 MOV R2, #0
.text:00016734 STR R7, [SP,#0x54+var_54]
.text:00016738 BL DialogBoxIndirectParamW
.text:0001673C
.text:0001673C loc_1673C ; CODE XREF: sub_1660C+F8 j
.text:0001673C MOV R0, #1
.text:00016740 ADD SP, SP, #0x40
.text:00016744 LDMFD SP!, {R4-R7,PC}
.text:00016744 ; End of function sub_1660C
Обратите внимание на команды – они другие. Это вам не интеловский ассемблер. Но так как это Windows (хоть и Mobile) мы видим знакомые функции вроде LoadResource и FindWindowW.
Код:
.text:00016710 MOV R1, #0xCC
.text:00016714 BL FindResourceW
А вот и загрузка ресурса диалога. 0ССh==204. Значит, чтобы злое окно больше нас не беспокоило – нужно сделать из
Код:
.text:00016704 BNE loc_1673C
безусловный прыжок (он перепрыгивает всю процедуру создания nagscreen), то есть заменить на B. Заменить байт 1Ah на 0EAh – было выяснено чисто практически, путем сравнения инструкций в хекс-просмотре (hex-view в ida).
Именно этот прыжок нужно менять, а не прыжки выше, так как до этого создается основное окно программы и все функции до UpdateWindow включительно относятся к нему. А уничтожать основное окно в наши планы не входит.
Заменив байт по адресу 00016704 в hiew я снова запустила на КПК прогу – теперь она ничего не просит, но при попытке сохранить запись выдает, что нужно зарегаться, так как возможность недоступна.
Теперь поищем текстовые строки в IDA
Код:
00026FB0 aForSavingYourN unicode 0, <For saving your notes you should activate th>
.rdata:00026FB0 ; DATA XREF: .text:off_15B40 o
.rdata:00026FB0 unicode 0, <is software. For receiving an activation co>
.rdata:00026FB0 unicode 0, <de please, buy this software on >
Посмотрим что за код ссылается на данную строку.
Код:
00152F8 loc_152F8 ; CODE XREF: .text:00015100 j
.text:000152F8 BL sub_14724
.text:000152FC CMP R0, #0
.text:00015300 LDREQ R2, =aAttention
.text:00015304 LDREQ R1, =aForSavingYourN ; загрузка злой строки
.text:00015308 MOVEQ R0, R7
.text:0001530C BEQ loc_159C0 ; MessageBox
.text:00015310 BL sub_14724
.text:00015314 CMP R0, #1
.text:00015318 BNE loc_15AC8 ; еще одна проверка
.text:0001531C LDR R1, =aMyDocuments
.text:00015320 SUB R0, R11, #0x1A4
.text:00015324 MOV R2, #0x1C
.text:00015328 BL memcpy
.text:0001532C LDR R1, =aFreeNotes
.text:00015330 SUB R0, R11, #0x1E4
.text:00015334 MOV R2, #0x18
.text:00015338 BL memcpy
.text:0001533C MOV R1, #0
.text:00015340 SUB R0, R11, #0x1A4
.text:00015344 BL CreateDirectoryW
Как видим, прыжок
Код:
.text:0001530C BEQ loc_159C0
Приведет нас к
Код:
loc_159C0 ; CODE XREF: .text:000150C
.text:000159C0 ; .text:0001530C
.text:000159C0 MOV R3, #0
.text:000159C4 BL MessageBoxW
.text:000159C8 B loc_15AC8
А значит его нужно занопить- это показ сообщения об ограничении в триал-версии. Но какой опкод имеет команда nop? Нужно поискать альтернативу, так как мы его не знаем. И она нашлась. Пустая инструкция.
То есть просто сравнение регистра с единицей. Почему я называю ее пустой? Потому что в данном случае – что есть эта инструкция, что ее нет – значения не имеет. Почему имеено она? Потому что у на есть ее опкод.
Вот что у меня получилось после всех манипуляций
Код:
text:000152F8 loc_152F8 ; CODE XREF: .text:00015100 j
.text:000152F8 BL sub_14724
.text:000152FC CMP R0, #0
.text:00015300 LDREQ R2, =aAttention
.text:00015304 LDREQ R1, =aForSavingYourN
.text:00015308 MOVEQ R0, R7
.text:0001530C CMP R0, #1 ; изменено
.text:00015310 BL sub_14724
.text:00015314 CMP R0, #1
.text:00015318 CMP R0, #1 ; изменено
.text:0001531C LDR R1, =aMyDocuments
.text:00015320 SUB R0, R11, #0x1A4
.text:00015324 MOV R2, #0x1C
.text:00015328 BL memcpy
.text:0001532C LDR R1, =aFreeNotes
.text:00015330 SUB R0, R11, #0x1E4
.text:00015334 MOV R2, #0x18
.text:00015338 BL memcpy
.text:0001533C MOV R1, #0
.text:00015340 SUB R0, R11, #0x1A4
.text:00015344 BL CreateDirectoryW
Теперь триала нет и программа работает без ограничений).
[Outro]
Итак, взлом КПК (Windows Mobile) приложений в общем не отличается от взлома обычных ПК-прог, только arm может смутить, но это только первое время (от трех часов до суток)).
PS Чтобы посмотреть полные скрины - удалите "thumbnail/"
например
http://www.pikucha.ru/2546/thumbnail/restorator.JPG
на
http://www.pikucha.ru/2546/restorator.JPG