首页
社区
课程
招聘
[原创]某传奇封包解密
发表于: 2022-4-10 07:04 37942

[原创]某传奇封包解密

2022-4-10 07:04
37942

夜深人静.作为一名资深的导管选手.熟练的打开了www.xxx.com

一顿操作之后像往常一样准备关机睡觉.突然发现不知道什么时候桌面出现了一个xxx.apk的东西.于是乎怀着好奇的心放到模拟器准备瞧一瞧!
看到这个图标就感觉事情不简单. 好家伙!这不
是XD就来干我 大噶好 我系渣渣辉吗
由于最近异常无聊在研究封包这些东西.哼人家不找你你倒主动送上门了.讨厌
拿来吧你.

总所周知.常见的发包函数有send.sendto.WSASend 以及重新实现的发包函数等.
通过发包函数可以定位到一些功能.比较常见的发包流程如下图:

但是现在的网游不会像多年前的网游一样,一个bp send 送你全套功能call以及明文发包,有的游戏你想找到真正的发包函数,都要消耗大量的精力.再或者当你跳出一个线程发包时你会发现你又来到了另外一个线程.


通过观察发现不管是发送还是接收封包头部都会出现]TRA][nA]TRA]TRA]TRA]TRA]等字样.由此可以确定使用同一种加密.

那么想要查看封包的内容我们就必须解密或者找到明文包组包的位置.由于模拟器的限制并不能使用PC的工具.于是乎在网上搜索一番之后得到可以使用ceserver等工具.但是ceserver也有很多的bug.总是卡模拟器以及异常崩溃等等.
这里给大家推荐一个Android的Dbg.全名A64Dbg.可以在GitHub下载使用.
经过一系列尝试之后.发现A64Dbg里面没有游戏的主模块.这个本人也不熟悉Android.不知道是否被做了处理.

好吧.此路不通. 那就IDA大法.

解压得到游戏.so文件拖入IDA.既然游戏需要发包.尝试是否可以搜到send相关的字符串.
我的天这么多太费事.苦力活咱不干.偶然发现.so的文件可以直接查看到function name.通过对send函数的交叉引用找到游戏发包位置伪代码.加密call以及BitMask.意外的发现还有DecodeBitMasks.


激动的心颤抖的手.气质挠一下就上来.抄就完了.


分析发现任务封包头部加密!其余封包全段加密!
通过对封包头部截取发现
列1.列3 可能为Type
列2.游戏重新打开时发生变化.那么我们是不是可以猜测是每次打开游戏与服务器做一些效验的字节.经过仔细分析打开登陆游戏时服务器向客户端发送的数据包认证了这一点

列4.每次点击发生变化.通过反复观察分析.确定列4为发包次数.最大为0xFF


总体来说这一次的逆向没什么挑战.完全就是CV大法.游戏代码也应该是很久以前的老代码并没有做太多的修改以及防护.列如最近分析的一个PC游戏封包让我认识到了什么才叫兜圈子.也可能是本人封包经验欠缺.

std::vector<int> __fastcall Encode6BitBuf(std::vector<int> result, unsigned int a3, unsigned int* a4)
{
    int v4; // r8
    int v5; // r5
    unsigned int v6; // r12
    unsigned int v7; // r7
    int v8; // r6
    bool v9; // cc
    char v10; // r4
    unsigned int v11; // r5
    std::vector<int> buffer;
    if (a3)
    {
        LOBYTE(v4) = 0;
        v5 = 0;
        v6 = 0;
        int i = 0;
        do
        {
            v7 = EncodeBitMasks[result[i]] ^ 9;
            v8 = v5 + 2;
            v9 = v5 + 2 < 6;
            auto code = (((v7 >> (v5 + 2)) | v4) & 0x3F) + 0x3C;
            buffer.push_back(code);
            v10 = 6 - v5;
            v11 = v6 + 1;
            v4 = (unsigned __int8)(v7 << v10) >> 2;
            if (v9)
            {
                ++v6;
                v5 = v8;
            }
            else
            {
                v6 += 2;
                auto code2 = v4 + 0x3C;
                buffer.push_back(code2);
                v5 = 0;
                v4 = 0;
            }
            --a3;
            ++i;
        } while (a3);
        if (v5 > 0)
        {
            auto code3 = v4 + 0x3C;
            buffer.push_back(code3);
 
        }
    }
    else
    {
        v6 = 0;
    }
    *a4 = v6;
    return buffer;
}
 
std::vector<int> __fastcall Decode6BitBuf(std::vector<int> result, unsigned int a3, unsigned int* a4)
{
    int v4; // r12
    int v5; // r4
    int v6; // r10
    unsigned int v7; // lr
    int v8; // r6
    unsigned int v9; // r5
    unsigned __int8 v10; // r5
    std::vector<int> buffer;
    if (a3)
    {
        v4 = 0;
        v5 = 2;
        LOBYTE(v6) = 0;
        v7 = 0;
        v8 = 0;
        while (1)
        {
            v9 = result[v4];
            if (v9 < 0x3C)
                goto LABEL_12;
            v10 = v9 - 0x3C;
            if (v8 >= 2)
            {
                unsigned char code = DecodeBitMasks[(((unsigned __int8)(v10 & 0x3F) >> (6 - v5)) | (unsigned __int8)v6) ^ 0x9E] ^ 0x34;
                buffer.push_back(code);
                if (v5 > 5)
                {
                    v5 = 2;
                    v8 = 0;
                    goto LABEL_9;
                }
                v5 += 2;
                v8 = 0;
            }
            v6 = Decode6BitMask[v5 - 2] & (v10 << v5);
            v8 = v8 + 8 - v5;
        LABEL_9:
            if (++v4 >= a3)
                goto LABEL_12;
        }
    }
    v7 = 0;
LABEL_12:
    *a4 = v7;
    return buffer;
}
std::vector<int> __fastcall Encode6BitBuf(std::vector<int> result, unsigned int a3, unsigned int* a4)
{
    int v4; // r8
    int v5; // r5
    unsigned int v6; // r12
    unsigned int v7; // r7
    int v8; // r6
    bool v9; // cc
    char v10; // r4
    unsigned int v11; // r5
    std::vector<int> buffer;
    if (a3)
    {
        LOBYTE(v4) = 0;
        v5 = 0;
        v6 = 0;
        int i = 0;
        do
        {
            v7 = EncodeBitMasks[result[i]] ^ 9;
            v8 = v5 + 2;
            v9 = v5 + 2 < 6;
            auto code = (((v7 >> (v5 + 2)) | v4) & 0x3F) + 0x3C;
            buffer.push_back(code);
            v10 = 6 - v5;
            v11 = v6 + 1;
            v4 = (unsigned __int8)(v7 << v10) >> 2;
            if (v9)
            {
                ++v6;
                v5 = v8;
            }
            else
            {
                v6 += 2;
                auto code2 = v4 + 0x3C;
                buffer.push_back(code2);
                v5 = 0;
                v4 = 0;
            }
            --a3;
            ++i;
        } while (a3);
        if (v5 > 0)
        {
            auto code3 = v4 + 0x3C;
            buffer.push_back(code3);
 
        }
    }

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2023-10-24 17:16 被thisif编辑 ,原因: 工具
上传的附件:
收藏
免费 10
支持
分享
打赏 + 1.00雪花
打赏次数 1 雪花 + 1.00
 
赞赏  VtRoot   +1.00 2022/04/10
最新回复 (38)
雪    币: 4738
活跃值: (4286)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
6这种f5出来的伪代码直接就能拿来用了吗 会不会出现计算结果不对的情况
2022-4-10 10:59
0
雪    币: 1543
活跃值: (1056)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
木志本柯 6这种f5出来的伪代码直接就能拿来用了吗 会不会出现计算结果不对的情况
有些时候F5出来的伪代码会有一点不一样.
2022-4-10 15:51
0
雪    币: 0
活跃值: (218)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不明觉厉,Cocos引擎吗?
2022-4-10 18:39
0
雪    币: 141
活跃值: (7486)
能力值: ( LV9,RANK:335 )
在线值:
发帖
回帖
粉丝
5
牛蛙!
2022-4-10 22:41
0
雪    币: 987
活跃值: (357)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
为啥你这么有趣?
2022-4-11 10:15
0
雪    币: 864
活跃值: (5124)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7

mark

最后于 2022-4-11 10:53 被suuuuu编辑 ,原因:
2022-4-11 10:53
0
雪    币: 12502
活跃值: (3053)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
我就觉得这个头像蛮可爱。。
2022-4-11 15:07
0
雪    币: 220
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
9
666
2022-4-21 10:39
0
雪    币: 575
活跃值: (576)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
这个抓包软件叫啥,格式看着还行
2022-4-21 11:49
0
雪    币: 0
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
没毛病
2022-4-29 18:23
0
雪    币: 0
活跃值: (65)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
好一个导管选手!
2022-7-15 23:07
0
雪    币: 9348
活跃值: (1825)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
996传奇
2022-7-16 12:31
0
雪    币: 10
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
16
2022-7-31 19:57
0
雪    币: 10
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
17
大佬伪代码出来了后面怎么搞了,怎么直接就写出了软件?
2022-7-31 19:58
0
雪    币: 211
活跃值: (86)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
呃,这就是一个变异的BASE64啊。
2022-8-1 09:17
0
雪    币: 1108
活跃值: (3896)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
19
你的图真多,收藏了
2022-8-1 09:35
0
雪    币: 1578
活跃值: (1291)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
20
果断关注大哥,请问文中提到的 www.xxx.com 到底是什么。
2022-8-1 11:52
0
雪    币: 90
活跃值: (67)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
CV大法牛逼啊
2022-8-9 09:04
0
游客
登录 | 注册 方可回帖
返回
//