Как отлаживать код незнакомых приложений?
… легко постукивая кувалдой.
Вопрос из почты:
Я пытаюсь приспособить windbg не для отладки, а для реверсинга незнакомых приложений, и постоянно упираюсь в то, что для удобной работы нужны символы, иначе windbg (в юзермоде, конечно) ничем не сильнее того же OllyDbg. Но, я надеюсь, что не все так плохо с этим отладчиком, и это у меня руки кривые.
Если символьной информации нет, то частично заменить её можно только хорошенько проштудировав бинарный код. WinDbg таким, вроде бы, не занимается. В идеальном случае хотелось бы, чтобы отладчик умел все, что умеет IDA Pro и при этом имел расширяемость как у WinDbg. Хотя если судить по сайту, последние версии IDA имеют встроенный отладчик.
Я не в курсе насколько хорошо OllyDbg анализирует код и насколько это помогает при отладке. Если он заметно удобнее WinDbg, то логичнее всего было бы им и пользоваться.
Не могли бы Вы мне ответить на простенький вопрос, как корректно брякнуться на энтрипойнт приложения которому нет символов? Без танцев с бубном. Может, плугин какой есть?
Корректно – вот так:
bp <address> или ba <address>
Адрес в общем случае без танцев с бубном не находится, даже в случае IDA. Обычно поиски начинаются с крупиц информации из шагов для воспроизведения сценария. Программа обращается к определенному ключу в реестре? Ставим точку останова на RegCreateKeyEx/RegOpenKeyEx. Происходит определённое исключение? Ловим именно это исключение. После нескольких итераций находятся конкретные места в коде приложения, в которых выполняются интересующие нас действия.
В общем, ложки серебряной пули не существует.
Оригинальная энтрипойнт есть в PE, если конечно не используются крипторы и пакеры. Но это будет энтрипойнт рантайм либы, обычно не состваляет труда из него выйти на main апликухи – если это конечно обязательно надо;)
к примеру notepad:
Системный бряк лоадера
ntdll!DbgBreakPoint:
7c90120e cc int 3
0:000> !dlls
0x001a1ee0: C:\WINDOWS\notepad.exe
Base 0×01000000 EntryPoint 0x0100739d Size 0×00014000
Flags 0×00005000 LoadCount 0x0000ffff TlsIndex 0×00000000
LDRP_LOAD_IN_PROGRESS
LDRP_ENTRY_PROCESSED
0x001a1f48: C:\WINDOWS\system32\ntdll.dll
Base 0x7c900000 EntryPoint 0x7c912c48 Size 0x000b2000
Flags 0×00085004 LoadCount 0x0000ffff TlsIndex 0×00000000
LDRP_IMAGE_DLL
LDRP_LOAD_IN_PROGRESS
LDRP_ENTRY_PROCESSED
LDRP_PROCESS_ATTACH_CALLED
0x001a2010: C:\WINDOWS\system32\kernel32.dll
Base 0x7c800000 EntryPoint 0x7c80b64e Size 0x000f6000
Flags 0×00085004 LoadCount 0x0000ffff TlsIndex 0×00000000
LDRP_IMAGE_DLL
LDRP_LOAD_IN_PROGRESS
LDRP_ENTRY_PROCESSED
LDRP_PROCESS_ATTACH_CALLED
…. и т.д.
uf /c /D 0x0100739d
notepad!WinMainCRTStartup+0×7 (010073a4):
call to notepad!_SEH_prolog (01007568)
notepad!WinMainCRTStartup+0×15 (010073b2):
unresolvable call: call edi
notepad!WinMainCRTStartup+0x6e (0100740b):
call to msvcrt!__set_app_type (77c3537c)
notepad!WinMainCRTStartup+0×83 (01007420):
call to msvcrt!__p__fmode (77c1f1db)
notepad!WinMainCRTStartup+0×91 (0100742e):
call to msvcrt!__p__commode (77c1f1a4)
notepad!WinMainCRTStartup+0xab (01007448):
call to notepad!_matherr (010075f4)
notepad!WinMainCRTStartup+0xbd (0100745a):
call to msvcrt!__setusermatherr (77c4d695)
notepad!WinMainCRTStartup+0xc4 (01007461):
call to notepad!_setdefaultprecision (010075dd)
notepad!WinMainCRTStartup+0xd3 (01007470):
call to notepad!_initterm (010075d2)
notepad!WinMainCRTStartup+0xf6 (01007493):
call to msvcrt!__getmainargs (77c1eeeb)
notepad!WinMainCRTStartup+0×109 (010074a6):
call to notepad!_initterm (010075d2)
notepad!WinMainCRTStartup+0×148 (010074e5):
call to kernel32!GetStartupInfoA (7c801ef2)
notepad!WinMainCRTStartup+0x16c (01007509):
unresolvable call: call edi
notepad!WinMainCRTStartup+0x16f (0100750c):
call to notepad!WinMain (01002936) bp 0×01002936
Готово
в IDA неплохая подборка сигнатур рантаймов – обычно проблем с этим нет
Ну во-первых можно в IDA сгенерировать map-файл, а затем загрузить его в Windbg при помощи плагина(http://www.nynaeve.net/?p=94). Во-вторых в IDA последних версий(5.4) содержить 9 модулей отладчиков, в том числе и WinDbg(http://hexblog.com/2009/02/ida_pro_has_9_debugger_modules.html)
а скажите пожалуйста, какие отладочные средства и техники нужно использовать для локализации следующего бага:
win2008 sp2.
юзер с двумя раскладками: lv и ru. lv по дефолту.
при логине в консоль всё прекрасно.
при логине удалённо — иногда имеем lv/en. юзер паникует.
Вообще-то имхо имелось в виду останов на комманде по адресу IMAGE_OPTIONAL_HEADER::AddressOfEntryPoint, вот это точно в windbg как-то нормально не реализуется (та же ollydbg ставит там бряк и останов производится без лишних движений; для softice есть загрузчик, к-рый тоже делает бряк на EP, иногда правда глючит).
Ну вот kukuruku сверху написал один из возможных вариантов:
Ну тогда вообще счастье практически за углом.
Нужно только купить IDA посвежее.
Кстати хотел спросить, а зачем нужна именно точка входа? Я вот задумался и понял, что мне туда ставить точку останова не приходилось ни разу. Просто потому, что если нужно остановить выполнение в самом начале есть debugger breakpoint, а если нужно остановиться в середине, то подцепиться на тот же RegCreateKeyEx горазно удобнее, чем трассировать все от начала программы.