ReversingKR - Easy Crack

Easy Crack

Easy Crack

以下为 Ghidra 反编译的密码校验函数摘录,类型、全局符号和字符串常量由原二进制提供,不是可独立编译的 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
void __cdecl checkPassword(HWND param_1)

{
byte bVar1;
byte *pbVar2;
int iVar3;
char *pcVar4;
bool bVar5;

CHAR local_64;
char local_63;
char local_62;
char acStack_61 [97];

local_64 = '\0';
pcVar4 = &local_63;
for (iVar3 = 0x18; iVar3 != 0; iVar3 = iVar3 + -1) {
pcVar4[0] = '\0';
pcVar4[1] = '\0';
pcVar4[2] = '\0';
pcVar4[3] = '\0';
pcVar4 = pcVar4 + 4;
}
pcVar4[0] = '\0';
pcVar4[1] = '\0';
pcVar4[2] = '\0';
GetDlgItemTextA(param_1,1000,&local_64,100);
if (local_63 == 'a') { // a
iVar3 = _strncmp(&local_62,&DAT_00406078,2); // 5y
if (iVar3 == 0) {
pcVar4 = s_AGR3versing_0040606a;
pbVar2 = (byte *)(acStack_61 + 1);

do {
pcVar4 = (char *)((byte *)pcVar4 + 2); // R3versing
bVar1 = *pbVar2;
bVar5 = bVar1 < (byte)*pcVar4;
if (bVar1 != *pcVar4) {
LAB_00401102:
iVar3 = (1 - (uint)bVar5) - (uint)(bVar5 != 0);
goto LAB_00401107;
}
if (bVar1 == 0) break;
bVar1 = pbVar2[1];
bVar5 = bVar1 < ((byte *)pcVar4)[1];
if (bVar1 != ((byte *)pcVar4)[1]) goto LAB_00401102;
pbVar2 = pbVar2 + 2;
} while (bVar1 != 0);

iVar3 = 0;
LAB_00401107:
if ((iVar3 == 0) && (local_64 == 'E')) { // E
MessageBoxA(param_1,s_Congratulation_!!_00406044,s_EasyCrackMe_00406058,0x40);
EndDialog(param_1,0);
return;
}
}
}
MessageBoxA(param_1,s_Incorrect_Password_00406030,s_EasyCrackMe_00406058,0x10);
return;
}
Ea5yR3versing

IDA 对同一校验逻辑的反编译摘录如下。String[1]、String[2:4]、String[4:] 和 String[0] 的检查分别约束输入的对应片段;符号 Str2 和 aR3versing 的字符串内容须从原二进制读取。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int __cdecl sub_401080(HWND hDlg)
{
CHAR String[97]; // [esp+4h] [ebp-64h] BYREF
__int16 v3; // [esp+65h] [ebp-3h]
char v4; // [esp+67h] [ebp-1h]

memset(String, 0, sizeof(String));
v3 = 0;
v4 = 0;
GetDlgItemTextA(hDlg, 1000, String, 100);
if ( String[1] != 'a' || strncmp(&String[2], Str2, 2u) || strcmp(&String[4], aR3versing) || String[0] != 69 )
return MessageBoxA(hDlg, aIncorrectPassw, Caption, 0x10u);
MessageBoxA(hDlg, Text, Caption, 0x40u);
return EndDialog(hDlg, 0);
}