Сейчас на форуме: Rio (+5 невидимых)

 eXeL@B —› Вопросы новичков —› Тут пример поиска функции в, запрашивающей ввод ключа. Непонятна одна маленькя деталь.
Посл.ответ Сообщение

Ранг: 3.2 (гость)
Активность: 0.010
Статус: Участник

Создано: 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 там или что другое, мтожет, там какой-нибудь другой переход)

Вот. Пока понять не могу и дальше продвинуться соответственно тоже не могу. Спасибо, если кто объяснит.




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 01 июля 2008 22:47
· Личное сообщение · #2

лучшебы саму программку приложил

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes




Ранг: 3.2 (гость)
Активность: 0.010
Статус: Участник

Создано: 01 июля 2008 22:52 · Поправил: zayats
· Личное сообщение · #3

А там по ссылке всё есть.
И программка там есть есть- она небольшая. Её цель- быть пособием по взлому, больше она ни для чего. Так-то вроде всё понятно- там условный переход безусловным заменяется- это мне знакомо, на С кодил. Но хотелось бы выяснить вот этот вопрос, пока он свеж и пример лёгок. А то потом на более сложных примерах это непонимание как даст-даст о себе знать и придётся ворошить якобы пройденное.

Не зря же говорят, скупой платит дважды. А ленивый дважды делает.




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 01 июля 2008 23:13
· Личное сообщение · #4

Получается этот цикл

0044F150 |> /A1 DC6B4500 /MOV EAX, DWORD PTR DS:[456BDC]
0044F155 |. |E8 4A310000 |CALL TestP.004522A4
0044F15A |. |A1 DC6B4500 |MOV EAX, DWORD PTR DS:[456BDC]
0044F15F |. |80B8 9C000000>|CMP BYTE PTR DS:[EAX+9C], 0
0044F166 |. |74 0F |JE SHORT TestP.0044F177
0044F168 |. |8B45 FC |MOV EAX, DWORD PTR SS:[EBP-4]
0044F16B |. |C780 4C020000>|MOV DWORD PTR DS:[EAX+24C], 2
0044F175 |. |EB 14 |JMP SHORT TestP.0044F18B
0044F177 |> |8B45 FC |MOV EAX, DWORD PTR SS:[EBP-4]
0044F17A |. |83B8 4C020000>|CMP DWORD PTR DS:[EAX+24C], 0
0044F181 |. |74 08 |JE SHORT TestP.0044F18B
0044F183 |. |8B45 FC |MOV EAX, DWORD PTR SS:[EBP-4]
0044F186 |. |E8 1DFDFFFF |CALL TestP.0044EEA8
0044F18B |> |8B45 FC |MOV EAX, DWORD PTR SS:[EBP-4]
0044F18E |. |8B80 4C020000 |MOV EAX, DWORD PTR DS:[EAX+24C]
0044F194 |. |85C0 |TEST EAX, EAX
0044F196 |.^\74 B8 \JE SHORT TestP.0044F150


Вот как раз в нем и прорисовывается окно, ты зайди по F7 в процедуру
CALL TestP.004522A4

если поискать еще найдешь и

00452288 |. 57 PUSH EDI ; /pMsg
00452289 |. E8 A244FBFF CALL <JMP.&user32.TranslateMessage> ; \TranslateMessage
0045228E |. 57 PUSH EDI ; /pMsg
0045228F |. E8 7440FBFF CALL <JMP.&user32.DispatchMessageA> ; \DispatchMessageA



-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes




Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 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 с сообщением о неправильной регистрации.



Ранг: 3.2 (гость)
Активность: 0.010
Статус: Участник

Создано: 02 июля 2008 00:03 · Поправил: zayats
· Личное сообщение · #6

coderess!

Цикл этот, я безусловно, видел. Я вот сейчас пробегаюсь по нему клавишей F8- окошко вырисовывается. Постепенно, какими-то частями. Слушай, я правильно тебя понял, что за вырисовывание окошка "ответственен" весь цикл? (Вот я вижу, ты мне намекнул на TestP.004522A4, обращение к этой функции присутствует в цикле. Тоже за что-то функция отвечает, за какую-то часть окошка, наверное) У меня так было, но такое частично прорисовывание я принимал за брак...

Если так, остаётся выяснить одну деталь и всё на этом.
Смотри. Мы заходим в цикл и жмём на клавишу F8 и не можем из цикла выйти. Почему? Если это нормальное поведение программы, то тогда почему при обычном выполнении программы (без трассировки) мы выходим из цикла? Что поменялось?

И в том и в другом случае мы доходим до этой строки (в цикле она последняя)

0044F196 |.^\74 B8 \JE SHORT TestP.0044F150

Но после неё мы при тассировке попадаем на первую строку цикла, а когда трассировки нет, то на строку, следующую за циклом (действительно, и бряк, который мы ставим сразу за циклом, это демонстрирует- программа дальше не идёт. Значит, она упёрлась в бряк. А это, в свою очередь, значит, что она вышла за пределы цикла). Крайне непонятно.

P. S. Хотя может быть и такой ответ: в программе не поменялось ничего, но невыход из цикла это в чистом виде свойство нажатия клавиши F8. То есть разработчиками Olly Debug просто так сделано, чтобы при трассировке из цикла не выходили. Что ж, такой ответ меня удовлетворит. Но хотелось бы его услышать.



Ранг: 159.1 (ветеран), 7thx
Активность: 0.130
Статус: Участник

Создано: 02 июля 2008 00:21 · Поправил: tempread
· Личное сообщение · #7

zayats
У тебя нет понимания принципов работы виндовых приложений.
Образно говоря, у каждой программы есть свой цикл сообщений. Винда направляет в этот цикл сообщения,а программа их берет с помощью виндовой функции и обрабатывает по своему усмотрению(или запускает обработку "по умолчанию"). Детальнее можно почитат --> тут<-- http://www.rsdn.ru/article/baseserv/api32.xml

Т.е. во время трасировки цикла сообщений, само отлаживаемое приложение неактивно(как окно),к нему не поступают сообщения о нажатии клавиш и/или о кликах мышкой, поэтому и гоняется холостой,ничего не делающий(кроме стандартных действий,например, перерисовка GUI) цикл.



Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 02 июля 2008 00:25 · Поправил: tihiy_grom
· Личное сообщение · #8

zayats пишет:
Если так, остаётся выяснить одну деталь и всё на этом.
Смотри. Мы заходим в цикл и жмём на клавишу F8 и не можем из цикла выйти. Почему? Если это нормальное поведение программы, то тогда почему при обычном выполнении программы (без трассировки) мы выходим из цикла? Что поменялось?


Ну раз и всё на этом - тогда смотри и слушай. Открой прогу в IDA (там очень хорошо всё будет видно). Твой цикл находится в функции класса TForm - @Forms@TCustomForm@ShowModal$qqrv. Сам цикл - это обработка формой сообщений, посылаемых хэндлу окна. Когда ты его трассируешь - окно до сих пор принимает сообщения (и представь какое количество сообщений оно принимает, пока ты всего лишь один раз нажал кнопку F8 ) Цикл заканчивается только тогда, когда окно готовится закрыться. Так что - это не особенность Olly, а скорее - особенность обработки сообщений окнами.

Добавлено
Tempread меня опередил, я сказал тебе тоже самое, только чуть подробнее.



Ранг: 3.2 (гость)
Активность: 0.010
Статус: Участник

Создано: 02 июля 2008 00:57
· Личное сообщение · #9

Мда...
Просто авторы той статьи как-то даже и внимания не обратили на зацикливание- ну не вышли из цикла- не вышли. Я и подумал, что объяснение просто, потому и спросил. А оно вон как сложно на поверку оказалось. Спасибо, что...



Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 02 июля 2008 01:17
· Личное сообщение · #10

zayats
Статья эта - фуфло. Если большая вложенность у процедур - ты замучаешься ставить бряки на появление окошка. Гораздо проще пользоваться бряками на API. Начни свои попытки реверса с изучения статей для новичков и с цикла статей Введение к крэкинг с нуля, используя OllyDbg




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 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 —› Вопросы новичков —› Тут пример поиска функции в, запрашивающей ввод ключа. Непонятна одна маленькя деталь.
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати