Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Реверсинг (https://forum.antichat.xyz/forumdisplay.php?f=94)
-   -   Взлом КПК приложений (https://forum.antichat.xyz/showthread.php?t=62580)

0x0c0de 24.02.2008 01:03

Взлом КПК приложений
 
Взлом КПК приложений

[Intro]

Число мобильных приложений сейчас стремительно растет и все чаще встречаются среди них триальные программы. Я не буду говорить о .net приложениях – так как они работают и под обычной Windows, так и под кпк. Поговорим о тех прогах, которые скомпилены под arm-процессоры. Рассматриваемая ОС –Windows Mobile. Что побудило меня написать статью на эту тему - так это катастрофическая нехватка материала как в инете, так и на ачате в частности, посвященного взлому КПК приложений..

[Настройка инструментария]

Не каждый имеет кпк (как я например), поэтому будем работать с эмулятором. Что нам понадобиться при исследовании risc кода?

1.Во-первых IDA. Приложения для КПК дизассемблируются идой на ура (при загрузке файла в дизасм выбираем вкладочку PDAs/Phones/Handhelds и выбираем тип того, что нам нужно дизассемблировать – exe, dll … ). Я юзаю 5-ю версию.

http://www.pikucha.ru/2545/thumbnail/ida_pda.JPG

Есть дизассемблер для кпк ChARMed, но его работой я осталась не очень довольна

http://www.pikucha.ru/2563/thumbnail/disam.JPG

Скачать его можно по этой ссылке

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 будет грузиться медленно и ругаться на недостаток памяти.
Внешний вид эмулятора
http://www.pikucha.ru/2543/thumbnail/emu_view.JPG

После этого следует включить серийный порт, а то приконнектиться ActiveSync мы не сможем – File->Configure и выбрать вкладочку Peripherals и включить один из портов (выбрать COM1 вместо Do not map). Так же вы можете выбрать скин (вкладка Display и пункт Skin) для эмулируемой оси, по ум0лчанию скина нет, но впрочем это и не важно вовсе=)
Затем запустите dvcemumanager.exe, выберите свежесозданное устройство, щелкните по нему правой кнопкой мыши и выберите пункт мену Cradle.

http://www.pikucha.ru/2544/thumbnail/emu_manager.JPG

У меня ActiveSync (запущенный в этот момент) коннектился сразу же, но если этого не произошло соедините вручную File->Connection Settings и потом кнопка Connect ). При конфигурировании обязательно(!) синхронизируйте файлы – это нужно для установки программ на КПК.

http://www.pikucha.ru/2549/thumbnail/s_files.JPG

Далее по настройке вам все должно быть понятно, так как интерфейс у мелкомягких программ “интуитивно понятный”.
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).

http://www.pikucha.ru/2548/thumbnail/add_program.JPG

Установив, запустите программу.

http://www.pikucha.ru/2552/thumbnail/install.JPG

Она просит ключ при каждом запуске и работает только 5 дней.

http://www.pikucha.ru/2550/thumbnail/nag_notes.JPG

Скопируем экзешник из папки в виртуальном КПК на Рабочий стол обычного компьютера. И загрузим файл в Иду. Выберем вкладку PDAs/Phones/Handhelds и пункт PocketPC ARM Executable и выберем наш файл.
Теперь нужно попытаться найти наш ресурс диалога (NagScreen) в Restorator – это все не в КПК, а в ПК. И находим его=)

http://www.pikucha.ru/2546/thumbnail/restorator.JPG

Дело в том, что ресторатор такие файлы разрешает просматривать, но иногда поругивается, что этот файл не для 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).

http://www.pikucha.ru/2547/thumbnail/hex_view.JPG

Именно этот прыжок нужно менять, а не прыжки выше, так как до этого создается основное окно программы и все функции до UpdateWindow включительно относятся к нему. А уничтожать основное окно в наши планы не входит.:)
Заменив байт по адресу 00016704 в hiew я снова запустила на КПК прогу – теперь она ничего не просит, но при попытке сохранить запись выдает, что нужно зарегаться, так как возможность недоступна.

http://www.pikucha.ru/2551/thumbnail/attention.JPG

Теперь поищем текстовые строки в 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? Нужно поискать альтернативу, так как мы его не знаем. И она нашлась. Пустая инструкция.

Код:

CMP    R0, #1
То есть просто сравнение регистра с единицей. Почему я называю ее пустой? Потому что в данном случае – что есть эта инструкция, что ее нет – значения не имеет. Почему имеено она? Потому что у на есть ее опкод.
Вот что у меня получилось после всех манипуляций

Код:

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


Время: 13:16