Сейчас на форуме: Rio (+5 невидимых) |
![]() |
eXeL@B —› Вопросы новичков —› Тут пример поиска функции в, запрашивающей ввод ключа. Непонятна одна маленькя деталь. |
Посл.ответ | Сообщение |
|
Создано: 01 июля 2008 22:34 · Поправил: zayats · Личное сообщение · #1 daxa.com.ua/article/num1/ Можно даже туда не заглядывать, я сейчас попытаюсь объяснить на пальцах, в чём дело. Некоторая учебная программа запрашивает ввод ключа и нужно эту программу сломать. И вот там написано так: трассируем программу в Olly Debag с помощью кнопки F8, пока не появится окошко с запросом ключа. Ага, на это место ставим бряк. Рестартовали (Сtrl+ F2), клавишу F9 нажали, добрались до бряка. Дальше F7- трассировка с заходом в подпрограмму. Зашли, снова жмём на F8, пока снова окошко не появится, снова бряк на это место и так далее. Это всё понятно. Но вот добрались до цикла. Вот я его условно изображу строка_1 строка_2 строка_3 строка_4 То есть жмём на F8 и перебираем тем самым много раз эти 4 строчки. Значит, что предлагают авторы примера: ставим бряк на <строка5> (не изображена, поскольку в цикл не входит) и жмём на F9. Окошко появляется, но в голове не укладывается- откуда оно взялось? Ведь: 1) Функция, вызывающее окошко с запросом ввода ключа не может быть до цикла- это понятно 2) Функция, вызывающее окошко с запросом ввода ключа не может быть после цикла- потомму, хотя бы, что мы в эту сторону никак не выйдем- у нас ведь бряк стоит на <строка5> 3) Но и ни в одной из четырёх вышеназванных строчек, эта функция присутствовать не может, ибо до этого мы только что несколько раз пробегались по ним кнопкой F8 и окошка не появлялось! Если условиться: сперва к окошку нас вела <строка_x>, допустим (call <чего-то там>). Потом <строка_y> (тоже call <чего-то там>), а теперь <строка_z>, так где ей находиться-то относительно цикла? (сейчас неважно call там или что другое, мтожет, там какой-нибудь другой переход) Вот. Пока понять не могу и дальше продвинуться соответственно тоже не могу. Спасибо, если кто объяснит. ![]() |
|
Создано: 01 июля 2008 22:47 · Личное сообщение · #2 |
|
Создано: 01 июля 2008 22:52 · Поправил: zayats · Личное сообщение · #3 А там по ссылке всё есть. И программка там есть есть- она небольшая. Её цель- быть пособием по взлому, больше она ни для чего. Так-то вроде всё понятно- там условный переход безусловным заменяется- это мне знакомо, на С кодил. Но хотелось бы выяснить вот этот вопрос, пока он свеж и пример лёгок. А то потом на более сложных примерах это непонимание как даст-даст о себе знать и придётся ворошить якобы пройденное. Не зря же говорят, скупой платит дважды. А ленивый дважды делает. ![]() |
|
Создано: 01 июля 2008 23:13 · Личное сообщение · #4 Получается этот цикл
Вот как раз в нем и прорисовывается окно, ты зайди по F7 в процедуру CALL TestP.004522A4 если поискать еще найдешь и
----- Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes ![]() |
|
Создано: 01 июля 2008 23:33 · Личное сообщение · #5 zayats,coderess - а не устанете ли вы разбирать процедуру окна WndProc? ![]() zayats, статью было лень читать, и по-моему в конце там просто делается патч, чтобы прога регистрировалась на любые номера. Гораздо проще взять например DeDe (который отлично разбирает по косточкам программы на Delphi), засунуть в него твою прогу и посмотреть как и что там происходит. И после того как ты это сделаешь, ты увидишь, что вот тут 00453B10 |> 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] 00453B13 |. BA A43B4500 MOV EDX,TestP.00453BA4 ; ASCII "hello" 00453B18 |. E8 3B07FBFF CALL TestP.00404258 00453B1D |. 74 2B JE SHORT TestP.00453B4A в EAX пихается введенный тобой номер, в EDX пихается строка "hello", в процедуре они сравниваются и, если они не равны, прыжок JE SHORT TestP.00453B4A не выполняется - и выскакивает MessageBox с сообщением о неправильной регистрации. ![]() |
|
Создано: 02 июля 2008 00:03 · Поправил: zayats · Личное сообщение · #6 coderess! Цикл этот, я безусловно, видел. Я вот сейчас пробегаюсь по нему клавишей F8- окошко вырисовывается. Постепенно, какими-то частями. Слушай, я правильно тебя понял, что за вырисовывание окошка "ответственен" весь цикл? (Вот я вижу, ты мне намекнул на TestP.004522A4, обращение к этой функции присутствует в цикле. Тоже за что-то функция отвечает, за какую-то часть окошка, наверное) У меня так было, но такое частично прорисовывание я принимал за брак... Если так, остаётся выяснить одну деталь и всё на этом. Смотри. Мы заходим в цикл и жмём на клавишу F8 и не можем из цикла выйти. Почему? Если это нормальное поведение программы, то тогда почему при обычном выполнении программы (без трассировки) мы выходим из цикла? Что поменялось? И в том и в другом случае мы доходим до этой строки (в цикле она последняя) 0044F196 |.^\74 B8 \JE SHORT TestP.0044F150 Но после неё мы при тассировке попадаем на первую строку цикла, а когда трассировки нет, то на строку, следующую за циклом (действительно, и бряк, который мы ставим сразу за циклом, это демонстрирует- программа дальше не идёт. Значит, она упёрлась в бряк. А это, в свою очередь, значит, что она вышла за пределы цикла). Крайне непонятно. P. S. Хотя может быть и такой ответ: в программе не поменялось ничего, но невыход из цикла это в чистом виде свойство нажатия клавиши F8. То есть разработчиками Olly Debug просто так сделано, чтобы при трассировке из цикла не выходили. Что ж, такой ответ меня удовлетворит. Но хотелось бы его услышать. ![]() |
|
Создано: 02 июля 2008 00:21 · Поправил: tempread · Личное сообщение · #7 zayats У тебя нет понимания принципов работы виндовых приложений. Образно говоря, у каждой программы есть свой цикл сообщений. Винда направляет в этот цикл сообщения,а программа их берет с помощью виндовой функции и обрабатывает по своему усмотрению(или запускает обработку "по умолчанию"). Детальнее можно почитат --> тут<-- http://www.rsdn.ru/article/baseserv/api32.xml Т.е. во время трасировки цикла сообщений, само отлаживаемое приложение неактивно(как окно),к нему не поступают сообщения о нажатии клавиш и/или о кликах мышкой, поэтому и гоняется холостой,ничего не делающий(кроме стандартных действий,например, перерисовка GUI) цикл. ![]() |
|
Создано: 02 июля 2008 00:25 · Поправил: tihiy_grom · Личное сообщение · #8 zayats пишет: Если так, остаётся выяснить одну деталь и всё на этом. Смотри. Мы заходим в цикл и жмём на клавишу F8 и не можем из цикла выйти. Почему? Если это нормальное поведение программы, то тогда почему при обычном выполнении программы (без трассировки) мы выходим из цикла? Что поменялось? Ну раз и всё на этом - тогда смотри и слушай. ![]() ![]() Добавлено Tempread меня опередил, я сказал тебе тоже самое, только чуть подробнее. ![]() |
|
Создано: 02 июля 2008 00:57 · Личное сообщение · #9 |
|
Создано: 02 июля 2008 01:17 · Личное сообщение · #10 zayats Статья эта - фуфло. Если большая вложенность у процедур - ты замучаешься ставить бряки на появление окошка. Гораздо проще пользоваться бряками на API. Начни свои попытки реверса с изучения статей для новичков и с цикла статей Введение к крэкинг с нуля, используя OllyDbg ![]() |
|
Создано: 02 июля 2008 01:20 · Личное сообщение · #11 zayats посмотри туториалы Рикардо Наварахи - он грамотно умеется объяснять, не то что в daxa.com.ua/article/num1/ пишет (это сюда в общем вот так и как то так). Почуствуй разницу.tihiy_grom пишет: zayats,coderess - а не устанете ли вы разбирать процедуру окна WndProc? Ну так ник мой (Code Research/er) : ) ----- Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes ![]() |
![]() |
eXeL@B —› Вопросы новичков —› Тут пример поиска функции в, запрашивающей ввод ключа. Непонятна одна маленькя деталь. |