32位反向工程加密功能失败64位

时间:2011-12-07 02:34:49

标签: c++ security cryptography segmentation-fault reverse-engineering

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是一个无符号的长号。

2 个答案:

答案 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位系统上的一些示例输入?