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

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

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

Студворк — интернет-сервис помощи студентам
В архиве 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 Кб, 12 просмотров)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.06.2026, 13:19
Ответы с готовыми решениями:

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

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

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

278
844 / 353 / 68
Регистрация: 20.11.2012
Сообщений: 852
27.06.2026, 10:46
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Igor3D Посмотреть сообщение
Интересная задачка: "закодировать" строку так чтобы не сработал останов отладчика по чтению памяти Должны быть наработанные решения, подскажите
Например, копировать параллельно в другой буфер, похукав нажатия клавиш в окне (сабклассинг, WM_CHAR, так как на глобальный хук почти 100% антивирь завопит). Получил символ, сразу его поксорил, например, и сохранил. Работать с этим буфером, а не буфером контрола. Код же получения данных из буфера контрола и дальнейшую их обработку намеренно запутать и усложнить (tarpit).

Против аппаратных бряков сбрасывать отладочные регистры через чтение/запись контекста потока (в Windows). Против Memory Breakpoints - принудительно сбрасывать атрибуты страницы памяти с буфером до RW перед работой с ним. (Лучше дергать сброс прав и контекста через прямые сисколы, или хотя бы Nt* чтобы обойти API-хуки отладчика).

p.s. Нужно понимать, что все эти ухищрения ("странная" работа с памятью) часто агрят эвристику антивируса.
0
 Аватар для sporta1982
215 / 61 / 7
Регистрация: 05.10.2023
Сообщений: 542
27.06.2026, 21:59
Вот вот, я сидел пол ночи, это называется MurMurHash по определению ии . Ну и как это взломать за 15 минут.?, ну вот вы то подскажите как это все перебрать?

Добавлено через 48 минут
Очень странные стадии с нулями, ау математики вы где?

Добавлено через 15 минут
Есть такая вещь angr, но что то с простыми crackme у меня не получилось, а вы все молчите....
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,587
27.06.2026, 22:53  [ТС]
Цитата Сообщение от Custos Посмотреть сообщение
Вот обновленный вариант, просто немного изменена проверка пароля, но тоже ничего сложного
Вложения
CrackMe_Find_Password_V2.7z
Сегодня было немного времени, решил и второй твой крякми

14220824094727305375

но у меня заняло не 15 мин, а больше. Решал систему из 6 уравнений (ранее я про эти 6 проверок уже писал). Человек не может вручную это сделать за 15 мин, так что люди, которые якобы решили за 15 мин просто лжецы. Наверное, они пользовались каким-то крутым ИИ. Никакие они не эксперты RE, а просто клоуны.
За 15 мин не сможешь даже просто эти уравнения выписать из дизассемберного листинга.

Цитата Сообщение от Royal_X Посмотреть сообщение
Решал систему из 6 уравнений (ранее я про эти 6 проверок уже писал).
быстрее всего будет, если использовать утилиту Z3

Вот сам код решения системы уравнения, пароль находится мгновенно:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
from z3 import *
 
MASK = BitVecVal(0xFFFFFFFFFFFFFFFF, 64)
U32  = BitVecVal(0xFFFFFFFF00000000, 64)
 
x = BitVec('x', 64)
 
def rol(v, n): return RotateLeft(v, n)
def ror(v, n): return RotateRight(v, n)
 
def bswap(v):
    b = [Extract(i*8+7, i*8, v) for i in range(8)]
    return Concat(b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7])
 
def upper32(v):
    return v & U32
 
# Block 1: bswap → rol(17) → *0x5bd1e995 → xor 0xa71c3d2b → ror(13)
def check1(x):
    r = bswap(x)
    r = rol(r, 17)
    r = r * BitVecVal(0x5bd1e995, 64)
    r = r ^ BitVecVal(0xa71c3d2b, 64)
    r = ror(r, 13)
    return upper32(r) == BitVecVal(0x3371a06200000000, 64)
 
# Block 2: ror(33) → *5 → sub(x) → rol(7) → bswap
def check2(x):
    r = ror(x, 33)
    r = r * BitVecVal(5, 64)
    r = r - x
    r = rol(r, 7)
    r = bswap(r)
    return upper32(r) == BitVecVal(0x31e568ec00000000, 64)
 
# Block 3: (x<<13 xor x>>7) → *0x27d4eb2d → ror(23) → xor 0xb4b82e39
def check3(x):
    r  = x << 13
    r11 = LShR(x, 7)
    r  = r ^ r11
    r  = r * BitVecVal(0x27d4eb2d, 64)
    r  = ror(r, 23)
    r  = r ^ BitVecVal(0xb4b82e39, 64)
    return upper32(r) == BitVecVal(0x8bdebb7400000000, 64)
 
# Block 4: not → rol(3) → xor(>>29) → bswap
def check4(x):
    r  = ~x
    r  = rol(r, 3)
    r11 = LShR(r, 29)
    r  = r ^ r11
    r  = bswap(r)
    return upper32(r) == BitVecVal(0x2eceea4a00000000, 64)
 
# Block 5: (x|1)*0x9e3779b1 → xor_hi_lo → rol(43)
def check5(x):
    rax    = x | BitVecVal(1, 64)
    rax128 = ZeroExt(64, rax)
    mul128 = ZeroExt(64, BitVecVal(0x9e3779b1, 64))
    prod   = rax128 * mul128
    lo     = Extract(63,  0, prod)
    hi     = Extract(127, 64, prod)
    rax    = lo ^ hi
    rax    = rol(rax, 43)
    return upper32(rax) == BitVecVal(0x0169d2a800000000, 64)
 
# Block 6: (ror(9) xor shl(17)) → +0x13579bdf → rol(37)
def check6(x):
    r10 = ror(x, 9)
    r11 = x << 17
    r10 = r10 ^ r11
    r10 = r10 + BitVecVal(0x13579bdf, 64)
    r10 = rol(r10, 37)
    return upper32(r10) == BitVecVal(0xfeec136800000000, 64)
 
# ── solve ──────────────────────────────────────────────────────────
s = Solver()
s.add(check1(x))
s.add(check2(x))
s.add(check3(x))
s.add(check4(x))
s.add(check5(x))
s.add(check6(x))
 
if s.check() == sat:
    val = s.model()[x].as_long()
    print(f"Пароль (dec): {val}")
else:
    print("Решений не найдено")
Добавлено через 1 минуту
Цитата Сообщение от sporta1982 Посмотреть сообщение
Есть такая вещь angr, но что то с простыми crackme у меня не получилось
из-за трюка Heaven's Gate этот angr не подходит для двух крякми от Custos, тут только ручной анализ. Но ты, конечно, всю инфу, которую я тебе говорил, пропустил мимо ушей, но зато сделал выпады в мой адрес, не проверив даже, что там действительно используется сегментный регистр cs.
1
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,587
27.06.2026, 23:24  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
Вот сам код решения системы уравнения, пароль находится мгновенно:
а вот скриншот VS Code

0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,587
27.06.2026, 23:43  [ТС]
Еще несколько дней назад, я уже писал все 6 проверок: Crackme: реверс-инжиниринг

Но статического анализа недостаточно.
каждая проверка из кода выше заканчивается сравнением с числом. Это число можно брать только из отладчика.
Например, для первой проверки мы используем сравнение с 0x3371a06200000000
Цитата Сообщение от Royal_X Посмотреть сообщение
return upper32(r) == BitVecVal(0x3371a06200000000, 64)
Это число берется из регистра R11



И вот для всех проверок нужно взять эти числа в отладчике.
0
Software Engineer
 Аватар для Custos
338 / 342 / 55
Регистрация: 23.09.2014
Сообщений: 1,050
27.06.2026, 23:45
Цитата Сообщение от Royal_X Посмотреть сообщение
За 15 мин не сможешь даже просто эти уравнения выписать из дизассемберного листинга.
От публикации CrackMe до финального ответа прошло 39 минут. То есть даже теоретически на решение этой задачи не могло уйти больше, чем 39 минут.
Человек, решивший задачу, подал "признаки жизни" (он писал что-то о своих CrackMe, которые публиковал в этом же чате раньше) в чате за 16 минут до публикации своего ответа. То есть логично предположить, что он заглянул в чат, написал свое сообщение, затем увидел мой CrackMe и пошел его решать.
Миниатюры
Crackme: реверс-инжиниринг  
0
Software Engineer
 Аватар для Custos
338 / 342 / 55
Регистрация: 23.09.2014
Сообщений: 1,050
27.06.2026, 23:47
Цитата Сообщение от Royal_X Посмотреть сообщение
так что люди, которые якобы решили за 15 мин просто лжецы
Это просто люди, которые на потоке каждый день сталкиваются с этим и у них под рукой уже готовые наработанные инструменты, которые ускоряют решение подобных задач
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,587
27.06.2026, 23:52  [ТС]
Цитата Сообщение от Custos Посмотреть сообщение
у них под рукой уже готовые наработанные инструменты, которые ускоряют решение подобных задач
это звучит правдоподобно. Они наверняка знают про Z3. Я же узнал уже после того, как сперва потратил немало времени на попытки решить систему в Wolfram Mathematica, но у меня ничего не получилось. И после поисков в интернете, узнал о данной утилите.

Однако, все же пока я выписал все 6 проверок из диззасемблерного листинга и еще нашел значения для сравнения в отладчике, у меня уже глаза кровоточили.

Код для Z3 для меня написала нейросеть, я лишь кинул просто все 6 проверок и 6 чисел, взятых во время отладки.

Но все равно не верится, что всё это можно за 15 мин делать. Ну разве что, если этот чел уже сталкивался с очень похожим заданием.
0
Software Engineer
 Аватар для Custos
338 / 342 / 55
Регистрация: 23.09.2014
Сообщений: 1,050
27.06.2026, 23:58
Цитата Сообщение от Royal_X Посмотреть сообщение
Ну разве что, если этот чел уже сталкивался с очень похожим заданием.
Это смесь MBA и bit-vector obfuscation, одно из стандартных популярных решений в большинстве обфускаторов. Люди, для которых реверс является работой, сталкиваются с этим буквально каждый рабочий день.
0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,119
Записей в блоге: 2
28.06.2026, 00:55
Цитата Сообщение от Royal_X Посмотреть сообщение
Делал точно по твоему псевдокоду. Использовал события как аналог системы сигналов/слотов.
В принципе верно, технически можно лучше

- "содержательные" ф-ции (OnPassChar и OnDoPassword) унести подальше, во всяком случае в др единицу трансляции (а не члены того же класса). Сидеть там тихо как мыша, никакого API не звать. Получил character (может лучше передать еще и индекс), сделал xor, записал в контейнер - и все. Нужно больше - передал опять post event/message.

- поместить все вызовы в обработчик нажатия кнопки (там в первую очередь будут копать) - значит "нарываться". Лучше пристроить вызовы post в готовые сигналы/события, напр eventFilter, вызов валидатора и др. Можно и сам код (напр в пересчет layout'а)

- зашланговаться - святое дело, по нажатию кнопки простецки проверять хеш (как делал товарищ выше), пусть думает что сломал

Цитата Сообщение от WhiteP Посмотреть сообщение
Интересная задачка: "закодировать" строку так чтобы не сработал останов отладчика по чтению памяти. Должны быть наработанные решения, подскажите
Например, копировать параллельно..
Понятно, но хочется "пожирнее" Очевидный вариант - размножить в больших количествах и потом прочитать случайно выбранную. И какая-то совсем уж идиотская мысль: сделать каждую цифру/символ счетчиком контейнера, уповая на то что он вычисляется, а не хранится

В любом случае идея такой защиты скрыть проверочный код используя обильную UI либу
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,587
28.06.2026, 01:33  [ТС]
Igor3D, чтобы запутать, можно создать фейковые строки "Password incorrect", "Password correct", пр., xref ↑ которых приведут к фейковым сравнениям с участием введенного пароля.
Ведь, очень часто анализ начинают с поиска string references.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,587
28.06.2026, 11:08  [ТС]
Igor3D, кстати, я создал файл сигнатур FLIRT из *.a-файлов wxWidgets для IDA Pro. Использовал pcf.exe и sigmake.exe.
Всё работает, но все равно, на мой взгляд, анализировать приложение на wxWidgets, собранное статически и без отладочной инфы, в разы сложнее, чем приложение на Qt или чистом WinAPI. wxWidgets сам по себе неплохо усложняет задачу по RE.
wxWidgets-статик я сам собираю и если дефолтно даже в релизной версии есть минимальная отладочная инфа, то я и это удаляю, чтобы приложение меньше весило.
А вот Qt-статик ни разу не собирал, поэтому ничего про него не скажу.
0
24 / 21 / 3
Регистрация: 07.06.2026
Сообщений: 120
28.06.2026, 12:47
Цитата Сообщение от Royal_X Посмотреть сообщение
А вот Qt-статик ни разу не собирал, поэтому ничего про него не скажу.
Могу дать посмотреть бинарник макета в статике.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,587
28.06.2026, 14:17  [ТС]
Цитата Сообщение от RabbitAttaks Посмотреть сообщение
Могу дать посмотреть бинарник макета в статике.
давай
0
24 / 21 / 3
Регистрация: 07.06.2026
Сообщений: 120
28.06.2026, 14:20
Вот. MSVC x64 Release.

p.s. меня за название файла не забанят? Как-то не подумал...
Вложения
Тип файла: zip SilentDownloader.zip (6.07 Мб, 2 просмотров)
1
28.06.2026, 14:35  [ТС]

Не по теме:

Цитата Сообщение от RabbitAttaks Посмотреть сообщение
меня за название файла не забанят?
а что не так с названием? вполне норм название

RabbitAttaks, это abandoned - проект или еще работаешь над ним?

0
28.06.2026, 14:51

Не по теме:

Цитата Сообщение от Royal_X Посмотреть сообщение
RabbitAttaks, это abandoned - проект или еще работаешь над ним?
Отпал за ненадобностью. Всё быстро поменялось.
Всё что требовалось, это открывать заранее подготовленные задачи(торренты) и загружать их.
При этом и задачи и загруженные данные предполагалось шифровать паролем.

0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,587
28.06.2026, 15:05  [ТС]
RabbitAttaks, у тебя случайно не остались lib / dll файлы от Qt 5.12.12 ?

Интересуют эти файлы:

Qt5Core
Qt5Gui
Qt5Widgets

Желательно *.lib файлы (которые ты использовал при сборке), а если их нет, то *.dll

RabbitAttaks, если не остались, то ничего. Я скачаю из https://www.dllme.com/dll/files/qt5core/versions Там есть все версии.
0
24 / 21 / 3
Регистрация: 07.06.2026
Сообщений: 120
28.06.2026, 15:06
Цитата Сообщение от Royal_X Посмотреть сообщение
RabbitAttaks, у тебя случайно не остались lib / dll файлы от Qt 5.12.12 ?
Нет.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,587
28.06.2026, 15:30  [ТС]
Цитата Сообщение от RabbitAttaks Посмотреть сообщение
Нет.
ладно, не получилось. придется собирать статически Qt 5.12.12 тем же компилятором, который ты использовал, а мне лень этим заниматься

dll файлы не подходят, поскольку там только таблица импорта. А с помощью Qt maintenance tool можно ставить как раз только dll-файлы, причем лишь версии 5.15 и выше. Там есть и lib файлы, но это другие lib-файлы (импортные библиотеки - заглушки-ссылки на dll), не те, что мне нужно. Мне нужны статические библиотеки lib.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.06.2026, 15:30

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
220
Ответ Создать тему
Новые блоги и статьи
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
сукцессия 41
anaschu 24.07.2026
Численная верификация бифуркации в агентной модели лесной сукцессии: от одного параметра к ансамблю Автор: пользователь @Shumilov_AS | Раздел: Прикладная математика / Численные методы Кратко. . .
сукцессия 40. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем **Полевые заметки о двухнедельной совместной работе**. . .
Теория всего 12. ВГК на планете в стратегической игре "терра"
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru