Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6771 / 3136 / 1065
Регистрация: 01.06.2021
Сообщений: 12,173

Crackme: реверс-инжиниринг

18.06.2026, 13:19. Показов 29852. Ответов 279
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В архиве 10 exe-файлов - консольных приложений, каждое из которых запрашивает пароль. Цель в том, чтобы найти и ввести правильный пароль, после чего получить сообщение Password OK!
Приложения созданы не мной, а неким IOLI. Приложения 32-битные, что тоже упрощают работу.
Приложения закрываются после выполнения, поэтому запускайте из cmd.

Собственно, вы можете использовать любой удобный вам инструмент: IDA Pro, Ghidra, Cutter, x32dbg и т.д. Т.е. можно как статически анализировать, а можно запустить отладчик и анализировать динамически.
Поскольку не будет вывода секретного сообщения при правильном вводе пароля и заранее известно, что выведется лишь Password OK!, то не вижу смысла в использовании всяких трюков, чтобы обойти проверку пароля всякими jmp и прочими инструкциями. Лучше тренироваться именно в поиске пароля, а не в его обходе.


Топовые декомпиляторы в простых случаях сразу отображают пароль, поэтому в таких случаях, чтобы было интересно, предлагаю все равно попробовать самостоятельно найти пароль, анализировав дизассемблерный код.

Что я имею в виду? Например, если открыть crackme0x03.exe в IDA Pro, то после декомпиляции мы сразу увидим пароль:



Декомпилятор Ghidra тоже сразу показывает пароль (в hex):



Чтобы было интересно, в таких простых случаях можно перейти в дизассемблерный вид и попытаться найти пароль самостоятельно:

Например, вот как выглядит это окно в IDA Pro. Я там специально добавил комментарии к некоторым строкам и разъяснил, как вычисляется этот пароль (но есть одна опечатка в одном комменте 528 вместо 582).



Для новичков в IDA Pro есть фича Auto Comments, которая включается в настройках. Но честно говоря, она мне не очень нравится.

В Cutter автокомментирование инструкций работает, имхо, лучше. Поэтому новичкам будет проще в Cutter самостоятельно разбирать логику вычисления пароля. Как видно на скриншоте, Cutter может автоматически комментировать каждую строчку, что довольно удобно:



Еще Cutter хорош тем, что на выбор там два декомпилятора, один из которых это декомпилятор от Ghidra (вполне неплохая альтернатива платного от Hex-Rays в IDA Pro). Собственно, этот же декомпилятор можно использовать и в самой Ghidra, но там нет автокомментирования.

***

В crackme0x04.exe пароль сразу не виден после декомпиляции.



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



crackme0x05.exe очень похож на предыдущее задание, только нужно еще вспомнить, как определяют четность чисел с помощью побитового AND.

***
Короче, если вам скучно и не знаете, чем заняться, то можете поиграться с этими файлами и ознакомиться с основами реверс-инжиниринга.
Вложения
Тип файла: zip crackme.zip (82.1 Кб, 16 просмотров)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.06.2026, 13:19
Ответы с готовыми решениями:

Как написать keygen для crackme?
Здравствуйте форумчане.Решил написать keygen сразу предупреждаю добросовестного Модератора ,что...

Ошибка приложения в простом коде, реверс строки
Здравствуйте. Подскажите почему виндновс выдает сообшение об ошибке ? Тоесть компилятор...

Функция и реверс строки
1. Составить программу, которая реверсирует каждое слово строки str. 2. Написать и протестировать...

279
Заблокирован
28.06.2026, 16:32
Студворк — интернет-сервис помощи студентам
Royal_X, понятно.
У меня только одна статик сборка Qt 6.8/mingw/x64.
Нашпиговал он туда всё что нужно и не нужно.(сейчас не охота разбираться как в случае с деплойом динамическим)
Прикрепил.

Но я правильно понял что статик уже не так весело смотрится через дизасемблер?
Меня именно это и интересует. За темой интересно наблюдать, но сам я от такого далёкий.
Вложения
Тип файла: zip bin.zip (9.94 Мб, 5 просмотров)
Тип файла: zip libs.zip (16.57 Мб, 5 просмотров)
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6771 / 3136 / 1065
Регистрация: 01.06.2021
Сообщений: 12,173
28.06.2026, 16:54  [ТС]
Цитата Сообщение от RabbitAttaks Посмотреть сообщение
Но я правильно понял что статик уже не так весело смотрится через дизасемблер?
при динамической линковке есть вся таблица импорта - полные имена функций, что облегчает анализ. В статике же таблица импорта не создается, поскольку функция уже внутри файла. Вместо имен функций ты просто видишь их шестнадцатеричный адрес, например, sub_401A20.
Данная проблема решается использованием FLIRT-сигнатур. IDA сравнивает байт-код начала функции с базой известных библиотек и угадывает имя, но это имя уже не берется из файла, а подставляется анализатором.
В IDA уже есть такие базы сигнатур для WinAPI и прочего.
Но для Qt, wxWidgets нужно создать базу самостоятельно. Но для этого нужно иметь *.lib или *.a файлы статической библиотеки, той же версии, которая используется в приложении и собранной той же версией компилятора.
Ну и FLIRT не всегда всё угадывает, да и при создании базы сигнатур бывают коллизии, которые либо пропускаешь, либо нужно решить вручную.
Еще, в статике имена могут быть видны, если подгрузить pdb. Маловероятно, что кто-то будет поставлять этот файл вместе с приложением, но однажды я такое встречал, когда разраб (скорее всего, по незнанию) поставлял этот файл.
0
Заблокирован
28.06.2026, 17:10
Цитата Сообщение от Royal_X Посмотреть сообщение
Еще, в статике имена могут быть видны, если подгрузить pdb. Маловероятно, что кто-то будет поставлять этот файл вместе с приложением, но однажды я такое встречал, когда разраб (скорее всего, по незнанию) поставлял этот файл.
Это вполне нормальная практика, только там не полный дебаг, а релизный, который не имеет фрагментов исходного кода.
Они нужны для отладки и понимания что именно произошло. Ну это как для какого софта. Для калькулятора, браузера, игры, они не нужны, для более серьезного софта, может быть.
Не думаю что Microsoft распространяет такие файлы для компонентов Windows по незнанию.

Получилось создать необходимые символы из *.a библиотек которые я прислал?
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6771 / 3136 / 1065
Регистрация: 01.06.2021
Сообщений: 12,173
28.06.2026, 17:27  [ТС]
Цитата Сообщение от RabbitAttaks Посмотреть сообщение
Получилось создать необходимые символы из *.a библиотек которые я прислал?
я еще не смотрел, занят другим.

Добавлено через 4 минуты
Цитата Сообщение от RabbitAttaks Посмотреть сообщение
Не думаю что Microsoft распространяет такие файлы для компонентов Windows по незнанию.
я не про майкрософт писал. В файлах какой-то игры однажды я находил этот файл, что мне облегчило задачу анализа. Я имею в виду, что это протуп разраба игры, который по незнанию поставил этот файл вместе с игрой. Ведь, зачем конечным пользователям этот pdb файл...
0
Заблокирован
28.06.2026, 17:32
Цитата Сообщение от Royal_X Посмотреть сообщение
В файлах какой-то игры однажды я находил этот файл, что мне облегчило задачу анализа. Я имею в виду, что это протуп разраба игры, который по незнанию поставил этот файл вместе с игрой. Ведь, зачем конечным пользователям этот pdb файл...
Вопрос "зачем" интересный.
Я вижу часто эти файлы. Релиз игры, ранний-доступ. Возможно для сбора ошибок.
Не буду утверждать точно. Но это распространенное явление, по меньшей мере среди инди-игр.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6771 / 3136 / 1065
Регистрация: 01.06.2021
Сообщений: 12,173
28.06.2026, 17:36  [ТС]
RabbitAttaks, в любом случае, если хочешь усложнить анализ твоего приложения, то нужно сделать статик, обязательно делать strip бинарника, убрать всю отладочную инфу и ни в коем случае не поставлять pdb файл.

Visial Studio дефолтно для релизной конфигурации тоже создает pdb файл. Причем, даже если его не поставлять потом, в твоём exe все равно будет храниться путь к этому файлу. Лучше в настройках проекта отключить такое поведение (нужно в двух местах кое-что изменить).
0
Заблокирован
28.06.2026, 17:55
Цитата Сообщение от Royal_X Посмотреть сообщение
то нужно сделать статик, обязательно делать strip бинарника, убрать всю отладочную инфу и ни в коем случае не поставлять pdb файл.
Легче просто доступную цену поставить и приемлемый контент.
Потому что множество лицензий, в большинстве опенсорц, нет места статической линковке.
Так что бедным несчастным "мастерам из гаража", это точно не нужно)
А защита, так уже ж упоминалось. Обфускация разного рода. Вынос логики на уровень клиент-сервер.
Ещё есть физические ключи(USB например), странно что никто их не вспомнил как средство защиты.
0
844 / 353 / 68
Регистрация: 20.11.2012
Сообщений: 852
28.06.2026, 18:01
Так как софт работает в ОС и программы нужны для обработки данных - размотать что статику, что динамику можно от системных API вверх по стеку вызовов. Всё что попадает в программу - идет через ОС, всё что уходит из программы идет через ОС. Размотать - вопрос времени и мотивации. Статика - это не защита и не испугает никого, кто мотивирован. Это немного времени отнимет, в сравнении с шифрованием, хитрыми ханипотами и прочим.

Цитата Сообщение от RabbitAttaks Посмотреть сообщение
Ещё есть физические ключи(USB например), странно что никто их не вспомнил как средство защиты.
Я упоминал. Но это дорого для обычного разработчика-одиночки. Сама болванка стоит от 15 баксов оптом, а ещё нужен SDK от 400.

Вообще, лучший источник интересных решений для защиты ПО - это, как ни парадоксально, малварь. Многие техники антиотладки и обфускации пришли от VX-еров изначально.
0
Заблокирован
28.06.2026, 18:13
Цитата Сообщение от WhiteP Посмотреть сообщение
Я упоминал. Но это дорого для обычного разработчика-одиночки. Сама болванка стоит от 15 баксов оптом, а ещё нужен SDK от 400.
Ну вот, хорошо.
Тогда для одиночки только танцы с бубном. Но у них и на основу не всегда времени хватает.
Да и выигрыш не до конца ясен. Это может помешать продвижению продукта. Если есть конкуренты, а они обычно есть.
Спиратить и пощупать, попользовать дома - это одно, использовать пиратский софт в бизнесе, уже совсем другое.
Как бы...
0
1980 / 836 / 115
Регистрация: 01.10.2012
Сообщений: 5,250
Записей в блоге: 2
28.06.2026, 19:40
Цитата Сообщение от Royal_X Посмотреть сообщение
dll файлы не подходят, поскольку там только таблица импорта.
Цитата Сообщение от Royal_X Посмотреть сообщение
при динамической линковке есть вся таблица импорта - полные имена функций, что облегчает анализ.
На здоровье, пусть все экспортируемое видимо. Разумеется свой код приложение не разглашает (attributes = hidden), все либы release, но скрыть вызовы Qt приложение не пытается. И что, разве это решает все проблемы?
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6771 / 3136 / 1065
Регистрация: 01.06.2021
Сообщений: 12,173
28.06.2026, 19:50  [ТС]
Цитата Сообщение от Igor3D Посмотреть сообщение
И что, разве это решает все проблемы?
использование статика вместо dll не решает все проблемы и это уж точно не какая-то защита 80-го левела, но тем не менее это немного затрудняет анализ. Тот, кто будет копаться во внутренностях, потратит просто больше времени на взлом.
Даже если чел попытается создать FLIRT сигнатуру, то все равно этот процесс займет у него некоторое время (например, придется статически собрать сам фреймворк на том же компиляторе, что и анализируемое приложение), а в итоге даже с этим *.sig файлом он не сможет раскрыть все имена, как это в dll, ведь все равно FLIRT не идеален и не всегда всё угадывает + при создании базы сигнатур случается много коллизий.
0
844 / 353 / 68
Регистрация: 20.11.2012
Сообщений: 852
28.06.2026, 20:07
Люди, да в целом пофиг статика или динамика в вопросе защиты информации. Для crackme, которые создаются для обучения - там запутает, так как исследователь ещё неопытен и библиотечный "мусор" мешает. Для реального приложения - там и так куча мусора, поэтому на практике исследовать так или иначе приходится глубже.
Это вот вообще прям не защита, если иных мер не предпринято. И даже FLIRT никто распаковывать не станет, если там не совсем всё запутано. Статика тащит текст в бинарник, что также помогает понять функцию по кросс-рефам. Сообщения об ошибках те же. Анализ кода функции статики часто опирается на API системы. В библиотеках код никто не путает специально, поэтому функции довольно прямолинейны и всегда (что касается работы с вводом-выводом) ведёт к вызову API ОС и так как библиотека юзает API для специфичных вещей - часть параметров функций API часто захардкожены прям в вызове, что позволяет уже на этом этапе понять в общих чертах, что делает библиотечная функция. Работа с кодами авторизации, файлами лицензии, реестром - это в любом случае ввод-вывод, как и сетевой обмен.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6771 / 3136 / 1065
Регистрация: 01.06.2021
Сообщений: 12,173
28.06.2026, 20:16  [ТС]
Цитата Сообщение от RabbitAttaks Посмотреть сообщение
libs.zip
у меня кстати из этих либ не получилось создать pat-файлы. С ними что-то не так.

Добавлено через 1 минуту
WhiteP, в статике много барахла и когда разбираешься в нем, глаза начинают кровоточить. Тогда как я открыл результат декомпиляции динамика Qt, то там почти всё выглядело так, будто это настоящий сорец и поэтому читалось намного проще.
0
28.06.2026, 21:44

Не по теме:

Цитата Сообщение от Royal_X Посмотреть сообщение
С ними что-то не так.
Какие были такие и отдал. Я кстати сам собирал.
Я им(библиотекам) передам, при случае :D

0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6771 / 3136 / 1065
Регистрация: 01.06.2021
Сообщений: 12,173
28.06.2026, 21:52  [ТС]
Цитата Сообщение от RabbitAttaks Посмотреть сообщение
Я кстати сам собирал.
молодец, поскольку ты юзал Qt Open Source, то теперь у тебя два варианта:

1. Открыть исходный код
2. Не открывать исходный код, но предоставить объектные файлы приложения (.o / .obj), чтобы пользователь мог самостоятельно слинковать их с другой версией Qt

если не выполнишь один из этих пунктов, то за тобой выедут серьезные люди
0
1980 / 836 / 115
Регистрация: 01.10.2012
Сообщений: 5,250
Записей в блоге: 2
30.06.2026, 03:04
Цитата Сообщение от Royal_X Посмотреть сообщение
Тогда как я открыл результат декомпиляции динамика Qt, то там почти всё выглядело так, будто это настоящий сорец и поэтому читалось намного проще.
Я не предлагал (возможное) усложнение задачи статической линковкой, даже при использовании обычных dll проблемы ломающему обеспечены
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6771 / 3136 / 1065
Регистрация: 01.06.2021
Сообщений: 12,173
30.06.2026, 12:26  [ТС]
Igor3D, хорошо. С получением введённого пользователем пароля, можно сказать, разобрались - используем события или сигналы, чтобы посимвольно передавать пароль.
А как именно хранить корректный пароль? И как лучше обрабатывать эти отдельные символы? Есть идеи?
0
1980 / 836 / 115
Регистрация: 01.10.2012
Сообщений: 5,250
Записей в блоге: 2
30.06.2026, 19:46
Цитата Сообщение от Royal_X Посмотреть сообщение
А как именно хранить корректный пароль? И как лучше обрабатывать эти отдельные символы? Есть идеи?
Часто "корректный пароль" - имя (ник, id) юзера, т.е. еще одна "открытая" строка которую юзеру придется давать/сообщать. Ну и передавать (для проверки) так же как и вводимый код, можно в том же вызове (напр упаковать в UInt32). Смысл проверки = комбинация этих 2 строк дает "заведомо верный" результат. Лично я пользуюсь алгоритмом более чем 30-летней давности что достался в наследство, и никогда в детали не вникал А вообще вопрос интересный, сформулируем так

Как сгененрировать строку пароля (из читаемых символов) чтобы она вкупе с другой (открытой, именем юзера) давала "правильный" результат? Что такое "правильный" - определяете сами. И как грамотно проверять эту "правильность", грубо говоря, без if'ов, чтобы примитивная правка jmp'ов не проходила?
Спасибо
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6771 / 3136 / 1065
Регистрация: 01.06.2021
Сообщений: 12,173
30.06.2026, 20:22  [ТС]
Цитата Сообщение от Igor3D Посмотреть сообщение
Как сгененрировать строку пароля (из читаемых символов) чтобы она вкупе с другой (открытой, именем юзера) давала "правильный" результат? Что такое "правильный" - определяете сами. И как грамотно проверять эту "правильность", грубо говоря, без if'ов, чтобы примитивная правка jmp'ов не проходила?
Если я правильно понял, то ты говоришь о случае, когда на вход приложение получает две строки:

1. Открытая строка - это может быть имя пользователя, серийный номер жесткого диска или физический адрес сетевого адаптера
2. Закрытая строка - серийный номер (выдается продавцом приложения под конкретную открытую строку)

Полагаю, что можно создать две функции:
1. Функция генерации ключа из открытой и закрытой строк
2. Функция расшифрования данных приложения, которая в качестве аргументов получает ключ и открытую строку.

В таком случае, данные приложения не расшифруются без правильной пары "ключ - открытая строка"
0
1980 / 836 / 115
Регистрация: 01.10.2012
Сообщений: 5,250
Записей в блоге: 2
30.06.2026, 20:52
Цитата Сообщение от Royal_X Посмотреть сообщение
Полагаю, что можно создать две функции:
1. Функция генерации ключа из открытой и закрытой строк
2. Функция расшифрования данных приложения, которая в качестве аргументов получает ключ и открытую строку.
В таком случае, данные приложения не расшифруются без правильной пары "ключ - открытая строка"
Да, только "расшифровка" звучит неудачно. Про-моему лучше сказать "приложение блокировано, неработоспособно и.т.п." пока верная пара не введена
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.06.2026, 20:52

Реверс слов в строке
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; int...

Реверс строки
Не могу написать программу которая перестанавливает символы в строке(abc->cba)

Реверс элементов массива
Надо поменять значения элементов массива в обратном порядке.Первый->последний,второй->предпоследний...

реверс строки
короче, у меня есть строка.. ее надо перевести наоборот. типа было ЛОХ стало ХОЛ вот как я...

Реверс масива по строках.
Задание: Поменять первую строку с последней, вторую с предпоследней и так далее. Я делаю вот...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
240
Ответ Создать тему
Новые блоги и статьи
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru