eXTracted INternals

eXTracted INternals
 
ФорумФорум  ЧаВоЧаВо  ПоискПоиск  РегистрацияРегистрация  ПользователиПользователи  ГруппыГруппы  Вход  

Поделиться | 
 

 Садомазахизм - Windows Mobile

Предыдущая тема Следующая тема Перейти вниз 
АвторСообщение
neonix



Количество сообщений : 39
Дата регистрации : 2008-08-01

СообщениеТема: Садомазахизм - Windows Mobile   Чт 21 Авг - 17:52

Думаю многие знакомы с выражением, что русские часто создают себе проблемы, чтобы их потом решать, так вот настоящая мини статья какраз и показывает методы хардкорного реверсинга для начинающих Smile. Как все начиналось:
Вообщем сидя с ноутом на балконе в один из жарких апрельских дней, мне в голову стукнула идея, о том можно ли получить из того, что выдает IDA нормальную рабочую программу. (Попытки это сделать под Windows я делал еще давно, но даже после исправления кучи ошибок в ассемблерном листинге я ничего толком не добился, скомпиленый obj не хотел нормально линковаться какраз из-за IDA-шного вывода вызываемых функций.) Но я не силен в асме для x86, и поэтому я решил, что на этот раз платформой для садомазохизма будет ARM.
Вооружившись компилятором Pelles C я написал небольшую прожку, (кстати выбор этого компилятора был неслучайным, во первых он бесплатен, во вторых позволяет писать софт для Wince, в частности PDA и Smartphone, и имеет встроенный ассемблер и отладчик)
Сайт разработчика этого компилятора - http://pellesc.de/
Прога простая и содержит минимум кода, она выводит на экран мессейдж бокс.
У меня смарт, поэтому я создал пустой проект Smartphone .
Код:

#include <windows.h>

int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPTSTR CmdLine, int CmdShow)
{
MessageBox(NULL, _T("FUCK_APPS"), _T("TESTING"), MB_OK);
return 0;
}
Т.к. передача параметров идет через регистры, заставляем это делать функцию WinMain, иначе прога не скомпилится. Еще в настройках проекта можно отключить оптимизацию, это поможет быстрее разобраться с ассемблерным листингом.

Скомпиленая прога с оптимизацией для размера весит 3,5 кб без оптимизаций – 4,5 кб.
Начинаем ковырять:
Запускаем IDA Pro (я использую IDAPro5.2), подкидываем ей скомпиленый файл, параметры загрузки оставляем по умолчанию, ждем пока пройдет автоанализ.
В итоге имеем примерно вот такое –

Т.к. у иды свой образ понимания происходящего то она не разворачивает библиотечные функции в итоге в ассемблерном файле их не будет! Поэтому заставим её делать это – тыкаем на участке ассемблерного кода и жмем View->UnhideAll.
Далее нам надо получить ассемблерный файл жмакаем File->produce File-> create Asm file. Теперь у нас есть ассемблерный листинг. Продолжаем…
Запускаем Pelles C , создаем пустой проект Smartphone и добавляем в него наш ассемблерный листинг, (Project -> add files to project).

Самые отважные могут попробовать скомпилировать ЭТО Smile, запускаем компиляцию Project-> Compile, и…… ахреневаем от количества ошибок и предупреждений компилятора, дааа так дело не пойдет. Смотрим на первую ошибку это объявление секции кода, IDA выдала удобочитаемый вид, который понятен человеку но не понятен компилятору
Пример:
Код:
   
AREA .text, CODE, READWRITE, ALIGN=4
; ORG 0x11000
CODE32

Приводим в вид понятный компилятору:
Код:

AREA .text, CODE
CODE32
Запускаем компиляцию снова, и… и опять мы завалены кучей ошибок….
Следующая ошибка кроется в вызове экспортируемой функции start:
Код:

EXPORT start
start

var_20      = -0x20 //
oldR4      = -0x1C
oldR5      = -0x18 //ругается на всю эту часть, ибо в секции кода размещены данные
oldR6      = -0x14 //точнее не данные а просто мусор :D
oldR7      = -0x10
oldR11      = -0xC
oldSP      = -8
oldLR      = -4 //

      MOV   R12, SP
      STMFD   SP!, {R4-R7,R11,R12,LR}
      ADD   R11, SP, #0x1C
      SUB   SP, SP,   #4
      MOV   R7, R0
      MOV   R6, R1
      MOV   R5, R2
      MOV   R4, R3
      BL   _cinit
      MOV   R3, R4      ; nShowCmd
      MOV   R2, R5      ; lpCmdLine
      MOV   R1, R6      ; hPrevInstance
      MOV   R0, R7      ; hInstance
      BL   WinMain
      MOV   R4, R0
      STR   R4, [R11,#var_20]
      B   loc_11088
; ---------------------------------------------------------------------------
      MOV   R4, R0
      BL   sub_1110C

Решаем эту проблему просто, выкидываем все смотрим код:
Код:

STR   R4, [R11,#var_20]
Заменим var_20 на 0x20, а остальную часть, где ругается можно выкинуть без проблем, итого имеем:
Код:

EXPORT start

start:
      MOV   R12, SP
      STMFD   SP!, {R4-R7,R11,R12,LR}
      ADD   R11, SP, #0x1C
      SUB   SP, SP, #4
      MOV   R7, R0
      MOV   R6, R1
      MOV   R5, R2
      MOV   R4, R3
      BL   _cinit
      MOV   R3, R4      ; nShowCmd
      MOV   R2, R5      ; lpCmdLine
      MOV   R1, R6      ; hPrevInstance
      MOV   R0, R7      ; hInstance
      BL   WinMain
      MOV   R4, R0
      STR   R4, [R11,#0x20]
      B   loc_11088
      MOV   R4, R0
      BL   sub_1110C
После start двоеточие стоит неспроста, ибо метки в асм компиляторе Pelles C требуют такого объявления, так что правим их везде по коду благо их не очень то и много…
Подправили, запускаем компиляцию и опять нас окружают ошибки, ох уж эта IDA….
Ошибка опять кроется в размещении мусора в секции кода, правим:
Код:


_cinit:               ; CODE XREF: start+20 p
STR   LR, [SP,#4]!
      LDR   R1, =unk_1409C
      LDR   R0, =unk_14098
      BL   _initterm
      LDR   R1, =unk_14094
      LDR   R0, =unk_14090
      LDMFD   SP!, {LR}
      B   _initterm
; End of function _cinit
Снова запускаем на компиляцию, и опять компиляция валится, на этот раз неправильно объявлена секция данных:
Код:

      AREA .pdata, DATA, READONLY, ALIGN=4
      ; ORG 0x12000
      DCD WinMain
      DCB    1
      DCB    8
      DCB    0
Правим:

Код:


AREA .pdata, DATA
      ; ORG 0x12000
      DCD WinMain
      DCB    1
      DCB    8
      DCB    0
      
Компилируем…
И опять вылет, опять неверное объявление секции данных правим также, как описано выше…
Опять проверяем, вылет получаем примерно тут:
Код:

AREA .data, DATA
; ORG 0x14000
aAsmdis      unicode   0, <ASmDIS>,0   ; DATA XREF: .text:lpCaption o
aTest_apps   unicode   0, <TEST_APPS>,0 ; DATA   XREF: .text:lpText o
Ассемблер Pelles C , не знает что такое unicode и поэтому говорит о неправильном синтаксе.
Правим:
Код:

AREA .data, DATA
      ; ORG 0x14000
aAsmdis   dcb "a",0,"s",0,"m",0,"d",0,"i",0,"s",0,0,0
aTest_apps   dcb "T",0,"E",0,"S",0,"T",0,"_",0,"A",0,"P",0,"S",0,0,0
Запускаем компиляцию и опять ошибки, да что за….
Смотрим теперь ругается на:
Код:

loc_111A4            ; CODE XREF: sub_1110C+30 j
      LDR   R1, =unk_140AC
      LDR   R0, =unk_140A8
      BL   _initterm
      CMP   R7, #0
      LDREQ   R2, =0xF000F7F8 ;здесь компилятор ругается
      MOVEQ   R1, R8
      MOVEQ   R0, #0x42
      MOVEQ   LR, PC
      MOVEQ   PC, R2
      LDMFD   SP!, {R4-R8,PC}
LDREQ компилятор не смог понять, и поэтому заменим на LDR
Код:

LDR   R2, =0xF000F7F8
Запускаем компиляцию и компилятор молча говорит – done , УРА компилится Smile
Теперь попытаемся слинковать все в кучу, жмакаем Ctrl + B, вся радость опять заканчивается , снова ошибка, чешем репу…. Вспоминаем что забыли объявить точку входа. Жмем Project -> Project Options закладка linker, ищем поле ввода entry point и пишем туда start. Идем покурить Smile. Жмем опять Ctrl+B, иии… и все собирается Smile

Запускаем на девайсе и радуемся, а если не собирается, разбираемся, почему не собирается по пунктам описанным ранее.
Грабли на которые я наступал – сначала мусор из секции кода я попробовал объявить как данные, но потом заметил, что компилятор автоматически не отделяет код от данных и поэтому начинается выполнение данных что приводит к непредсказуемым результатам, а скорее всего к вылету проги на смарте с ошибкой Illegal instruction. Также стоит обратить внимание на многие приколы от иды со структурами, при получении полного ассемблерного листинга, она иногда такое вытворяет, что разобраться без бутылки чего нить крепкого не получится Smile. Данное руководство это не метод постоянного реверсинга программ, это скорее просто тест для подтверждения реальности обратной декомпиляции программ в рабочий код, но и этот метод бывает не лишним допустим я таким методом расковыривал драйвер подсветки своего смарта, после таких извращений он собрался назад и работал. Этот подход на сложном коде требует много усилий, и не годится для крупных проектов, но для различной мелочи особенно по работе с железками весьма неплох.
Вернуться к началу Перейти вниз
Посмотреть профиль
Zorn



Количество сообщений : 45
Дата регистрации : 2007-05-28

СообщениеТема: Re: Садомазахизм - Windows Mobile   Чт 21 Авг - 21:22

Цитата :
Решаем эту проблему просто, выкидываем все смотрим код:
Код:
 STR  R4, [R11,#var_20]

Заменим var_20 на 0x20
Наверное все таки -0x20
Цитата :

Смотрим теперь ругается на:
Код:
loc_111A4            ; CODE XREF: sub_1110C+30 j
      LDR  R1, =unk_140AC
      LDR  R0, =unk_140A8
      BL  _initterm
      CMP  R7, #0
      LDREQ  R2, =0xF000F7F8 ;здесь компилятор ругается
      MOVEQ  R1, R8
      MOVEQ  R0, #0x42
      MOVEQ  LR, PC
      MOVEQ  PC, R2
      LDMFD  SP!, {R4-R8,PC}
LDREQ компилятор не смог понять, и поэтому заменим на LDR
Тут наверное правильней будет
Код:
loc_111A4            ; CODE XREF: sub_1110C+30 j
      LDR  R1, =unk_140AC
      LDR  R0, =unk_140A8
      BL  _initterm
      CMP  R7, #0
      BNE exit
      LDR  R2, =0xF000F7F8 ;здесь компилятор ругался
      MOV  R1, R8
      MOV  R0, #0x42
      MOV  LR, PC
      MOV  PC, R2
exit:
      LDMFD  SP!, {R4-R8,PC}
Вернуться к началу Перейти вниз
Посмотреть профиль
Hex

avatar

Количество сообщений : 397
Возраст : 35
Дата регистрации : 2006-07-12

СообщениеТема: Re: Садомазахизм - Windows Mobile   Пт 22 Авг - 0:43

Я подобным образом мучался пытаясь собрать х86 асм генеренный идой под masm. Потому что ильфак любит синтаксис TASM.

Вообще-то можно переключать синтаксис вот тут:

Можешь попробовать переключиться с Generic Assembler на GNU, возможно гнушный синтаксис больше подойдет для Pelles C

p.s. очень интересно, этот Generic Assembler - это на самом деле синтаксис какого компилера? ADS?
Вернуться к началу Перейти вниз
Посмотреть профиль
neonix



Количество сообщений : 39
Дата регистрации : 2008-08-01

СообщениеТема: Re: Садомазахизм - Windows Mobile   Пт 22 Авг - 1:14

Очень сомневаюсь что подойдет, у асма гнушного, извращенческий синтаксис Smile Кстати еще небольшое замечание по компилятору pelles c , он не понимает movl/movls их заменять надо на mov.
Вернуться к началу Перейти вниз
Посмотреть профиль
Hex

avatar

Количество сообщений : 397
Возраст : 35
Дата регистрации : 2006-07-12

СообщениеТема: Re: Садомазахизм - Windows Mobile   Пт 22 Авг - 2:33

neonix пишет:
Очень сомневаюсь что подойдет, у асма гнушного, извращенческий синтаксис Smile Кстати еще небольшое замечание по компилятору pelles c , он не понимает movl/movls их заменять надо на mov.

MOVL - это макрос. Перед генерацией ассемблера, надо вырубать отображение макросов:


Последний раз редактировалось: Hex (Пт 22 Авг - 2:37), всего редактировалось 1 раз(а)
Вернуться к началу Перейти вниз
Посмотреть профиль
neonix



Количество сообщений : 39
Дата регистрации : 2008-08-01

СообщениеТема: Re: Садомазахизм - Windows Mobile   Пт 22 Авг - 2:35

Я знаю что это макросы, но они какбы и не мешают Smile заменить в коде - раз плюнуть Smile Но на заметку возьму, спасиб!
Вернуться к началу Перейти вниз
Посмотреть профиль
neonix



Количество сообщений : 39
Дата регистрации : 2008-08-01

СообщениеТема: Re: Садомазахизм - Windows Mobile   Пт 22 Авг - 15:44

Глянул токачто в IDA 5.2 выбор ассемблера и увидел там помимо generic assembler и gnu assembler - Assembler for ADS Значит generic это не синтаксис ADS, а не весть знает что Smile
Вернуться к началу Перейти вниз
Посмотреть профиль
Спонсируемый контент




СообщениеТема: Re: Садомазахизм - Windows Mobile   

Вернуться к началу Перейти вниз
 
Садомазахизм - Windows Mobile
Предыдущая тема Следующая тема Вернуться к началу 
Страница 1 из 1
 Похожие темы
-
» Полезные программы
» Воровство паролей и логинов на mail.ru

Права доступа к этому форуму:Вы не можете отвечать на сообщения
eXTracted INternals :: Cтатьи :: Mobile and Embedded-
Перейти: