Easy Crack
以下为 Ghidra 反编译的密码校验函数摘录,类型、全局符号和字符串常量由原二进制提供,不是可独立编译的 C 程序。入口和窗口初始化代码不影响校验,未列入此段。
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';33 collapsed lines
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 的字符串内容须从原二进制读取。
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);}