gpt4 book ai didi

c++ - 32 位逆向工程加密功能失败 64 位

转载 作者:行者123 更新时间:2023-11-30 03:04:44 24 4
gpt4 key购买 nike

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 天的数学计算最终证明对我的密码学技能非常有值(value),但对手头的问题毫无用处。

我想知道关于这段代码的一件事或两件事:

首先,也是最简单的,有人知道它使用的算法或加密方法吗?它甚至使用标准方法吗?在我看来,它在某种形状或形式上看起来像 RC5/ROT13/DES/AES,但我说不出来。

其次,是否有任何迹象表明为什么这在 64 位中无法工作?

** 抱歉,_DWORD 是无符号长整型。

最佳答案

a1 和a2 不是int,它们是指针,同样,它们不是有符号的,它们是无符号的。在 64 位系统上,这些指针可能指向高于 max(int32) 的值,您可以尝试将它们转换为 64 位大小的值,例如 uint64_t。

关于c++ - 32 位逆向工程加密功能失败 64 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8409738/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com