· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.RESEARCH —› Получить исходный код.

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Мар 20, 2004 21:25:02

Здравствуйте!
Я задался несколько странным вопросом: насколько реально получить КАЧЕСВТЕННЫЙ исходный код программы? Случай конкретный: программа небольшая, написана на ассемблере (TASM32), никакими пакерами не была "попорчена". Не подскажите, какую программу можно использовать для получения приемлимого кода, чтобы с небольшими исправлениями его можно было бы привести к "нормальному" виду и снова скомпилировать? Конечно, первым ответом будет IDA, но у меня только незарегиная версия и сохранять в asm не получается. (А так как спрашивать про взлом на форуме запрещено, то я спрашиваю про аналогичные
доступные и, главное, небольшие утилиты для получения такого исходного кода). Или возможность получения приемлимого кода исключена? Было бы интересно услышать мнение ваше мнение.
Заранее спасибо!
1990


Дата: Мар 21, 2004 00:12:01

тогда надо скачать нормальную иду и попробовать еще раз.


Дата: Мар 21, 2004 01:28:50

Хмм.., Ида конечно рулит, для анализа, но не для получения исходного кода для последующей компиляции.
Я использую Olly, Ctrl+C - рулит, + IDA PRO для подглядывания за переменными и структурами.
В любом случае ручной работы хватает ;-)


Дата: Мар 22, 2004 00:31:11

[но не для получения исходного кода для последующей компиляции]

это почему же ? чем тебе егойный синтаксис асма не нравится? :)


Дата: Мар 22, 2004 05:18:47

чем тебе егойный синтаксис асма не нравится? :)

Много лишнего мешающего на пути к компиляции ;-)

В листинге Olly нужно всего лишь поправить числовые константы(добавить h) и имена API, объявить глобальные переменные и структуры, ну и добавить указания чтоб компилилось без пролога и эпилога, и можно сувать в masm32 :-)
Да, важно, в данном случае нужно юзать Olly под 2k/XP, а то в 98-й он имена API неправильно показывает ;-)


Дата: Мар 22, 2004 10:13:23

Что-то почерпнул, спасибо! Сейчас буду получать исходники ;)


Дата: Мар 22, 2004 12:51:34

Asterix
Поясните мне, пожалуйста, каким образом можно получить листинг в OllyDBG? Что-то комбинация Ctrl + С, мне кажется, обозначает компирование. Может быть есть какие-нибудь плагины для создания качественного листинга.
Кстати, я тут в инструментах нашёл прикольный инструмент -pdasm. Правда он пока ещё не делает asm listing, но, по словам автора, асм source будет очень лизким к реальности.
А пока - olly.


Дата: Мар 22, 2004 15:34:27

infern0 Пожалйста дай мне свое рабоее мыло или аську!!!


Дата: Мар 23, 2004 20:25:15

Asterix
Откликнись... Как же в olly получить исходник? См. выше.


Дата: Мар 23, 2004 22:04:45

Я же говорил, вручную Ctrl+C или в файл если получиться, хоть в Ида хоть в Olly.
Например имеем в Olly такую процедуру:
004010C0  /$ 55             PUSH EBP
004010C1  |. 8BEC           MOV EBP,ESP
004010C3  |. 83C4 FC        ADD ESP,-4
004010C6  |. 8D45 FC        LEA EAX,DWORD PTR SS:[EBP-4]
004010C9  |. 50             PUSH EAX                                 ; /pOldProtect
004010CA  |. 6A 40          PUSH 40                                  ; |NewProtect = PAGE_EXECUTE_READWRITE
004010CC  |. 6A 01          PUSH 1                                   ; |Size = 1
004010CE  |. FF75 0C        PUSH DWORD PTR SS:[EBP+C]                ; |Address
004010D1  |. FF75 08        PUSH DWORD PTR SS:[EBP+8]                ; |hProcess
004010D4  |. FF15 3C204000  CALL DWORD PTR DS:[<&kernel32.VirtualPro>; \VirtualProtectEx
004010DA  |. 6A 00          PUSH 0                                   ; /pBytesWritten = NULL
004010DC  |. 6A 01          PUSH 1                                   ; |BytesToWrite = 1
004010DE  |. FF75 10        PUSH DWORD PTR SS:[EBP+10]               ; |Buffer
004010E1  |. FF75 0C        PUSH DWORD PTR SS:[EBP+C]                ; |Address
004010E4  |. FF75 08        PUSH DWORD PTR SS:[EBP+8]                ; |hProcess
004010E7  |. FF15 48204000  CALL DWORD PTR DS:[<&kernel32.WriteProce>; \WriteProcessMemory
004010ED  |. 85C0           TEST EAX,EAX
004010EF  |. 74 18          JE SHORT TRASER.00401109
004010F1  |. 8D45 FC        LEA EAX,DWORD PTR SS:[EBP-4]
004010F4  |. 50             PUSH EAX                                 ; /pOldProtect
004010F5  |. FF75 FC        PUSH DWORD PTR SS:[EBP-4]                ; |NewProtect
004010F8  |. 6A 01          PUSH 1                                   ; |Size = 1
004010FA  |. FF75 0C        PUSH DWORD PTR SS:[EBP+C]                ; |Address
004010FD  |. FF75 08        PUSH DWORD PTR SS:[EBP+8]                ; |hProcess
00401100  |. FF15 3C204000  CALL DWORD PTR DS:[<&kernel32.VirtualPro>; \VirtualProtectEx
00401106  |. 33C0           XOR EAX,EAX
00401108  |. 40             INC EAX
00401109  |> C9             LEAVE
0040110A  \. C2 0C00        RETN 0C


Правим вручную и получаем готовый к компиляции в masm32 исходник.
_004010C0 proc
option PROLOGUE:NONE
option EPILOGUE:NONE
   PUSH EBP
   MOV EBP,ESP
   ADD ESP,-4
   LEA EAX,DWORD PTR SS:[EBP-4]
   PUSH EAX                                 ; /pOldProtect
   PUSH 040h                                ; |NewProtect = PAGE_EXECUTE_READWRITE
   PUSH 1                                   ; |Size = 1
   PUSH DWORD PTR SS:[EBP+00Ch]             ; |Address
   PUSH DWORD PTR SS:[EBP+8]                ; |hProcess
   CALL VirtualProtectEx
   PUSH 0                                   ; /pBytesWritten = NULL
   PUSH 1                                   ; |BytesToWrite = 1
   PUSH DWORD PTR SS:[EBP+010h]             ; |Buffer
   PUSH DWORD PTR SS:[EBP+00Ch]             ; |Address
   PUSH DWORD PTR SS:[EBP+8]                ; |hProcess
   CALL WriteProcessMemory
   TEST EAX,EAX
   JE SHORT @00401109
   LEA EAX,DWORD PTR SS:[EBP-4]
   PUSH EAX                                 ; /pOldProtect
   PUSH DWORD PTR SS:[EBP-4]                ; |NewProtect
   PUSH 1                                   ; |Size = 1
   PUSH DWORD PTR SS:[EBP+00Ch]             ; |Address
   PUSH DWORD PTR SS:[EBP+8]                ; |hProcess
   CALL VirtualProtectEx
   XOR EAX,EAX
   INC EAX
@00401109:
   LEAVE
   RETN 00Ch
option PROLOGUE:PROLOGUEDEF
option EPILOGUE:EPILOGUEDEF
_004010C0 endp


В случае использования листинга IDA вручную править тоже придётся...


Дата: Мар 23, 2004 23:05:18

Asterix
Большое спасибо!


Дата: Мар 24, 2004 09:34:35

Если компилить листинг иды тасмом, то ничего не нужно править.


Дата: Мар 24, 2004 10:13:18

Здается мне, тут можно еще подправить чуток
(вначале и ниже подобным образом..)
   ADD ESP,-4     ;;  ==  PUSH ESP  ;;  или другой регистр

   LEA EAX,DWORD PTR SS:[EBP-4]  ;; 2 строки ==  PUSH ESP
   PUSH EAX   


А это совсем убрать
   XOR EAX,EAX
   INC EAX


Asterix
А чего там за компилятор такой? ^^ ;-)


Дата: Мар 24, 2004 11:29:58

S_T_A_S_

Тут не нужна оптимизация, нужно точное соответствие изначальному коду, иначе при большом количестве рипаемого кода можно так никогда и не дорипать ;-)

xor eax, eax
inc eax
это нужно! А вдруг VirtualProtectEx вернёт 0, хотя основная работа процедуры благополучно выполнена, т.е. WriteProcessMemory прошло успешно :-)
Хотя логичнее всё-таки сохранить в стеке то что вернула
WriteProcessMemory и восстановить в eax при выходе из функции.

Компилятор ml.exe ;-)


Дата: Мар 24, 2004 12:52:14

Хорошо, а где бы скачать полную ИДУ? А? Или это провакационный вопрос? Если провокация - прошу простить! У меня демо версия и листинги не выдаёт... ;-/ А так бы хотелось...

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.075