eXTracted INternals

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

Поделиться | 
 

 Реассемблирование кода

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

avatar

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

СообщениеТема: Реассемблирование кода   Пт 25 Авг - 1:18

В основном найдешь нужный кусочек кода в ассемблерном листинге иды и так хочется, чтобы сделав минимум коректив, его заюзать в своей проге. Благо, что в иде есть фича называемая "Create ASM file".

Казалось бы раз-два и готов ассемблерный листинг функции. Но только вот впихивать его в свою прогу не хочется, хочется просто вызвать эту одну-единственную функцию. И не видеть всего этого ассемблерного кошмара. Чтобы такое сделать нужно скомпилировать полученый листинг. На выходе получится obj, который можно запросто прилинковать, а вызывать функцию используя extern.

Ща покажу на примере как это все делается.
Для примера берем как обычно notepad.exe и попробуем получить код вот такой функции:


Код:

.text:010048A3 FindTabSpace  proc near             
.text:010048A3
.text:010048A3 pText          = dword ptr  4
.text:010048A3
.text:010048A3                mov    eax, [esp+pText]
.text:010048A7
.text:010048A7 loc_10048A7:                            ; CODE XREF: FindTabSpace+15 j
.text:010048A7                mov    cx, [eax]
.text:010048AA                cmp    cx, 20h
.text:010048AE                jz      short loc_10048B6
.text:010048B0                cmp    cx, 9
.text:010048B4                jnz    short locret_10048BA
.text:010048B6
.text:010048B6 loc_10048B6:                            ; CODE XREF: FindTabSpace+B j
.text:010048B6                inc    eax
.text:010048B7                inc    eax
.text:010048B8                jmp    short loc_10048A7
.text:010048BA ; ---------------------------------------------------------------------------
.text:010048BA
.text:010048BA locret_10048BA:                        ; CODE XREF: FindTabSpace+11 j
.text:010048BA                retn    4
.text:010048BA FindTabSpace  endp


Функция ищет первый "не белый" символ. Если встречен пробел или табуляция, идет дальше.
Выделяем эту функцию, заходим в "File"-"Produce File"-"Create ASM file" и сохраням под именем 1.asm.
В файле 1.asm будет ассемблерный текст:


Код:

; ЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫ S U B R O U T I N E ЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫ

FindTabSpaceproc near; CODE XREF: sub_10048BD+6B p

; sub_1004A5E+2A p ...


pText= dwordptr  4

moveax, [esp+pText]

loc_10048A7:; CODE XREF: FindTabSpace+15 j

mov cx, [eax]
cmp cx, 20h
jz short loc_10048B6
cmp cx, 9
jnz short locret_10048BA

loc_10048B6:; CODE XREF: FindTabSpace+B j

inc eax
inc eax
jmp short loc_10048A7

; ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

locret_10048BA:; CODE XREF: FindTabSpace+11 j
retn 4

FindTabSpaceendp

Теперь надо как-то скомпилить.

Я юзаю перекомпиленый код в VC. Соответственно юзаю идущий с ним MASM. Тем кто любит продукты борланда нужен будет TASM. Т.к. obj-и от MASM борландовские линкеры не хавают. Или придется юзать OMF2COFF, она кажись идет со всеми борландовскими компилерами. Это тулза для конвертирования из микрософтовского формата в борландовский.

Чтоб скомпилить в obj юзаю вот такую командную строку:
ML.EXE /coff /Fl /Sf /I. /Zi /c /Cp /Zp1 /Zm /Ta 1.asm

Но перед тем как компилить ассемблерный код полученый из IDA. Нужно сделать чтобы он был все таки программой а не просто листингом.
вот так:



Код:

.386
.MODEL flat,C
_text          segment para public 'CODE' use32
                    assume cs:_text
                    assume es:nothing, ss:nothing, ds:nothing, fs:nothing, gs:nothing


public FindTabSpace

FindTabSpaceproc near

   pText= dword ptr  4
   mov eax, [esp+pText]

loc_10048A7:

   mov cx, [eax]
   cmp cx, 20h
   jz short loc_10048B6
   cmp cx, 9
   jnz short locret_10048BA


loc_10048B6:

   inc eax
   inc eax
   jmp short loc_10048A7

locret_10048BA:

   retn 4

FindTabSpaceendp

_text ends

end


В общем все согласно синтаксису ассемблера MASM. Компилим... получаем 1.obj.

Пытаемся использовать полученную функцию
Добавляем наш 1.obj в проект (Project Properties - Linker - Input - Additional Dependencies).
Теперь нужно организовать вызов такой функции. Сначала нужно определить тип функции и тип ее параметров. Это stdcall функция так как она принимает 1 аргумент но указатель стека восстанавливает сама. Дальше о типе ее аргументов она получает указатель на wchar_t т.к. при проверке каждого следующего символа указатель на строку увеличивается на 2. Так как функции обычно возвращают результат в EAX можно сказать, что она возвращает указатель на wchar_t. Соответственно, прототип выглядит вот так:

extern "C" wchar_t* __stdcall FindTabSpace(wchar_t * pText);

Пробуем вызвать:
Код:

int _tmain(int argc, _TCHAR* argv[])
{
   wchar_t * s=L" \t Hello world";
   wprintf(s);
   s=FindTabSpace(s);
   wprintf(s);
   return 0;
}
Компилируется, но линкер выдает ошибку:

Test.obj : error LNK2019: unresolved external symbol _FindTabSpace@4 referenced in function _main
Test.exe : fatal error LNK1120: 1 unresolved externals

Проблема в том, что компилятор считает себя самым умным, и применяет манглер имен для того, чтобы решать проблему существования нескольких функций с разными аргументами и одинаковыми именами(даже если их и нет). Поэтому он считает что наша FindTabSpace, раз уж назвалась __stdcall должна иметь имя _FindTabSpace@4. Ну что ж, спорить с ним бесполезно. Проще исправить ассемблер:



Код:

.386

.MODEL flat,C

_text          segment para public 'CODE' use32

                    assume cs:_text

                    assume es:nothing, ss:nothing, ds:nothing, fs:nothing, gs:nothing


public syscall _FindTabSpace@4


_FindTabSpace@4proc near


   pText= dwordptr  4
   mov eax, [esp+pText]

loc_10048A7:

   mov cx, [eax]
   cmp cx, 20h
   jz short loc_10048B6
   cmp cx, 9
   jnz short locret_10048BA

loc_10048B6:

   inc eax
   inc eax
   jmps hort loc_10048A7

locret_10048BA:

   retn 4

_FindTabSpace@4endp

_text ends

end



снова компилим ассемблер и заменяем наш 1.obj на новый. Компилим сишную прогу, запускаем - работает:
Код:

        Hello world
Hello world


Вот такой вот минимальный пример. Но есть еще куча особенностей связаных с выдиранием методов объектов, выдиранием кода из програм написаных на Delphi/BCB.

P.S. IDA генерирует ассемблерный листинг для TASM, поэтому для компиляции в MASM некоторые вещи в листинге приходится править для соблюдения синтаксиса
Вернуться к началу Перейти вниз
Посмотреть профиль
wl



Количество сообщений : 127
Дата регистрации : 2007-02-15

СообщениеТема: Re: Реассемблирование кода   Чт 4 Окт - 4:58

между прочим, такое же можно провернуть и для Symbian ARM.
-
более того, если закомпилить какую-то функцию, не использующую SymbianOS - вызовов, и прилинковав к проекту для PocketPC в Visual Studio 2005, то можно будет отлаживать прямо на эмуляторе. Выглядит правдо это коряво немного, функции не разделены, просто сплошной код, так как нету отладочной инфы
Вернуться к началу Перейти вниз
Посмотреть профиль
Hex

avatar

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

СообщениеТема: Re: Реассемблирование кода   Чт 4 Окт - 5:41

Естественно Smile Я так код старта системы из готовых рамлоадеров выдерал, когда писал свои Smile
Вернуться к началу Перейти вниз
Посмотреть профиль
Спонсируемый контент




СообщениеТема: Re: Реассемблирование кода   

Вернуться к началу Перейти вниз
 
Реассемблирование кода
Предыдущая тема Следующая тема Вернуться к началу 
Страница 1 из 1

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