逆向积累

1.字符串相等

这里i64相当于LL

0i64=0LL,1i64=1LL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
__int64 __fastcall equal(_QWORD *a1, _QWORD *a2)
{
__int64 v2; // rbx
int v4; // ebx
unsigned __int64 i; // [rsp+28h] [rbp-58h]

v2 = sub_425120(a1);
if ( v2 != sub_425120(a2) )
return 0i64;
for ( i = 0i64; sub_425120(a1) > i; ++i )
{
v4 = *(_DWORD *)sub_425200(a1, i);
if ( v4 != *(_DWORD *)sub_425200(a2, i) )
return 0i64;
}
return 1i64;
1
2
3
4
__int64 __fastcall sub_425120(_QWORD *a1)
{
return (__int64)(a1[1] - *a1) >> 2;
}

这个函数获取了a1这个数组第一项和第0项的差值,如果差值都不相等,那就不用比了

1
2
3
4
__int64 __fastcall sub_425200(_QWORD *a1, __int64 a2)
{
return 4 * a2 + *a1;
}

这个是计算第a2个位置的地址

回顾之前的比较函数:

1
2
3
4
5
6
for ( i = 0i64; sub_425120(a1) > i; ++i )
{
v4 = *(_DWORD *)sub_425200(a1, i); // 这里调用sub_425200
if ( v4 != *(_DWORD *)sub_425200(a2, i) )
return 0i64;
}

功能:

  1. 使用 sub_425200(a1, i) 获取数组 a1 中第 i 个元素的地址
  2. 使用 *(_DWORD *) 将该地址解释为32位整数指针并取值
  3. 对数组 a2 执行相同操作
  4. 比较两个值是否相等