Здраствуйте. Пытаюсь изучить программу через Олли, чтоб в последующием написать подобную. Вопрос такой: есть кнопка, при нажатии на неё надо остановить программу на самом первом выполняймом операторе.
Спасибо за ответы. С Олли я работаю недавно, проще сказать только начал. Если можно опишити подробно действия иследования.
fantom2005 Освой сперва управление отладчиком. Там ничего сложного. Смотри статьи на этом же сайте...
То есть программа чужая, имеет приличный размер, а интересуют только действия одной единственной кнопки на (с хорошей вероятностью) диалоговом окне. Кажется, желаемое никак не автоматизируется... Придется найти руками и головой нужный кусок (где-то должна быть процедура обработки событий окна или диалога), найти сравнение с кодом кнопки или с 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-м аргументом могут выглядеть иначе... но догадаться обычно можно.
fantom2005 Изучать большую чужую прогу лучше в IDA, а не понятные места уточнять в Олле.. P.S. GetAsyncKeyState действительно ни причем, если там кнопка))
На всякий случай добавлю - если имеем "вручную" (через RegisterClassEx - CreateWindowEx) созданное окно, с созданной кнопкой (т.е. НЕ диалоговое из ресурсов), то Олли позволяет поставить точку останова на конкретное сообщение, прочитав из зарегистрированного класса адрес процедуры-обработчика. (View - Windows, "Actualize", "message breakpoint on ClassProc"), и все упрощается намного. В случае диалога - любым способом найти процедуру типа WinDlg (вернее, точку входа в нее), посмотреть код нужного контрола в любом редакторе ресурсов, а уже потом на точку входа можно поставить условный брекпойнт вида [ESP+8]==WM_COMMAND&&[ESP+C]==18 если мы узнали, что нужная кнопка имеет идентификатор 18h Использование останова только по WM_COMMAND особого смысла не имеет. Далее придется трейсить процедуру, пока не увидим проверку на BN_CLICKED и код нашей кнопки, и только тогда попадем на функции, которые, собственно, происходят при ее нажатии. Способ чуть-чуть полегче, но требует наличия редактора-просмотрщика ресурсов.
А на каком языке, собсно, написана программа? А то может лучше декомпилятор применить? Со старыми версиями C++ Builder/Delphi так легче всего было расправиться.
Программа на писана на Делфи 7. Декомпилировал ДеДе, выписывает адрес MsgBox, саму функцию ни-ни. Я же хочу знать от куда стартует функция этого Батона.
fantom2005 В таком случае если при нажатии на кнопку "остановить программу на самом первом выполняймом операторе", то ты погрязнешь в дебрях мусорного кода VCL и будешь долго плутать, пока доберешься до нужного места. Вопрос - что за кнопка, "обычная" или модальная кнопка диалоговой формы ? Для обычной кнопки должен быть задан метод OnClick. Если форма создается не динамически, а через DFM, то DeDe должен ее показывать в списках Forms и Procedures, а все клики, приписанные контролам в Procedures+Events (если конечно в проге не используется защита от халявщиков и клики не сброшены в Nil). Если не понятно, какой метод к какой кнопке относится, то можно определить, переключившись на Forms + DFM Editor. Найдя адрес клика можешь его изучать в DeDe или Оле. У модальной кнопки никакого OnClick нет, поэтому нужно проверить, что делается в OnClose\OnCloseQuery диалоговой формы (если они есть) и дальше искать клик меню или кнопки, по которой эта форма вызывается и копаться в ней
Кнопка обычная. В ДеДе нашел адрес кнопки. В Оли посмотрел, не то.По этому адресу уже выскакивает сообщение, где-то до этого должно быть сравнение (СМР). Его-то мне и надо найти.