![]() |
Расширение функциональности OllyDbg
Расширение функциональности OllyDbg [ intro ] Итак, начнём. Наверное каждый кто исследовал сложную/большую программу, сталкивался с проблемой запоминания адресов, подсчёта некоторых констант. Для сохранения адресов и коментариев к некоторым кускам кода, многие пользуються обычным Блокнотом (как и я). Что ни говори, без него уже никуда. Тут возникает проблема его вызова. Как то лень постоянно открывать Пуск > etc. Многие возразят: ‘А разве, Win+R > notepad, не достаточно быстро?’. Да это быстро/удобно, но всё равно не совсем то. Хорошо бы создать дополнительное меню “tools” в OllyDbg, где бы и находились итемы часто используемых прог. Блокнот, Калькулятор etc. Но без хирургического вмешательства этого не достичь. Придется OllyDbg “лечь под нож”. На данную статью меня вдохновила статья из второго номера журнала ARTeam и отсутсвие подобных на великом и могучем. [ tools ] Для этого нам понадобятся: Restorator 2005 – редактор ресурсов Shadow - я выбрал эту модификацию OllyDbg (по вкусу) MASM – компилятор [Правка ресурсов] Windows-программа, помимо исполняемого кода, содержит ресурсы: иконки, диалоги, битмапы, музыку. Только ресурсы не преобразовываются как исполняемый код. И для исправления ресурсов намного удобнее использовать специальные программы. Для этого я выбрал Restorator. Открываем Shadow.exe в Restorator 2005. Перед нами папки ресурсов: диалоги, картинки, меню. Нам естественно нужна папка Menu. Заходим в неё. Выбираем MAINMENU. Я решил засунуть “tools” между “Options”и “Windows”. Поэтому пишем следующее: Код:
POPUP "&Tools"4001d – 0FA1h – это ID пункта, будет отсылаться вместе с сообщением. Именно этот ID даёт программе понять, что от неё хотят (точнее понять какой пункт выбран). Теперь закрываем редактор, попутно разрешая сохранить изменеия и бэкап. Открываем Shadow.exe ! Так... Меню создали. Теперь нужно сделать так, чтобы OllyDbg обрабатывала сообщения этих итемов. [Цикл сообщений] Когда пользователь выбирает пункт меню, Windows отсылает программе сообщение WM_COMMAND, которое обрабатывается в цикле сообщений. Каждый, кто программировал под Windows, писал следующие строки: Код:
.WHILE TRUEИтак отрываем файл Shadow.exe в другой Olly[Dbg|ICE|Shadow]. Мы попадём на EP. Код:
00401000 > $ /EB 10 JMP SHORT Shadow.00401012Код:
004323D4 /$ 55 PUSH EBP004323ED |. CMP EAX,111 ; Switch (cases 1..478) WM_COMMAND equ 111h Идём по F8 до строки по адресу 004323ED. Далее в меню выбираем “Go to”. Дальше, естественно, “Case 111 (WM_COMMAND)”. И мы здесь: Код:
00433818 |> \8BCB MOV ECX,EBX ; Case 111 (WM_COMMAND) of switch 004323EDКод:
00433A1A |. /E9 77070000 JMP Shadow.00434196Теперь нам следует подыскать свободное место в программе (для внедрения некоторого кода). Как всегда место нашлось в оверлее. Код:
004AF670 00 DB 00Код:
004AF670 > \60 PUSHADКод:
004AF689 .^ E9 084BF8FF JMP Shadow_-.00434196Заметка: ------------------------------- CALL <JMP.&KERNEL32.LoadLibraryA> и CALL <JMP.&KERNEL32.GetProcAddress> - не тупо вбиты как “call LoadLibraryA”, “call GetProcAddress”. А как “CALL 004AF138”, “CALL 004AF090”. Код:
004AF138 $- FF25 B4D35000 JMP DWORD PTR DS:[<&KERNEL32.LoadLibrary>; kernel32.LoadLibraryA-------------------------------- Теперь сохраним пропатченный файл. Для этого в меню выбираем “Copy to executable” > “All modifications” > “Copy all”. В открывшемся окне выбираем “Save file” и сохраняем. [Пишем dll] Начнём со скелета DLL. Код:
.386 Соответсвенно ESP+14h – это содержимое edx. Только когда управление попадёт в нашу функцию, в стек войдёт ещё и адрес возврата. Тогда edx будет по ESP+18h. В итоге у меня получился следующий файл Код:
.386 [Заключение] Теперь можно смело расширять возможности любой проги. Менять настройки под себя. Удобно! +) PS. Нужно будет добавить кнопку соединения с инт0рнетом)))) |
хороший пример эксплуатации идеи дероко, респект )
ЗЫ: если преследовать именно идею записи адрессов и констант, то есть ку4а плагинов (нопремер оллипад) ;) |
Отлично, многим будет познавательно, вот только LoadLibraryA и GetProcAddress, лучше не вставлять в основной цикл окна, это замедлит обработку сообщений, в данном случае от меню, так как они выполняются не так уж и быстро, их лучше вызвать при старте, и сохранить куда нибудь этот адрес функции или в крайнем случае сделать проверку, есть ли у нас уже этот адрес и если нет тогда выполнить.
|
OllyPad - это круто, но не очень. Пусть афтар дорабатывает. Блокнот всётаки пока удобней. Хотя если нужно сделать чтот побыстрому, то OllyPad самое то.
LoadLibraryA и GetProcAddress - несуть. Это так.. пробный вариант.. Когда сделал, было лень что то менять)) |
taha
ну тут можно и не попасть на обработку wm_command. Например, в win2000 все будет хорошо, а в winXP я попадаю на код 7E3689F1 > 8BFF MOV EDI,EDI Так что тут лучше юзать бряк на DefWindowProcA. (Хотя и не самый лучший вариант). А вот как найти "переход в случаее если обработка полученного сообщения не предусмотренно" - это я не смог. можешь подсказать как искать это переход? |
| Время: 22:55 |