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

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

18.06.2026, 13:19. Показов 23379. Ответов 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
 Аватар для Наталья8
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,243
22.06.2026, 11:58
Студворк — интернет-сервис помощи студентам
https://xakep.ru/2016/12/08/re... ial-part1/

https://vk.com/wall-3183750_261199

Здесь дают... Догоняют и ещё добавляют...
И WinApi знать для этого, тоже неплохо бы.
0
 Аватар для Наталья8
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,243
22.06.2026, 12:18

Вообшем снова основы доучивать. Которые кто то не доучил.
Толково. И для си, тоже не лишнее будет.

Здесь делаеться упор си --> ассемблер...
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1054
Регистрация: 01.06.2021
Сообщений: 11,582
22.06.2026, 12:20  [ТС]
Наталья8, книги не мое. Никогда не любил читать такие учебники. Например, С++ я изучал по простому самоучителю https://www.learncpp.com/, а потом просто смотрел в https://en.cppreference.com/.
То же самое с этими ассемблерными инструкциями. Если чёт не понимаю, смотрю в справочник, а не в книгу. Бесит эта "вода" в книгах.
Например, в x64dbg cделали очень удобно. Можно нажать Ctrl+F1 или через контекстное меню выбрать "Help on mnemonic" и во вкладке Log про данную инструкцию выведется текст с очень подробным объяснением, для чего она, как использовать и пр. В офиц. справочнике Intel даже не так подробно.

Например, я нажал на SBB, зацените, как всё чётко расписано. В какой книге один лишь SBB опишут на 231 строку?
Тут не только примеры опкодов и их значение, описание, но и исключения, флаги, на которые влияет, аналоги интринсиков для Intel C/C++ компилятора.

Кликните здесь для просмотра всего текста
Code
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
SBB-Integer Subtraction with Borrow
 
 Opcode                    Instruction                  Op/   64-Bit       Compat/ Description
 
                                                        En    Mode         Leg Mode
 
 1C ib                     SBB AL, imm8                 I     Valid        Valid        Subtract with borrow imm8 from AL.
 
 1D iw                     SBB AX, imm16                I     Valid        Valid        Subtract with borrow imm16 from AX.
 
 1D id                     SBB EAX, imm32               I     Valid        Valid        Subtract with borrow imm32 from EAX.
 
 REX.W + 1D id             SBB RAX, imm32               I     Valid        N.E.         Subtract with borrow sign-extended imm.32
 
                                                                                        to 64-bits from RAX.
 
 80 /3 ib                  SBB r/m8, imm8               MI    Valid        Valid        Subtract with borrow imm8 from r/m8.
 
 REX + 80 /3 ib            SBB r/m8*, imm8              MI    Valid        N.E.         Subtract with borrow imm8 from r/m8.
 
 81 /3 iw                  SBB r/m16, imm16             MI    Valid        Valid        Subtract with borrow imm16 from r/m16.
 
 81 /3 id                  SBB r/m32, imm32             MI    Valid        Valid        Subtract with borrow imm32 from r/m32.
 
 REX.W + 81 /3 id          SBB r/m64, imm32             MI    Valid        N.E.         Subtract with borrow sign-extended imm32 to
 
                                                                                        64-bits from r/m64.
 
 83 /3 ib                  SBB r/m16, imm8              MI    Valid        Valid        Subtract with borrow sign-extended imm8
 
                                                                                        from r/m16.
 
 83 /3 ib                  SBB r/m32, imm8              MI    Valid        Valid        Subtract with borrow sign-extended imm8
 
                                                                                        from r/m32.
 
 REX.W + 83 /3 ib          SBB r/m64, imm8              MI    Valid        N.E.         Subtract with borrow sign-extended imm8
 
                                                                                        from r/m64.
 
 18 /r                     SBB r/m8, r8                 MR    Valid        Valid        Subtract with borrow r8 from r/m8.
 
 REX + 18 /r               SBB r/m8*, r8                MR    Valid        N.E.         Subtract with borrow r8 from r/m8.
 
 19 /r                     SBB r/m16, r16               MR    Valid        Valid        Subtract with borrow r16 from r/m16.
 
 19 /r                     SBB r/m32, r32               MR    Valid        Valid        Subtract with borrow r32 from r/m32.
 
 REX.W + 19 /r             SBB r/m64, r64               MR    Valid        N.E.         Subtract with borrow r64 from r/m64.
 
 1A /r                     SBB r8, r/m8                 RM    Valid        Valid        Subtract with borrow r/m8 from r8.
 
 REX + 1A /r               SBB r8*, r/m8*               RM    Valid        N.E.         Subtract with borrow r/m8 from r8.
 
 1B /r                     SBB r16, r/m16               RM    Valid        Valid        Subtract with borrow r/m16 from r16.
 
 
 
 
 
 1B /r                     SBB r32, r/m32               RM    Valid        Valid        Subtract with borrow r/m32 from r32.
 
 REX.W + 1B /r             SBB r64, r/m64               RM    Valid        N.E.         Subtract with borrow r/m64 from r64.
 
 NOTES:
 
 * In 64-bit mode, r/m8 can not be encoded to access the following byte registers if a REX prefix is used: AH, BH, CH, DH.
 
 
 
 
 
 
 
                                                  Instruction Operand Encoding
 
   Op/En              Operand 1                     Operand 2                      Operand 3                      Operand 4
 
      I             AL/AX/EAX/RAX                  imm8/16/32                          NA                             NA
 
     MI             ModRM:r/m (w)                  imm8/16/32                          NA                             NA
 
    MR              ModRM:r/m (w)                  ModRM:reg (r)                       NA                             NA
 
    RM              ModRM:reg (w)                 ModRM:r/m (r)                        NA                             NA
 
 
 
 
 
 
 
 
 
 
 
Description
 
Adds the source operand (second operand) and the carry (CF) flag, and subtracts the result from the destination
 
operand (first operand). The result of the subtraction is stored in the destination operand. The destination operand
 
can be a register or a memory location; the source operand can be an immediate, a register, or a memory location.
 
(However, two memory operands cannot be used in one instruction.) The state of the CF flag represents a borrow
 
from a previous subtraction.
 
When an immediate value is used as an operand, it is sign-extended to the length of the destination operand
 
format.
 
The SBB instruction does not distinguish between signed or unsigned operands. Instead, the processor evaluates
 
the result for both data types and sets the OF and CF flags to indicate a borrow in the signed or unsigned result,
 
respectively. The SF flag indicates the sign of the signed result.
 
The SBB instruction is usually executed as part of a multibyte or multiword subtraction in which a SUB instruction
 
is followed by a SBB instruction.
 
This instruction can be used with a LOCK prefix to allow the instruction to be executed atomically.
 
In 64-bit mode, the instruction's default operation size is 32 bits. Using a REX prefix in the form of REX.R permits
 
access to additional registers (R8-R15). Using a REX prefix in the form of REX.W promotes operation to 64 bits. See
 
the summary chart at the beginning of this section for encoding data and limits.
 
 
 
Operation
 
DEST <- (DEST - (SRC + CF));
 
 
 
Intel C/C++ Compiler Intrinsic Equivalent
 
SBB:       extern unsigned char _subborrow_u8(unsigned char c_in, unsigned char src1, unsigned char src2, unsigned char *diff_out);
 
SBB:        extern unsigned char _subborrow_u16(unsigned char c_in, unsigned short src1, unsigned short src2, unsigned short
 
*diff_out);
 
SBB:        extern unsigned char _subborrow_u32(unsigned char c_in, unsigned int src1, unsigned char int, unsigned int *diff_out);
 
SBB:        extern unsigned char _subborrow_u64(unsigned char c_in, unsigned __int64 src1, unsigned __int64 src2, unsigned
 
__int64 *diff_out);
 
 
 
Flags Affected
 
The OF, SF, ZF, AF, PF, and CF flags are set according to the result.
 
 
 
Protected Mode Exceptions
 
#GP(0)                  If the destination is located in a non-writable segment.
 
                        If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit.
 
                        If the DS, ES, FS, or GS register contains a NULL segment selector.
 
#SS(0)                  If a memory operand effective address is outside the SS segment limit.
 
#PF(fault-code)         If a page fault occurs.
 
#AC(0)                  If alignment checking is enabled and an unaligned memory reference is made while the
 
                        current privilege level is 3.
 
#UD                     If the LOCK prefix is used but the destination is not a memory operand.
 
 
 
Real-Address Mode Exceptions
 
#GP                     If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit.
 
#SS                     If a memory operand effective address is outside the SS segment limit.
 
#UD                     If the LOCK prefix is used but the destination is not a memory operand.
 
 
 
 
 
 
 
 
 
 
 
Virtual-8086 Mode Exceptions
 
#GP(0)                   If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit.
 
#SS(0)                   If a memory operand effective address is outside the SS segment limit.
 
#PF(fault-code)          If a page fault occurs.
 
#AC(0)                   If alignment checking is enabled and an unaligned memory reference is made.
 
#UD                      If the LOCK prefix is used but the destination is not a memory operand.
 
 
 
Compatibility Mode Exceptions
 
Same exceptions as in protected mode.
 
 
 
64-Bit Mode Exceptions
 
#SS(0)                   If a memory address referencing the SS segment is in a non-canonical form.
 
#GP(0)                   If the memory address is in a non-canonical form.
 
#PF(fault-code)          If a page fault occurs.
 
#AC(0)                  If alignment checking is enabled and an unaligned memory reference is made while the
 
                        current privilege level is 3.
 
#UD                      If the LOCK prefix is used but the destination is not a memory operand.
0
 Аватар для Наталья8
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,243
22.06.2026, 12:28
Да ничего. Толково написано и перевод хороший.
Я особо не вникал, но читаеться хорошо.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1054
Регистрация: 01.06.2021
Сообщений: 11,582
22.06.2026, 12:32  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
Например, в x64dbg cделали очень удобно. Можно нажать Ctrl+F1 или через контекстное меню выбрать "Help on mnemonic" и во вкладке Log про данную инструкцию выведется текст с очень подробным объяснением, для чего она, как использовать и пр.
Для начинающих еще очень удобна программа Cutter. Автокомментирование там лучше, чем в IDA Pro. Любой новичок может читать дизассемблерный код с помощью этих комментов.
0
 Аватар для Наталья8
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,243
22.06.2026, 12:46



Однозначно это как то вот так.
Мораль - если трудно вьехать в код на си,
то на ассемблере то же самое, вообще все волосья выщиплешь однако.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1054
Регистрация: 01.06.2021
Сообщений: 11,582
22.06.2026, 15:26  [ТС]
Цитата Сообщение от Наталья8 Посмотреть сообщение
то на ассемблере то же самое
У ассемблера высокий порог вхождения, но сам язык существенно меньше и проще, чем C++.
У C++ ниже порог для начала работы, но гораздо выше общая сложность освоения.

Ниже ответ ИИ:

Полезно разделять два понятия:

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

Если смотреть на порог вхождения:

У ассемблера он действительно высокий. Чтобы сделать даже простую программу, нужно понимать регистры, память, соглашения о вызовах, инструкции процессора, иногда устройство ОС и компоновку программы.
На C++ можно написать Hello, World! или простую консольную программу, почти не понимая, как работает процессор.

В этом смысле ассемблер сложнее для старта.

Но если смотреть на общую сложность языка:

Ассемблер очень маленький. Инструкций конечное число, правила обычно довольно простые.
C++ содержит огромный набор возможностей: шаблоны, метапрограммирование, перегрузку операторов, множественное наследование, RAII, move-семантику, лямбды, корутины, концепты, модель памяти многопоточности и многое другое.

В этом смысле C++ значительно сложнее ассемблера как язык программирования.

Однако есть важная оговорка. Иногда говорят: «Ассемблер простой, а C++ сложный». Это верно только для языка как формальной системы. Но реальные задачи на ассемблере часто оказываются очень трудными, потому что сложность переносится из языка в голову программиста. То, что в C++ скрыто за абстракциями, в ассемблере приходится контролировать вручную.

***
Выводы:
  • Ассемблер сложнее для старта из-за высокого порога вхождения
  • С++ как язык сложнее ассемблера
  • Ассемблер, хоть и проще, как язык, но людям, которые пишут на нём, тоже приходится не сладко, поскольку раз пошло на то, что программу нужно писать на ассемблере, то значит нужно решить какую-то трудную задачу, с которой не справляются другие языки. Но, имхо, таких задач в 2026 году все меньше и меньше. Современные компиляторы С++/ С неплохо оптимизируют и порой их выхлоп на ассемблере ничем не хуже, а порой лучше, чем коды на ассемблере, написанные экспертами.

Добавлено через 2 часа 22 минуты
Кстати, даже самый банальный велосипед может усложнить работу в IDA Pro

Например, если написать вот так строку "anubis", то поиск по строке в IDA Pro ничего не даст

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
std::string GetSecret() {
    std::string s;
    s += 'a';
    s += 'n';
    s += 'u';
    s += 'b';
    s += 'i';
    s += 's';
    return s;
}
 
int main()
{
    std::cout << GetSecret() << std::endl;
    std::cin.get();
}

В IDA Pro псевдокод главной функции будет выглядеть так (при компиляции MSVC)

C++
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
// Hidden C++ exception states: #wind=1
__int64 sub_7FF7C5161320()
{
  __int64 *v0; // rax
  __int64 v1; // rdx
  __int64 *v2; // rax
  void *v3; // rcx
  void *Src; // [rsp+20h] [rbp-28h] BYREF
  unsigned __int64 v6; // [rsp+38h] [rbp-10h]
 
  v0 = sub_7FF7C51611C0(&Src);
  if ( (unsigned __int64)v0[3] <= 0xF )
    v1 = (__int64)v0;
  else
    v1 = *v0;
  v2 = sub_7FF7C5161470(std::cout, v1, v0[2]);
  std::ostream::operator<<(v2, sub_7FF7C51613C0);
  if ( v6 > 0xF )
  {
    v3 = Src;
    if ( v6 + 1 >= 0x1000 )
    {
      if ( (unsigned __int64)Src - *((_QWORD *)Src - 1) - 8 > 0x1F )
        __fastfail(5u);
      v3 = *((void **)Src - 1);
    }
    j_j_free(v3);
  }
  std::istream::get(std::cin);
  return 0;
}
Как видно, строка "anubis" формируется в строчке
C++
1
v0 = sub_7FF7C51611C0(&Src);
Если перейти в эту функцию, то будет так:

C++
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
90
91
92
93
94
95
96
97
98
99
100
101
// Hidden C++ exception states: #wind=1
_QWORD *__fastcall sub_7FF7C51611C0(_QWORD *Src)
{
  unsigned __int64 v2; // rcx
  unsigned __int64 v3; // rdx
  _QWORD *v4; // rax
  unsigned __int64 v5; // rcx
  unsigned __int64 v6; // rdx
  _QWORD *v7; // rax
  unsigned __int64 v8; // rcx
  unsigned __int64 v9; // rdx
  _QWORD *v10; // rax
  unsigned __int64 v11; // rcx
  unsigned __int64 v12; // rdx
  _QWORD *v13; // rax
  unsigned __int64 v14; // rcx
  unsigned __int64 v15; // rdx
 
  *(_OWORD *)Src = 0;
  Src[3] = 15;
  *(_BYTE *)Src = 0;
  Src[2] = 1;
  *(_WORD *)Src = 97;
  v2 = Src[2];
  v3 = Src[3];
  if ( v2 >= v3 )
  {
    sub_7FF7C5161640(Src);
  }
  else
  {
    Src[2] = v2 + 1;
    v4 = Src;
    if ( v3 > 0xF )
      v4 = (_QWORD *)*Src;
    *(_WORD *)((char *)v4 + v2) = 110;
  }
  v5 = Src[2];
  v6 = Src[3];
  if ( v5 >= v6 )
  {
    sub_7FF7C5161640(Src);
  }
  else
  {
    Src[2] = v5 + 1;
    v7 = Src;
    if ( v6 > 0xF )
      v7 = (_QWORD *)*Src;
    *(_WORD *)((char *)v7 + v5) = 117;
  }
  v8 = Src[2];
  v9 = Src[3];
  if ( v8 >= v9 )
  {
    sub_7FF7C5161640(Src);
  }
  else
  {
    Src[2] = v8 + 1;
    v10 = Src;
    if ( v9 > 0xF )
      v10 = (_QWORD *)*Src;
    *(_WORD *)((char *)v10 + v8) = 98;
  }
  v11 = Src[2];
  v12 = Src[3];
  if ( v11 >= v12 )
  {
    sub_7FF7C5161640(Src);
  }
  else
  {
    Src[2] = v11 + 1;
    v13 = Src;
    if ( v12 > 0xF )
      v13 = (_QWORD *)*Src;
    *(_WORD *)((char *)v13 + v11) = 105;
  }
  v14 = Src[2];
  v15 = Src[3];
  if ( v14 >= v15 )
  {
    sub_7FF7C5161640(Src);
    return Src;
  }
  else
  {
    Src[2] = v14 + 1;
    if ( v15 <= 0xF )
    {
      *(_WORD *)((char *)Src + v14) = 115;
      return Src;
    }
    else
    {
      *(_WORD *)(*Src + v14) = 115;
      return Src;
    }
  }
}
Т.е. тут лишь видны коды отдельных символов.

Я не утверждаю, что написание строки таким образом это прям супер защита. Ведь, разумеется, в рантайме отладчик на блюдечке выведет всю строку. Но всё-таки немного усложняет реверс, тем более, что такое написание строки в коде С++ не требует сложных действий.

***
Просто заметил, что во всяких туториалов по крякми люди сразу же выполняют поиск всех строк, чтобы быстро перейти в нужное место. Что мешает разрабам таких крякми немного усложнить задачу?
0
Software Engineer
 Аватар для Custos
338 / 342 / 55
Регистрация: 23.09.2014
Сообщений: 1,050
22.06.2026, 16:07
Цитата Сообщение от Royal_X Посмотреть сообщение
такое написание строки в коде С++ не требует сложных действий.
Уже давно все придумали и сделали, не надо мучиться с особой записью строковых литералов
https://github.com/JustasMasiulis/xorstr
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1054
Регистрация: 01.06.2021
Сообщений: 11,582
22.06.2026, 16:16  [ТС]
Custos, не, ты меня не понял. Таких готовых библиотек можно найти тысячи, причем разного уровня сложности.
Но для крякми обычно такое не используют, потому что, как я уже писал выше, цель крякми это посредством развлечений изучать основы реверса. Если же посредством готовых библиотек создать крякми, то никто не станет такое взламывать.

А вот то, что я предлагал выше, это просто пример того, как посредством простейших действий можно немного усложнить реверс. Я же специально не упоминал сложные методы сокрытия строк.

Готовые библиотеки есть смысл использовать, когда ты уже на практике разрабатываешь что-то серьезное.

А мне вот интересны простейшие трюки, как вот я привел со строкой, которые не требуют ни готовых библиотек, ни сложных вычислений, но зато усложняют анализ в IDA Pro. Если знаешь еще такие штуки, то напиши. Но речь о самых простых трюках.
0
Software Engineer
 Аватар для Custos
338 / 342 / 55
Регистрация: 23.09.2014
Сообщений: 1,050
22.06.2026, 16:45
Цитата Сообщение от Royal_X Посмотреть сообщение
Но для крякми обычно такое не используют, потому что, как я уже писал выше, цель крякми это посредством развлечений изучать основы реверса.
Кто сказал, что не используют? CrackMe бывают самыми разными по уровню сложности, а не только для новичков. Там еще и не такое используют.
В этом и суть CrackMe - развитие и улучшение скила реверса. Годами решать однотипные примитивные CrackMe - это не развитие, а пустая трата времени.

Цитата Сообщение от Royal_X Посмотреть сообщение
Если же посредством готовых библиотек создать крякми, то никто не станет такое взламывать.
Никто не мешает практиковаться в написании собственных библиотек и использовать их в своих CrackMe. Создание собственных CrackMe - это такое же развитие.

Цитата Сообщение от Royal_X Посмотреть сообщение
Если знаешь еще такие штуки, то напиши. Но речь о самых простых трюках.
Там полно самых разнообразных трюков, а также их совместное использование в самых разнообразных комбинациях.
Как вариант, вернись к моему CrackMe и попробуй сначала разобраться, к примеру, как именно сломаны xrefs, что мешает удобной навигации по коду в IDA. Я даже скриншот скидывал с исходником, где видно, что вызовы функций завернуты в call obfuscation макрос. Попробуй разобраться как именно это реализовано. Разве не интересно разбираться в чем-то новом?
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1054
Регистрация: 01.06.2021
Сообщений: 11,582
22.06.2026, 17:28  [ТС]
Цитата Сообщение от Custos Посмотреть сообщение
CrackMe бывают самыми разными по уровню сложности, а не только для новичков.
Но какой смысл взламывать сложное крякми, если уже можно чем-то полезным заняться, например, взломать реальный софт. Ведь, если в таких сложных крякми будут готовые библиотеки, то такие же библиотеки будут в реальном софте. Отличие в том, что от взлома реального софта хотя бы получаешь удовольствие, чего не скажешь про сложные крякми.
Например, я бы не стал взламывать сложное крякми, поскольку мне в этом случае даже немного обидно, что какой-то васька-нуб, который сам ноль в реверсе, взял готовую библиотеку и создал крякми, а я еще должен голову ломать над его взломом.
Честно говоря, это напоминает ситуацию, когда на сайте chess.com или lichess.org наталкиваешься на читера, играющего с помощью шахматного движка.
Нет никакого удовольствия от такой игры.
Раз пошло на то, чтобы взламывать серьезные библиотеки, то перейду на взлом реального софта. Но мне еще рано о таком думать о взломе, например, Adobe Creative Cloud)))

Цитата Сообщение от Custos Посмотреть сообщение
Годами решать однотипные примитивные CrackMe - это не развитие, а пустая трата времени.
ну я вообще совсем недавно полез в эту тему и буду двигаться вперед очень медленно, поскольку это всего лишь хобби, не имеющее даже косвенного отношения к моей специальности в реальной жизни.

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

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

Добавлено через 4 минуты
Цитата Сообщение от Custos Посмотреть сообщение
однотипные примитивные CrackMe
да я уже все примитивные порешал) действительно, это скучно
кстати, последние уровни тренировочных игр из Cheat Engine более интересны, чем эти примитивные крякми, которые я находил в инете

***
На всякий случай, я напоминаю, что тема называется "реверс-инжиниринг для начинающих". Обсуждение взлома сложных крякми на готовых библиотеках - это не для начинающих.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1054
Регистрация: 01.06.2021
Сообщений: 11,582
22.06.2026, 17:51  [ТС]
Custos, я когда-то делал такой крякми, сможешь взломать?
Вложения
Тип файла: 7z CrackMe.7z (666.9 Кб, 2 просмотров)
0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,118
Записей в блоге: 2
22.06.2026, 18:02
Практическая ситуация

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

- кроссплатформенность - обязон

- считаем что хороший случай - приложение с обильным UI (напр на Qt), весит сотни мегабайт, спрятать можно хоть слона

- считаем что все понимают философию "щит и меч", никто не обвинит если Ваша защита будет взломана когда-нибудь. НО она не должна валяться ломаной на следующий день, не должна стать легкой добычей любителей что с упоением забивают jmp'ы (как в данной теме)

- срок исполнения - макс 2 дня, отмазки типа "да я никогда этого не делал" кончатся плачевно. А если еще тыкаете коллегам, то результат ожидается через час, другой, словом - в тот же день (возможно с удовольствием )

Ваши действия ?
0
 Аватар для Наталья8
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,243
22.06.2026, 18:26
Цитата Сообщение от Royal_X Посмотреть сообщение
сколько концепций нужно освоить
Извращенцы блин. (Ни в коем случае не пытаюсь оскорбить форумчан, что строго запрещено)

Добавлено через 1 минуту
Цитата Сообщение от Igor3D Посмотреть сообщение
Ваши действия ?
Подучи ассемблер...
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1054
Регистрация: 01.06.2021
Сообщений: 11,582
22.06.2026, 18:47  [ТС]
Igor3D, грубо говоря, нужно создать приложение, которое запрашивает код, если его не ввести, то оно не работает?
0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,118
Записей в блоге: 2
22.06.2026, 19:04
Цитата Сообщение от Royal_X Посмотреть сообщение
грубо говоря, нужно создать приложение, которое запрашивает код, если его не ввести, то оно не работает?
Да, точнее приложение уже имеется, нужно добавить проверку
0
Software Engineer
 Аватар для Custos
338 / 342 / 55
Регистрация: 23.09.2014
Сообщений: 1,050
22.06.2026, 19:05
Цитата Сообщение от Royal_X Посмотреть сообщение
да я уже все примитивные порешал) действительно, это скучно
Вот тебе еще один примитивный CrackMe, задание простое - нужно найти правильный пароль (не патчить).
Задание максимально облегченное, никакой защиты от отладки, никаких поломанных xrefs. Весь код проверки пароля находится в main функции.
Вложения
Тип файла: 7z CrackMe_Find_Password.7z (54.0 Кб, 10 просмотров)
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1054
Регистрация: 01.06.2021
Сообщений: 11,582
22.06.2026, 19:06  [ТС]
Цитата Сообщение от Igor3D Посмотреть сообщение
точнее приложение уже имеется, нужно добавить проверку
засунуть приложение в архив с паролем
0
844 / 353 / 68
Регистрация: 20.11.2012
Сообщений: 852
22.06.2026, 19:49
Сам Ильфак Гильфанов таки пришел к пониманию (скорее всего его отдел маркетинга, так как он сам (по слухам со старого cracklab от людей, что с ним общались) - непробиваем), что если долго максимально огораживать ПО и лупить цену, то придёт конкурент от Open Source, куда энтузиасты ринутся с большим желанием с целью допилить инструмент. Так и получилось, когда вышла Ghidra - сразу стали на каждом углу ломаную IDA раздавать и free версии выпускаться.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1054
Регистрация: 01.06.2021
Сообщений: 11,582
22.06.2026, 20:13  [ТС]
Цитата Сообщение от WhiteP Посмотреть сообщение
стали на каждом углу ломаную IDA раздавать
ломаной IDA пользуются профаны-хоббисты (это не шутка. На сайтах, где скачивают ломаную программу, некоторые даже спрашивают, как применить лекарство. Возникает вопрос: если ты такой хакер, то чё не можешь применить готовое лекарство, которое тебе дают на блюдечке, да еще с инструкцией?)

эксперты, которые пользуются IDA, обычно её не покупают, а это делают вместо них организации, в которых они работают. Почему? Потому что она дорогая. Эксперт-одиночка установит Ghidra, поскольку будет лохом, если потратит столько денег, когда есть бесплатный аналог.

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

Цитата Сообщение от Custos Посмотреть сообщение
задание простое - нужно найти правильный пароль
а я смогу это сделать без стат. анализа, а только поковырявшись в x64dbg? просто я это хочу запустить на виртуальной машине, а там у меня чистая винда и больше ничего. Макс. могу установить x64dbg.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.06.2026, 20:13

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
сукцессия 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`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru