V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
harry890829
V2EX  ›  Hack

逆向 u3d 游戏

  •  
  •   harry890829 · 2023-09-12 00:33:47 +08:00 · 549 次点击
    这是一个创建于 464 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一个老游戏的私服,但是我一个手机玩家,平时又是用的 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 把这个运行起来,我自己单步分析一下,应该能够知道这个东西是怎么回事了

    求教一下后续如何进行
    XgusGod
        1
    XgusGod  
       2023-10-10 04:50:31 +08:00
    楼主接单吗 q1464106879
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1000 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 21:46 · PVG 05:46 · LAX 13:46 · JFK 16:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.