004 - AcidBytes2
info
1、软件名称:CrackMe2.exe
2、压缩包名:Acid Bytes.2.zip
3、编程语言:Delphi
4、星级评定:算 法:★ 爆 破:★ 脱 壳:★
查壳

脱壳
用吾爱的脱壳程序,给他拖到这里就好了

界面

开逆
找到了成功的提示

在这个方法前打个断点,然后输出点东西

这边发现了,只要输入的东西等于 12011982 这个 call 就结束了

从新输入 12011982 后进入这个 call

发现没有跳转,原因是他对比的是 eax 的实际值,不是 120119182


int __fastcall CompareStrings(const char* str1, const char* str2) {
if (str1 == str2) {
return 0; // 相同指针,直接返回相等
}
if (!str1) {
// str1 是 nullptr,返回 str2 长度的负数(假设 str2 前面有长度字段)
return -static_cast<int>(reinterpret_cast<const uint32_t*>(str2)[-1]);
}
if (!str2) {
// str2 是 nullptr,返回 str1 的长度(假设 str1 前面有长度字段)
return static_cast<int>(reinterpret_cast<const uint32_t*>(str1)[-1]);
}
// 读取字符串长度(假设长度存储在数据前 4 字节)
uint32_t len1 = reinterpret_cast<const uint32_t*>(str1)[-1];
uint32_t len2 = reinterpret_cast<const uint32_t*>(str2)[-1];
uint32_t min_len = (len1 < len2) ? len1 : len2;
// 按 4 字节块比较(优化速度)
const uint32_t* p1 = reinterpret_cast<const uint32_t*>(str1);
const uint32_t* p2 = reinterpret_cast<const uint32_t*>(str2);
uint32_t dword_blocks = min_len >> 2; // min_len / 4
while (dword_blocks--) {
if (*p1 != *p2) {
// 不相等,进一步检查字节差异
uint8_t c1 = *reinterpret_cast<const uint8_t*>(p1);
uint8_t c2 = *reinterpret_cast<const uint8_t*>(p2);
if (c1 != c2) return c1 - c2;
c1 = *(reinterpret_cast<const uint8_t*>(p1) + 1);
c2 = *(reinterpret_cast<const uint8_t*>(p2) + 1);
if (c1 != c2) return c1 - c2;
uint16_t s1 = *reinterpret_cast<const uint16_t*>(p1) >> 16;
uint16_t s2 = *reinterpret_cast<const uint16_t*>(p2) >> 16;
return s1 - s2;
}
p1++;
p2++;
}
// 比较剩余字节(1-3 字节)
uint32_t remaining = min_len & 3; // min_len % 4
const uint8_t* byte_p1 = reinterpret_cast<const uint8_t*>(p1);
const uint8_t* byte_p2 = reinterpret_cast<const uint8_t*>(p2);
while (remaining--) {
if (*byte_p1 != *byte_p2) {
return *byte_p1 - *byte_p2;
}
byte_p1++;
byte_p2++;
}
// 如果前面都相等,返回长度差
return static_cast<int>(len1) - static_cast<int>(len2);
}

浙公网安备 33010602011771号