【发布时间】:2012-01-14 15:14:32
【问题描述】:
signed int _rotr( int a1, int a2 )
{
return (a1 << a2 % 0x20u) | ((unsigned int)a1 >> (char)(32 - a2 % 0x20u));
}
int _encrypt_password( int a1, int a2, signed int a3 )
{
signed int v10; // [sp+10h] [bp-8h]@3
int result; // eax@1
int v4; // ebx@3
int v5; // edi@3
int v6; // esi@3
int v7; // eax@4
int v8; // [sp+14h] [bp-4h]@2
int v9; // [sp+Ch] [bp-Ch]@2
result = 8 * a3 / 8;
a3 = 8 * a3 / 8;
if ( result > 0 )
{
result = a2;
v8 = 0;
v9 = a2;
while ( a3 / 8 > v8 )
{
v4 = *(_DWORD *)v9 + *(_DWORD *)(a1 + 16);
v6 = *(_DWORD *)(v9 + 4) + *(_DWORD *)(a1 + 20);
v10 = 1;
v5 = a1 + 24;
do
{
v7 = *(_DWORD *)v5 + _rotr(v6 ^ v4, v6);
v4 = v7;
v6 = *(_DWORD *)(v5 + 4) + _rotr(v7 ^ v6, v7);
++v10;
v5 += 8;
}
while ( v10 <= 12 );
result = v9;
*(_DWORD *)v9 = v4;
*(_DWORD *)(v9 + 4) = v6;
++v8;
v9 += 8;
}
}
return result;
}
以上是一组反向工程函数,它提供字符串(密码)的加密,用于向游戏服务器验证游戏客户端。原始加密不再可用,为此目的对其进行了反向工程。
代码在 32 位中完美运行,但是,在为 64 位系统编译时,我遇到了一些问题。该代码像在 32 位中一样成功构建,但是在执行该函数时,它会在遇到第一个 v4 分配行时出现段错误 (EXC_BAD_ACCESS):
v4 = *(_DWORD *)v9 + *(_DWORD *)(a1 + 16);
我试图了解该功能并弄清楚它实际提供的加密类型,但是我在这方面失败了。起初我使用 RC5 运行,但这导致了大约 2 天的数学运算,最终证明这对我的密码学技能非常有价值,但对手头的问题却是徒劳的。
我想知道关于这段代码的一件事或两件事:
首先也是最简单的,有没有人认出这是使用的算法或加密方法?它甚至使用标准方法吗?在我看来,它在某种程度上看起来像 RC5/ROT13/DES/AES,但我不知道。
其次,是否有任何迹象表明为什么这无法在 64 位中工作?
** 抱歉,_DWORD 是无符号长整数。
【问题讨论】:
-
您将整数转换为指针,理论上 64 位程序使用 64 位指针,因此使用 (void*) 代替 int 存储指针可能会更好
-
哈哈。是的,我认为它不是 rot13。老实说,我什至不认为它真正遵循任何直接加密方案。 _DWORD 定义为无符号长整数。 (void *) 在这种情况下不会编译,至少不会以它存在的形式编译。我尝试使用 uint64_t 和其他一些类型,但段错误仍然存在。
-
就个人而言,我不会将您从 IDA 的伪代码窗口中盲目复制的内容称为“逆向工程函数集”...
标签: c++ security cryptography segmentation-fault reverse-engineering