Взлом КПК приложений [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. Вот где она вызывается Code: .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. Code: .text:00016710 MOV R1, #0xCC .text:00016714 BL FindResourceW А вот и загрузка ресурса диалога. 0ССh==204. Значит, чтобы злое окно больше нас не беспокоило – нужно сделать из Code: .text:00016704 BNE loc_1673C безусловный прыжок (он перепрыгивает всю процедуру создания nagscreen), то есть заменить на B. Заменить байт 1Ah на 0EAh – было выяснено чисто практически, путем сравнения инструкций в хекс-просмотре (hex-view в ida). Именно этот прыжок нужно менять, а не прыжки выше, так как до этого создается основное окно программы и все функции до UpdateWindow включительно относятся к нему. А уничтожать основное окно в наши планы не входит. Заменив байт по адресу 00016704 в hiew я снова запустила на КПК прогу – теперь она ничего не просит, но при попытке сохранить запись выдает, что нужно зарегаться, так как возможность недоступна. Теперь поищем текстовые строки в IDA Code: 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 > Посмотрим что за код ссылается на данную строку. Code: 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 Как видим, прыжок Code: .text:0001530C BEQ loc_159C0 Приведет нас к Code: 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? Нужно поискать альтернативу, так как мы его не знаем. И она нашлась. Пустая инструкция. Code: CMP R0, #1 То есть просто сравнение регистра с единицей. Почему я называю ее пустой? Потому что в данном случае – что есть эта инструкция, что ее нет – значения не имеет. Почему имеено она? Потому что у на есть ее опкод. Вот что у меня получилось после всех манипуляций Code: 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