Дочитай до конца и ты сможешь взломать любой софт. Ну.. или нет..
↓↓↓ В конце статьи есть видео формат ↓↓↓
Сегодня я постараюсь собрать самый полный гайд по инструментам, которые помогут тебе изучить, как работает исполняемый *.exe файл изнутри.
О чем собственно речь?! Любая программа, которую ты запускаешь на своем ПК или смартфоне является машинным кодом, который состоит из 0-ей и 1-иц. И если процессор спокойно живет с этим, то человеку прочитать такое очень сложно. Для ускорения написания программ много лет назад люди изобрели язык программирования, который называется ассемблер.
Но человекам этого было мало и ассемблер казался им все еще сложным.. Потому было придумано множество других C, C++, Java, C#, Python и прочее. Но все они в разной степени переводятся в ассемблер, а потом ассемблер в процессорные команды.. В целом это и все, что нужно знать об этой чехарде..
Разные программы могут отличаться разной степенью виртуализации, но в момент запуска.. Они все выгружаются в оперативную память и там.. Они все одинаковые.
Самым доступным, для новичка, способом произвести насильственные дествия над кодом программы, является патч в райнтайме. То есть, мы пишем еще одну программу, которая ищет участок в памяти и меняет в нем код на тот, что нужен нам. Этот способ позволяет избежать различных защит, которые предпринимают авторы софта, поскольку в памяти все обнажено.
Итак, как мы выяснили, программа - это цифры, а именно нули и единицы. Так как же нам их прочитать?
Перевод машинного кода в человекочитаемый ассемблер называется дизассемблированием и для ОС Windows имеется 3 популярных программных решения x64dbg, IDA и Cheat Engine.
Самым лучшым для новичка будет Cheat Engine, в нем есть куча фукций облегчающих поиск и редактирование.
Далее идет x64dbg, он является открытым, разрабатывается и поддерживается интузиастами из сообщества реверсеров, которое сосредоточено на Tuts4You.com.
IDA - коммерческий продукт, который является лидером, если Вы собираетесь серьезно работать в сфере кибербезопасности. Она отличается от выше упомянутых тем, что позволяет снять дамп из памяти и реверсить код статически, но это уже совсем другой уровень. Чем она будет полезна новичку, так это тем, что, отыскав нужный участок в одном из первых двух, в IDA мы сможем произвести декомпиляцию и посмотреть, как нужная нам функция выглядит на самом деле. Это потребуется, если Вы захотите вызвать ее из своей программы.
Итак, с места в карьер! Нужно запомнить основной список инструкций:
- ADD - складывет 2 значения
- MOV - перемещает значения
- AND - логическое "И"
- CMP - сравнивает на равенство
- INC - инкремент "++"
- JMP - переход по адресу
- OR - логическое "ИЛИ"
- POP - выталкнуть из стека
- PUSH - поместить в стек
- RET - возврат из процедуры
Все еще не понятно?! Самое главное запомнить всего 2: это CMP и JMP.
Инструкция JMP - инструкция независимого перехода, но у нее есть и собраться JE/JZ и JNE/JNZ (E = EQUAL, Z = ZERO это одно и то же, просто в разных реализациях используют либо первое, либо второе). Условный переход полностью зависит от инструкции CMP. В зависимости от исхода сравнения, она переводит ZERO FLAG (далее ZF) в состояние 1 (вкл), либо 0 (выкл).
Название ZERO FLAG проистекает из того, как происхоит сравнение CMP, она просто берет и вычетает одно значение из другого и если оно равно 0, то равенсво соблюдается.. Воот..
Этих флагов в процессоре, как у дурака фантиков, но для данного тутора нам больше не нужно..
Это 80% информации, которую нужно знать, если Вам нужно просто убрать какое-нибудь надоедливое окошко в программе.
Для тех, у кого уже очумели ручки, сделал подробный гайд в гифках, как пользоваться Cheat Engine, x64dbg и IDA Pro version 7.7.220118
!!! Все картинки анимированы, нажми, чтобы увидеть в действии !!!
***
Как пользоваться Cheat Engine?!
1. Выбираем процесс.
2. Открываем панель Memory View.
3. На вкладке Tools жмем Code Filter.
4. Тык From Disassemble, чтобы выгрузить все адреса процедур.
5. Жмем Start, чтобы подключить дебаггер к процессу.
6. После нужно поводить.. указателем по интерфейсу программы и нажать Has not been executed, чтобы исключить GUIовые процедуры.
7. Жмем желаемую кнопку Войти, а после Has been executed, теперь у нас остались только те, которые отвечают за "нужные нам проверки в коде".
8. Жмем по очереди в списке и ищем начало процедуры, оно почти всегда представляет собой 2 строки:
push ebp
mov ebp,esp
Правой кнопкой мыши, вызываем контекстное меню, ставим брикпоинт и пытаемся снова "ВОЙТИ", если брикпоинт не сработал, идем дальше по списку..
9. Со следующей процедурой делаем то же самое.
10. Остановившись на брикпоинте, жмем Step Over до первого условного jump (je/jne==jz/jnz) и меняем флаг ZF на противоположный, чтобы поверить, что будет, если условие не выполнится.
11. Если это то, что нам нужно, жмем на строке jne дважды и меняем на je, можно закрыть Cheat Engine и пользоваться приложением.
***
Как пользоваться x64dbg?!
1. На вкладке File жмем Attach to process, чтобы начать отладку.
2. Далее ставим галочку в Options -> Preferences -> Events ==> Thread Exit, чтобы при выходе из нового треда, срабатывал брикпоинт. Потому, что MessageBox это модальное окно со своим тредом, при закрытии оно выходит в точку, откуда было вызвано, а именно в то место, где происходит "проверка".
3. В окне Stack View крутим вниз, пока не увидим строку reverse_me.004B27B2 и жмем на нее.
4. Так же, как и в Cheat Engine ищем начало процедур, оно будет выглядет так же. Ставим брикпоинт и пытаемся снова нажать кнопку "ВОЙТИ".
5. Так же жмем Step Over до jne и меняем ZF, кликнув на него дважды. Запускаем процесс, чтобы проверить результат.
6. Кликаем дважды на jne и меняем на je, чтобы инвертировать условие. И все готово.
Как пользоваться IDA Pro version 7.7.2200118
1. Открыв IDA, жмем вкладку Debugger -> Select Debugger -> Local Windows Debugger. Далее там же Attach Process и выбираем наш в списке.
2. Все та же вкладка Debugger -> Debugger options.. Ставим галочку на Suspend on thread start/exit. Чтобы создать точку останова, при выходе из MessageBox.
3. Далее во время останова, жмем CTRL+F7 (Run till return == Запустить до первой инструкции ret). Делаем так до тех пор, пока не увидим .text в начале строки, это значит, что мы вышли в участок, где находится код, написанный автором программы, а не какой-то сторонней библиотеки от MS Windows и иже с ними..
4. Ищем начало процедуры и ставим брикпоинт.
5. Ставим брикпоинт, чтобы убедиться, что мы на верном пути, запускам программу и жмем "ВОЙТИ". Так же можем убрать галочку с Suspend on thread start/exit.
6. Находим наш jne/jnz и через вкладку File -> Patch program меняем команду на противоположную, убрав 'n'.
7. Получаем внеземное удовольствие от расширения сознания.
Чуть не забыл.. У меня есть телега :з ↓↓↓ Все файлы там ↓↓↓