建议和反馈

请填写你的反馈内容

问答 > 密码学 > 问答详情
已解决

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

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位工作?


2019-07-21
0
请先登陆或注册

YYF2019-07-22

尝试用int32_t替换所有出现的int和_DWORD(你需要#include <stdint.h> 。你说_DWORD被定义为unsigned long ,在许多32位机器上将是32位数量但是在64位计算机通常是64位。

或者如果函数实际上是以地址作为参数调用的,它看起来可能是这样,你可能想尝试在任何地方使用int64_t。 您是否有一个如何调用该函数的示例,以及64位系统上的一些示例输入?


投一票
评论(0)
赞赏(0)
邀请

感谢您的善举,每一次解答会成为新人的灯塔,回答被采纳后获得20算力和相应的LK币奖励