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

 eXeL@B —› Вопросы новичков —› как правильно поставить бряк на оконной процедуре в OllyDbg?
Посл.ответ Сообщение

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

Создано: 25 января 2011 02:11 · Поправил: zaichik
· Личное сообщение · #1

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

Ну всё, собсно. В OllyDbg открываю окошко где имена титлы и хэндлы окон программы, и ставлю БЕЗУСЛОВНЫЙ БРЯК на оконную процедуру. Она начинается по адресу 00465274. Ошибиться трудно, там всего три адреса (второй на процедуру по умолчанию, третий на какую-то херь, я не разобрался на какую именно)

Но когда ставишь безусловный бряк на 00465274 и потом а дампе видишь, что да, стоит этот бряк, никуда не делся, значит на ЛЮБЫХ сообщения он должен срабатывать! Но он не срабатывает. Хоть мышью вожу по окнам, хоть клавишами тычу хоть что.

Вот здесь рассказано, как эту прогу взломать ДРУГИМ способом,
http://www.wasm.ru/article.php?article=ollydbg17
Но я хотел бы с бряком с этим разобраться

А вот и сама прога, спасибо кто поможет
http://www.wasm.ru/pub/23/files/ollydbg17.zip

...Уже и хардварные бряки ставил, ничё не добился, окна только перерисовываются ужасно меделенно, но бряки не срабатывают.




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 25 января 2011 05:02
· Личное сообщение · #2

zaichik тебе не нужен бряк на оконную процедуру, ставь бряк на OnChange в полях ввода, там всё проверяется

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

Создано: 25 января 2011 07:30
· Личное сообщение · #3

zaichik
004C0F2C ; Register.TfmRegister.edUserNameChange
004C10CC ; Register.TfmRegister.edRegistrationKeyChange



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

Создано: 25 января 2011 14:51
· Личное сообщение · #4

Спасибо, конечно, но моих знаний хватит на то только, чтобы просто бряки на нужные адреса поставить и убедиться- да, бряки срабатывают
Откуда взялись эти адреса? Вычислены или ещё как-то? Несомненно, я вернусь к этому вопросу, но не терпится щас узнать

+++++++++++++

По оконной процедуре вопрос остаётся открытым. Даже если так искать имя и серийник неэффективно- щас это неважно. Бряк ДОЛЖЕН на ней срабатывать. Не срабатывает. Почему? Вот вопрос.




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 25 января 2011 17:20
· Личное сообщение · #5

zaichik пишет:
Откуда взялись эти адреса?

Можно найти в тексте или через утилиты типа DeDe или IDR
zaichik пишет:
По оконной процедуре вопрос остаётся открытым. Даже если так искать имя и серийник неэффективно- щас это неважно. Бряк ДОЛЖЕН на ней срабатывать. Не срабатывает. Почему? Вот вопрос.

Потому, что бряк ставить надо на API вывода окна, а не на 00465274

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




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

Создано: 25 января 2011 18:11
· Личное сообщение · #6

Ответьте пожалуйста на МОЙ вопрос. А всё остальное мне щас не ценно.

Итак, есть оконная процедура и есть сообщения, которые посылаются окну. В цикле сообщений TranslateMessageboxA перенаправляет(или ставит в очеред не щзнаю как там) сообщения оконной процедуре. Так их обрабатывает или нет, в зависимости от реализации.

Я думаю, что оконная процедура этого окна обрабатывает и нахождение мыши над окном и перемещение мыши и нажитие кнопок на мыши и нажатие клавиш. Если я бряк ставлю на этой процедуре, она должна срабатывать на одном (любом) из этих сообщений. Не срабатывает. Почему? И честное слово, при всём уважении этоIsaev пишет:
Потому, что бряк ставить надо на API вывода окна, а не на 00465274
не отвечает на данный вопрос.

Можете ответить- ответьте. Может, у меня не хватает теоретических знаний- укажите. А запутывать и без того путаные вещи нехорошо.




Ранг: 164.6 (ветеран), 65thx
Активность: 0.120
Статус: Участник
Волшебник

Создано: 25 января 2011 19:25 · Поправил: neomant
· Личное сообщение · #7

Действительно при регистрации оконного класса устанавливается обработчик 00465274. Но если посмотреть сам обработчик, увидим:
Code:
  1. CODE:0046528F                 mov     eax, [eax+18Ch]
  2. CODE:00465295                 push    eax             ; dwNewLong
  3. CODE:00465296                 push    0FFFFFFFCh      ; nIndex
  4. CODE:00465298                 mov     eax, [ebp+dwNewLong]
  5. CODE:0046529B                 push    eax             ; hWnd
  6. CODE:0046529C                 call    SetWindowLongA
Что ни что иное, как установка нового обработчика. Вывод: правильно поставленный бряк должен сработать, но только один раз, который вы видимо и пропускаете.

-----
Следуй за белым кроликом





Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 25 января 2011 21:23
· Личное сообщение · #8

zaichik пишет:
Я думаю, что оконная процедура этого окна обрабатывает и нахождение мыши над окном и перемещение мыши и нажитие кнопок на мыши и нажатие клавиш. Если я бряк ставлю на этой процедуре, она должна срабатывать на одном (любом) из этих сообщений. Не срабатывает. Почему?

Потому, что не должна!
Обрабатываются только те события, которые использовал программист... Если бы вы хоть раз программировали, не писали бы чушь

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh





Ранг: 164.6 (ветеран), 65thx
Активность: 0.120
Статус: Участник
Волшебник

Создано: 25 января 2011 21:45
· Личное сообщение · #9

Если уж совсем быть корректным, то в оконную процедуру могут передаваться те сообщения, которые прошли по фильту GetMessage, но как правило это все.

-----
Следуй за белым кроликом




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

Создано: 25 января 2011 22:20 · Поправил: zaichik
· Личное сообщение · #10

Isaev пишет:
Потому, что не должна!

Isaev пишет:
Обрабатываются только те события, которые использовал программист

Угу. Только не использовал. А... Впрочем соловья баснями не кормят

Ну то есть такой цикл примерно:
while (GetMessage (&messages, NULL, 0, 0))
{
TranslateMessage(&messages);
DispatchMessage(&messages);
}


Так вот, докладываю. Если меня НЕ ИНТЕРЕСУЮТ неоторые сообщения, я не включу реакцию на них в тело оконной функции. Что я имею ввиду: значит это только одно- из ОКОННОЙ ФУНКЦИИ в ответ на эти сообщения будет вызвана функция по умолчанию.

Но оконная функция тем не менее, вызвана будет, даже если окну послано сообщение, которое ей никак не обрабатывается. Привет.
Ну кроме, конечно экстраординарных случаев, коими я сейчас занимаюсь и кои вы несомненно, знаете, но предпочитаете о них молчать. Не должна значит не должна. Ну, пусть так и будет.
neomant, спасибо, разбираюсь.




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 25 января 2011 22:35 · Поправил: Isaev
· Личное сообщение · #11

Что же ты прицепился к своей 00465274?
Поставь бряк на 004B3FDB и увидешь свой ключ (если ввёл имя уже)

zaichik пишет:
Ну то есть такой цикл примерно: while (GetMessage (&messages, NULL, 0, 0)) { TranslateMessage(&messages); DispatchMessage(&messages); }
Хотя это прога на Delphi, а не на Си, но смысл тот же...
Ну есть такой цикл, цикл обработки очереди сообщений, только ты его не там смотришь... Для окна ввода пароля он тут:
Code:
  1. 00485084  |>  A1 F82B4F00   /MOV EAX,DWORD PTR DS:[4F2BF8]
  2. 00485089  |.  E8 82320000   |CALL canasta.00488310
  3. 0048508E  |.  A1 F82B4F00   |MOV EAX,DWORD PTR DS:[4F2BF8]
  4. 00485093  |.  80B8 9C000000>|CMP BYTE PTR DS:[EAX+9C],0
  5. 0048509A  |.  74 0F         |JE SHORT canasta.004850AB
  6. 0048509C  |.  8B45 FC       |MOV EAX,DWORD PTR SS:[EBP-4]
  7. 0048509F  |.  C780 4C020000>|MOV DWORD PTR DS:[EAX+24C],2
  8. 004850A9  |.  EB 14         |JMP SHORT canasta.004850BF
  9. 004850AB  |>  8B45 FC       |MOV EAX,DWORD PTR SS:[EBP-4]
  10. 004850AE  |.  83B8 4C020000>|CMP DWORD PTR DS:[EAX+24C],0
  11. 004850B5  |.  74 08         |JE SHORT canasta.004850BF
  12. 004850B7  |.  8B45 FC       |MOV EAX,DWORD PTR SS:[EBP-4]
  13. 004850BA  |.  E8 1DFDFFFF   |CALL canasta.00484DDC
  14. 004850BF  |>  8B45 FC       |MOV EAX,DWORD PTR SS:[EBP-4]
  15. 004850C2  |.  8B80 4C020000 |MOV EAX,DWORD PTR DS:[EAX+24C]
  16. 004850C8  |.  85C0          |TEST EAX,EAX
  17. 004850CA  |.74 B8         \JE SHORT canasta.00485084

Только это не "Оконная процедура" грамотнее ставьте вопрос и быстрее получите желаемый ответ

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




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

Создано: 25 января 2011 22:55 · Поправил: zaichik
· Личное сообщение · #12

Isaev пишет:
Что же ты прицепился к своей 00465274?

Потому что по этому адресу находится оконная процедура, изначальная, так скажем. Потом насколько я могу судить её адрес меняется. В ней 7 раз вызывается SetWindowLongA с параметром GWL_WNDPROC и разными хэндлами и адресам. Что сие значит я не знаю, то ли на каждый элемент управления (на каждую кнопку, поле ввода и прочее) своя процедура создаётся то ли что, я щас с ними разбираюсь. Ну вот потому и привязался. Потом да, 465274 не задействуется. Но плясать-то надо от неё!

Ну вот ВЫ знаете откуда эти адреса брать 004B3FDB и откуда вы цикл взяли я понятия не имею. Моя логика такая- ищем оконную процедуру (ДЕЙСТВУЮЩУЮ!!) смотрим сообщения которые она принимает и от них отталкиваемся уже.
Isaev пишет:
Ну есть такой цикл, цикл обработки очереди сообщений, только ты его не там смотришь...
Простой такой вопрос: а откуда Вы знаете, что именно этот участок надо смотреть? И да, то, что я написал, это именно цикл обработки сообщений, а не оконная процедура, это я знаю.

А так собсно я получил ответ на вопрос - адреса оконных процедур меняются функцией SetWindowLong и они новые. Тут уже новое обсуждение пошло.




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 25 января 2011 23:58
· Личное сообщение · #13

zaichik пишет:
и откуда вы цикл взяли я понятия не имею.

когда окно показывается жми F12, потом F8 пока не начнёшь крутиться в этом цикле
но это имхо тупиковый вариант, в него попасть просто, а вот разобраться что из него обрабатывается - это жесть!

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




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

Создано: 26 января 2011 06:36
· Личное сообщение · #14

А какой не тупиковый?
Я сделал так: в общем, я посмотрел как создаётся окошко "кнопка" ok, ставил бряки на функцию CreateWindows. Ну то есь идея проста- с самого начала создать активную кнопку OK. В отладчике получилось. Ну всё, я потом просто параметры вручную менял (стиль) и кнопка ОК создавалось сразу активной. И я сразу на него тыкал, только это не помогало почему-то, всё равно просило ввести лицензию

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


 eXeL@B —› Вопросы новичков —› как правильно поставить бряк на оконной процедуре в OllyDbg?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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