x64dbg: Пример работы дебаггера

Вчера наткнулся на статью, в которой описывался один из способов применения дебаггера x64dbg.
Естественно, для профи это уже пройденный этап, но новичкам может будет интересно. Это не совсем перевод статьи, а скорее заметка для меня (я же не профи :) )
1. Конфигурация
Options -> Preferences -> Events:

System Breakpoint: When loading a new process, the will cause x64dbg to break in the system function which initializes the application you are attempting to debug.

TLS Callbacks: The TLS Callback is a function which is called before the main application runs. This can set parameters or even be used by certain protectors to implement anti-debug technology. This allows you to break on this function.

Entry Breakpoint: This causes x64dbg to break on the Entry point on the application. For general debugging, this is the only breakpoint you will need to have checked.

DLL Entry: This will break on the entry point of any DLL which is loaded by the process you are debugging.

Thread Entry: This will break on the first instruction of any new thread initialized by the current process.

Attach Breakpoint: When this is checked, it will cause x64dbg to break in the DbgUiRemoteBreakin function when attaching to an active process. If unchecked, it will attach without suspending the process.

DLL Load/DLL Unload: This will break in the system function when a new library(DLL) is loaded into or unloaded from the active process. The DLL Load breakpoint occurs before any of its code is executed.

Thread Start/Thread End: This allows us to break in system when our debugged application initializes or terminates a thread.

2. Скачиваем файл sample.exe (он в архиве SampleApp_bin.zip)
3. Открываем этот файл в x64dbg. Это можно сделать через File -> Open, либо просто перетащить файл в окно программы:

Отдельно отмечу, что если приложение 32-бита, то нужно запускать x32dbg.exe, иначе дебаггер не увидит процесс! В этом случае в строке статуса будет выведено предупреждение:
«Use x32dbg to debug this file!»

4. Нажимаем F9 чтобы возобновить отладку, появляется окно программы, куда мы вводим любой пароль и нажимаем кнопку «Check»:

5. Пароль «123456» оказался неверным, поэтому появилось сообщение об ошибке «Authentication Failed. Invalid Password!»
6. Теперь, когда мы знаем текст сообщения об ошибке, можно попробовать найти ссылку на эту строку. Для этого нажимаем в окне вкладки CPU правую кнопку мышки и выбираем Search for -> Current Region -> String references
7. Откроется список адресов на все строковые ссылки используемые в программе. Используя фильтр, можно быстро найти искомую строку «Authentication Failed. Invalid Password»:

8. Сделаем на ней двойной щелчок мышкой, так мы перейдем на тот фрагмент кода, где эта строка используется:

9. На скриншоте выше видна красная пунктирная стрелочка, которая указывает на тот участок, где происходило сравнение результатов и дальнейший вызов окна с сообщением о неверном пароле.
10. Клавишей F2 ставим точку останова (breakpoint) на начало функции, которая проверяет пароль:

11. Сначала она пропускает пароль через хэширующий алгоритм, а потом сравнивает результаты с сохраненным в программе значением.

12. Чтобы проверить, какой именно алгоритм хэширования был использован, можно воспользоваться утилитой Hashing Utility 2.0. Нужно ее запустить и ввести там то значение, которое мы вводили ранее: «123456»:

13. Результатом хэширования будет строка «E10ADC3949BA59ABBE56E057F20F883E», получается, что алгоритм хэширования в программе использует MD5.
Значит перебирать оригинальный пароль нет смысла, но можно изменить инструкции так, чтобы принимался любой пароль. В участке кода выше оба хэша сравниваются. Если они совпадают, то программа сообщает, что пароль верный. Если нет, то говорит, что пароль неверный. Это значит, если мы заменим инструкцию следующего шага, то все время будет появляться сообщение о правильном пароле, независимо от того так это или нет. В x64dbg нам достаточно переместить курсор на нужную инструкцию и нажать клавишу Пробел, затем сменить адрес на новый:

13. В обычной ситуации, если пароль неверный, произошел бы переход на адрес 59EA68, но мы его поменяли на 59EA5A, поэтому, независимо от того, правильный пароль мы ввели или нет, все время будет сообщение о верном пароле. Нажав на «ОК» изменения записались в память. Теперь можно запустить выполнение программы заново. В результате мы получим сообщение о том, что пароль верный. Действия пункта 13 работают только до тех пор, пока мы не перезапустим приложение, потом все изменения пропадают.
14. Чтобы сделать изменения перманентными, нужно нажать на значок заплатки под главным меню:

15. Сохраняем пропатченый файл под новым именем, запускаем его и вводим любой пароль:

*. Если выделить адрес 59EA4A, нажать на нем ПКМ и выбрать Follow in Dump -> Address: 59EAF8, то в нижней части x64dbg можно будет выделить 32 символа ASCII и нажать Ctrl+E , после чего откроется окно, в котором можно будет скопировать UNICODE-строку
10db8e415b857a61e18ef5d4db8e4f38:

Ее можно вставить в окно поиска на сайте hashkiller.co.uk (Раздел Decrypter/Cracker -> MD5 decrypter). В результате мы узнаем, что зашифрованный пароль был ba321c