ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > Реверсинг
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Взлом КПК приложений
  #1  
Старый 24.02.2008, 01:03
Аватар для 0x0c0de
0x0c0de
Постоянный
Регистрация: 25.05.2007
Сообщений: 448
Провел на форуме:
4226446

Репутация: 1564
Отправить сообщение для 0x0c0de с помощью ICQ
По умолчанию Взлом КПК приложений

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

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

Код:
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

Последний раз редактировалось 0x0c0de; 24.02.2008 в 15:56.. Причина: арфаграфические ашипки
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Взлом LiTO.ru ZaCo Авторские статьи 5 16.10.2005 23:29



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ