一个老游戏的私服,但是我一个手机玩家,平时又是用的 mac ,所以导致挂机非常麻烦,于是有了想要自己写一个简单的 client
目前进度是已经从 GameAssembly.dll 中,已经解出来了 Assembly-CSharp.dll
从项目中,已经提取出加密的 lua 脚本,发现了使用异或加密,并且进行了解密
通过阅读 lua 里面的内容发现,lua 是游戏内容的核心,使用了 protobuf ,不过并不复杂
发现 lua 组包后,并不是最终发送的节点,调用了 XNetMgr:SendBytes 函数
通过 Assembly-CSharp.dll 中的偏移量,用 idapro 加载 GameAssembly.dll ,找到对应的函数
简单代码如下:
//XNetMgr:SendBytes
__int64 __fastcall sub_1802EE980(__int64 a1, __int64 a2)
{
__int64 v4; // rbx
__int64 v5; // rcx
if ( !byte_18198A8A4 )
{
sub_1800AD520(20235i64);
byte_18198A8A4 = 1;
}
if ( !*(_QWORD *)(a1 + 16) )
{
v4 = ((__int64 (__fastcall *)(__int64))sub_1800F8640)(qword_1819C2058);
sub_18025EDB0(v4, 0i64);
*(_QWORD *)(a1 + 16) = v4;
}
v5 = *(_QWORD *)(a1 + 16);
if ( !v5 )
sub_1800E5F10();
return sub_18025EB90(v5, a2, 0i64);
}
__int64 __fastcall sub_18025EB90(__int64 a1, __int64 a2)
{
__int64 v4; // rax
__int64 v5; // r14
__int64 v6; // rcx
__int64 v7; // r15
__int64 v8; // r12
int v10; // [rsp+30h] [rbp-10h] BYREF
__int64 v11; // [rsp+40h] [rbp+0h]
__int64 v12; // [rsp+50h] [rbp+10h]
int *v13; // [rsp+60h] [rbp+20h]
int v14; // [rsp+68h] [rbp+28h]
char v15; // [rsp+B8h] [rbp+78h] BYREF
v12 = -2i64;
if ( !byte_181989FC6 )
{
sub_1800AD520(23908i64);
byte_181989FC6 = 1;
}
v15 = 0;
v13 = &v10;
v14 = -1;
v4 = qword_1819C2058;
if ( (*(_BYTE *)(qword_1819C2058 + 295) & 2) != 0 && !*(_DWORD *)(qword_1819C2058 + 216) )
{
il2cpp_runtime_class_init_0(qword_1819C2058);
v4 = qword_1819C2058;
}
v11 = **(_QWORD **)(v4 + 184);
v5 = v11;
v15 = 0;
sub_18099E060(v11, &v15, 0i64);
v6 = *(_QWORD *)(a1 + 16);
if ( v6 && (unsigned __int8)sub_18056C4B0(v6, 0i64) )
{
v7 = *(_QWORD *)(a1 + 24);
if ( !a2 )
sub_1800E5F10(0i64);
v8 = sub_1800F8640(qword_1819AA028);
sub_180E242C0(v8, a1, qword_1819BC580, 0i64);
if ( !v7 )
sub_1800E5F10(0i64);
(*(void (__fastcall **)(__int64, __int64, _QWORD, _QWORD, __int64, _QWORD, _QWORD))(*(_QWORD *)v7 + 600i64))(
v7,
a2,
0i64,
*(unsigned int *)(a2 + 24),
v8,
0i64,
*(_QWORD *)(*(_QWORD *)v7 + 608i64));
v14 = 0;
v10 = 94;
}
else
{
sub_18025E000(a1, 104i64, qword_1819DC270);
v14 = 0;
v10 = 94;
}
if ( v15 )
sub_18099E080(v5, 0i64);
return 0i64;
}
猜测这部分代码为发送核心,不过这种伪代码不知道该怎么看,或者说,怎么通过 idapro 把这个运行起来,我自己单步分析一下,应该能够知道这个东西是怎么回事了
求教一下后续如何进行