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

Discussion in 'Реверсинг' started by 0x0c0de, 24 Feb 2008.

  1. 0x0c0de

    0x0c0de Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    441
    Likes Received:
    396
    Reputations:
    297
    Взлом КПК приложений

    [Intro]

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

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

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

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

    [​IMG]

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

    [​IMG]

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

    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 будет грузиться медленно и ругаться на недостаток памяти.
    Внешний вид эмулятора
    [​IMG]

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

    [​IMG]

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

    [​IMG]

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

    [​IMG]

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

    [​IMG]

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

    [​IMG]

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

    [​IMG]

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

    [​IMG]

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

    [​IMG]

    Теперь поищем текстовые строки в 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
     
    #1 0x0c0de, 24 Feb 2008
    Last edited: 24 Feb 2008
    13 people like this.