Home > itblogs > Как отлаживать код незнакомых приложений?

Как отлаживать код незнакомых приложений?

May 17th, 2009

… легко постукивая кувалдой.

Вопрос из почты:

Я пытаюсь приспособить windbg не для отладки, а для реверсинга незнакомых приложений, и постоянно упираюсь в то, что для удобной работы нужны символы, иначе windbg (в юзермоде, конечно) ничем не сильнее того же OllyDbg. Но, я надеюсь, что не все так плохо с этим отладчиком, и это у меня руки кривые.

Если символьной информации нет, то частично заменить её можно только хорошенько проштудировав бинарный код. WinDbg таким, вроде бы, не занимается. В идеальном случае хотелось бы, чтобы отладчик умел все, что умеет IDA Pro и при этом имел расширяемость как у WinDbg. Хотя если судить по сайту, последние версии IDA имеют встроенный отладчик.

Я не в курсе насколько хорошо OllyDbg анализирует код и насколько это помогает при отладке. Если он заметно удобнее WinDbg, то логичнее всего было бы им и пользоваться.

Не могли бы Вы мне ответить на простенький вопрос, как корректно брякнуться на энтрипойнт приложения которому нет символов? Без танцев с бубном. Может, плугин какой есть?

Корректно – вот так: ;-)

bp <address> или ba <address>

Адрес в общем случае без танцев с бубном не находится, даже в случае IDA. Обычно поиски начинаются с крупиц информации из шагов для воспроизведения сценария. Программа обращается к определенному ключу в реестре? Ставим точку останова на RegCreateKeyEx/RegOpenKeyEx. Происходит определённое исключение? Ловим именно это исключение. После нескольких итераций находятся конкретные места в коде приложения, в которых выполняются интересующие нас действия.

В общем, ложки серебряной пули не существует.

  1. kukuruku
    May 17th, 2009 at 23:36 | #1

    Оригинальная энтрипойнт есть в 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 неплохая подборка сигнатур рантаймов – обычно проблем с этим нет

  2. May 18th, 2009 at 01:41 | #2

    Ну во-первых можно в 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)

  3. zg
    May 18th, 2009 at 02:05 | #3

    а скажите пожалуйста, какие отладочные средства и техники нужно использовать для локализации следующего бага:
    win2008 sp2.
    юзер с двумя раскладками: lv и ru. lv по дефолту.
    при логине в консоль всё прекрасно.
    при логине удалённо — иногда имеем lv/en. юзер паникует.

  4. Anonymous
    May 18th, 2009 at 03:23 | #4

    Вообще-то имхо имелось в виду останов на комманде по адресу IMAGE_OPTIONAL_HEADER::AddressOfEntryPoint, вот это точно в windbg как-то нормально не реализуется (та же ollydbg ставит там бряк и останов производится без лишних движений; для softice есть загрузчик, к-рый тоже делает бряк на EP, иногда правда глючит).

    • May 18th, 2009 at 06:00 | #5

      Anonymous :
      Вообще-то имхо имелось в виду останов на комманде по адресу IMAGE_OPTIONAL_HEADER::AddressOfEntryPoint, вот это точно в windbg как-то нормально не реализуется (та же ollydbg ставит там бряк и останов производится без лишних движений; для softice есть загрузчик, к-рый тоже делает бряк на EP, иногда правда глючит).

      Ну вот kukuruku сверху написал один из возможных вариантов:

      0:000> !dlls
      0×001a1ee0: C:\WINDOWS\notepad.exe
      Base 0×01000000 EntryPoint 0×0100739d Size 0×00014000
      Flags 0×00005000 LoadCount 0×0000ffff TlsIndex 0×00000000
      LDRP_LOAD_IN_PROGRESS
      LDRP_ENTRY_PROCESSED
      0:000> bp 0100739d
      0:000> g
      
  5. May 18th, 2009 at 06:03 | #6

    nobodyzzz :
    Ну во-первых можно в 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)

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

  6. May 18th, 2009 at 06:14 | #7

    Anonymous :
    Вообще-то имхо имелось в виду останов на комманде по адресу IMAGE_OPTIONAL_HEADER::AddressOfEntryPoint

    Кстати хотел спросить, а зачем нужна именно точка входа? Я вот задумался и понял, что мне туда ставить точку останова не приходилось ни разу. Просто потому, что если нужно остановить выполнение в самом начале есть debugger breakpoint, а если нужно остановиться в середине, то подцепиться на тот же RegCreateKeyEx горазно удобнее, чем трассировать все от начала программы.

Comments are closed.