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是一个无符号的长号。
答案 0 :(得分:3)
a1和a2不是整数,它们是指针,类似地,它们没有签名,它们是无符号的。在64位系统上,这些指针可能是高于max(int32)的值,您可以尝试将它们转换为64位大小的值,例如uint64_t。
答案 1 :(得分:0)
尝试将int
和_DWORD的所有匹配项替换为int32_t
(您需要#include <stdint.h>
。您说_DWORD
定义为unsigned long
,在许多32位机器上,这将是32位数量,但在64位机器上通常是64位。
或者,如果函数实际上是以地址作为参数调用的,它看起来可能就是这样,你可能想尝试在任何地方使用int64_t
。您是否有一个如何调用该函数的示例,以及64位系统上的一些示例输入?