0. Настройки точек останова такие (
1. Открываем файл в x32dbg (т.к. это 32-битное приложение)
▶
2. Выбираем файл CyberPro13_PatchMe_0x1.exe
3. Дебаггер останавливается на системной точке останова:
System breakpoint reached
4. Возобновляем выполнение (
▶ ▶
5. Происходит остановка на прерывании (INT3), поэтому продолжаем выполнять, для этого нажимаем клавишу
6. Запускается окошко CyberPro13_PatchMe_0x1:
7. Поскольку исследуемая программа полностью загрузилась, в дебаггере переходим на вкладку (в данный момент содержимое вкладки пусто):
8. На пустом поле нажимаем правую кнопку мыши и выбираем (Либо сразу нажимаем
9. В списке нужно будет выбрать класс кнопки «Check»:
10. Нажав на нём правую кнопку мыши, выбираем пункт :
11. Появится окошко, где нужно выбрать условие точки останова (здесь отметим пункт Break on current window only):
12. В выпадающем списке выберем нужное условие (WM_LBUTTONUP — произошёл щелчок левой кнопки мышки):
[arg.get(0)+4] == 0x202 && [arg.get(0)] == D06A0
13. После этого в тестовом приложении нажимаем кнопку
Логика программы
Мы добились результата — выполнение программы остановлено сразу же после нажатия левой кнопки мыши. При этом мы всё ещё находимся в системной библиотеке user32.dll, нам же нужна логика исследуемой программы. В ту часть можно попасть, если нажать
14. Добавим точку останова на обращение к адресу памяти (фрагмент кода программы):
[ ] ▶ ▶ ▶
15. Теперь в списке точек останова появилась новая запись:
16. Если теперь продолжить выполнение программы (
Решение от br0ken
Хакер (пусть будет хакер) br0ken, делал отладку на дебаггере Olly, но по сути он мало чем отличается от x64dbg, поэтому я лишь немного переделаю его решение.
Опущу первые шаги по изучению данного кода, т.к. для нас они большой роли не играют. Но, если интересно, можно изучить описание полностью (оно в самом конце страницы по ссылке на вкладке Solutions).
17. Открываем исследуемый файл в x32dbg.
18. Нажав
19. Продолжаем выполнение до появления окошка программы
20. Правой кнопкой мышки вызываем контекстное меню и выбираем:
▶ ▶
21. На вкладке с результатами поиска «Strings (cyberpro13_patchme_0x1.exe)» открываем первый результат со строкой «g00d j0b»:
22. Сделав на нём двойной щелчок мыши, перейдём к нужному адресу (00401914):
24. Запускаем поиск по вызовам между модулями (Intermodular Calls):
▶ ▶
25. На вкладке с результатами поиска двойным щелчком мыши выбираем искомую строку (strlen):
26. Мы перешли к участку кода, где происходит проверка длины строки:
27. Установим курсор на следующую строчку:
004012A1 | 89C2 | mov edx,eax |
28. Теперь нажмём пробел
jmp 0x00401914
29. Получилось так:
Результат
30. Нажимаем
31. Теперь после запуска программы и нажатия кнопки надпись сменится на нужную нам:
- C#: Сравнить два массива - 12.12.2024
- EVE-Online: Фильтры каналов - 23.11.2024
- Не приходит СМС для авторизации на сайте Госуслуги - 01.11.2024