Иследование программ с OllyDBG

Тема в разделе "WASM.RESEARCH", создана пользователем fantom2005, 20 авг 2007.

  1. fantom2005

    fantom2005 New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2007
    Сообщения:
    4
    Здраствуйте. Пытаюсь изучить программу через Олли, чтоб в последующием написать подобную. Вопрос такой: есть кнопка, при нажатии на неё надо остановить программу на самом первом выполняймом операторе.
     
  2. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Смотри GetAsyncKeyState, сообщения окну WM_KEY**
     
  3. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    возможно имелся ввиду контрол button, тогда
     
  4. fantom2005

    fantom2005 New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2007
    Сообщения:
    4
    Спасибо за ответы. С Олли я работаю недавно, проще сказать только начал. Если можно опишити подробно действия иследования.
     
  5. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    fantom2005
    Освой сперва управление отладчиком. Там ничего сложного. Смотри статьи на этом же сайте...
     
  6. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    То есть программа чужая, имеет приличный размер, а интересуют только действия одной единственной кнопки на (с хорошей вероятностью) диалоговом окне.

    Кажется, желаемое никак не автоматизируется... Придется найти руками и головой нужный кусок (где-то должна быть процедура обработки событий окна или диалога), найти сравнение с кодом кнопки или с BN_CLICKED, и поставить там вручную брекпойнт... Или я чего-то не понимаю. (в частности, не понимаю, при чем тут GetAsyncKeyState)

    То есть надо найти эту самую процедуру - например, сделав по правой кнопке "Search all intermodular calls", и проверить все найденные вызовы EndDialog - обычно эта функция вызывается при завершении диалога. Потом в (обычно) начале процедуры найти ветвление

    ...
    CMP [ARG.2],111 (это как раз WM_COMMAND)
    JE prog_name.какой-то адрес
    ...

    потом после этого адреса найти ветвление
    ...
    CMP [ARG.3], 0000xxxx (а в 3-м аргументе в старшем слове 0 как раз означает BN_CLICKED)
    JE еще куда-нибудь

    и вот где-то там, куда ведут переходы с таких ветвлений (а их по идее должно быть примерно столько же, сколько кнопок - очевидно, идентификатор кнопки нам тоже неизвестен... или надо сначала посмотреть в ресурсах, если это диалог) поставить брекпойнт. И после нажатия на кнопку отладчик остановится на первой команде процедуры для обработки этой кнопки. Достаточно геморойный путь, но другого я не знаю.

    Хотя операции с 3-м аргументом могут выглядеть иначе... но догадаться обычно можно.
     
  7. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    fantom2005
    Изучать большую чужую прогу лучше в IDA, а не понятные места уточнять в Олле..

    P.S. GetAsyncKeyState действительно ни причем, если там кнопка))
     
  8. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    На всякий случай добавлю - если имеем "вручную" (через RegisterClassEx - CreateWindowEx) созданное окно, с созданной кнопкой (т.е. НЕ диалоговое из ресурсов), то Олли позволяет поставить точку останова на конкретное сообщение, прочитав из зарегистрированного класса адрес процедуры-обработчика. (View - Windows, "Actualize", "message breakpoint on ClassProc"), и все упрощается намного.

    В случае диалога - любым способом найти процедуру типа WinDlg (вернее, точку входа в нее), посмотреть код нужного контрола в любом редакторе ресурсов, а уже потом на точку входа можно поставить условный брекпойнт вида

    [ESP+8]==WM_COMMAND&&[ESP+C]==18

    если мы узнали, что нужная кнопка имеет идентификатор 18h

    Использование останова только по WM_COMMAND особого смысла не имеет. Далее придется трейсить процедуру, пока не увидим проверку на BN_CLICKED и код нашей кнопки, и только тогда попадем на функции, которые, собственно, происходят при ее нажатии. Способ чуть-чуть полегче, но требует наличия редактора-просмотрщика ресурсов.
     
  9. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    А на каком языке, собсно, написана программа? А то может лучше декомпилятор применить? Со старыми версиями C++ Builder/Delphi так легче всего было расправиться.
     
  10. fantom2005

    fantom2005 New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2007
    Сообщения:
    4
    Программа на писана на Делфи 7. Декомпилировал ДеДе, выписывает адрес MsgBox, саму функцию ни-ни. Я же хочу знать от куда стартует функция этого Батона.
     
  11. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    fantom2005
    В таком случае если при нажатии на кнопку "остановить программу на самом первом выполняймом операторе", то ты погрязнешь в дебрях мусорного кода VCL и будешь долго плутать, пока доберешься до нужного места.
    Вопрос - что за кнопка, "обычная" или модальная кнопка диалоговой формы ?
    Для обычной кнопки должен быть задан метод OnClick. Если форма создается не динамически, а через DFM, то DeDe должен ее показывать в списках Forms и Procedures, а все клики, приписанные контролам в Procedures+Events (если конечно в проге не используется защита от халявщиков и клики не сброшены в Nil). Если не понятно, какой метод к какой кнопке относится, то можно определить, переключившись на Forms + DFM Editor. Найдя адрес клика можешь его изучать в DeDe или Оле.
    У модальной кнопки никакого OnClick нет, поэтому нужно проверить, что делается в OnClose\OnCloseQuery диалоговой формы (если они есть) и дальше искать клик меню или кнопки, по которой эта форма вызывается и копаться в ней
     
  12. fantom2005

    fantom2005 New Member

    Публикаций:
    0
    Регистрация:
    20 авг 2007
    Сообщения:
    4
    Кнопка обычная. В ДеДе нашел адрес кнопки. В Оли посмотрел, не то.По этому адресу уже выскакивает сообщение, где-то до этого должно быть сравнение (СМР). Его-то мне и надо найти.