首页
社区
课程
招聘
[分享]手游算法及渗透测试
2023-2-22 00:15 11833

[分享]手游算法及渗透测试

2023-2-22 00:15
11833

一.前言

最近在学习渗透,web方面太卷了,想弄弄tcp渗透这块百度了一下发现国内外基本没啥资料,问了一些专门做渗透的大牛。说tcp都没啥人测试方式比较少 洞一定多的爆,顿时让我来了兴趣。原理也很简单就是将tcp解密构造参数然后加密回去提交,于是就找了一款传奇试试刚好是客户的需求。

二.准备工作 !

2.1信息收集


拿到游戏首先看so库il2cpp.so很明显了 拖到ida中查看发现加固了
接着看看global-metadata.dat 发现头文件符合没加密的特征是正常的(这里坑了我一下午过分信任文件头的特征让我吃了大亏)

2.1提取游戏源码

既然是li2cpp类型的游戏就需要Il2CppDumper这款工具,Il2CppDumper是一款非常优秀且功能强劲实用的Il2Cpp提取工具,Il2CppDumper最新版支持从il2cpp中获取types, methods, fields等等数据,除了支持switch的NSO格式外,最主要的还是完整处理了下MetadataUsage,现在在IDA执行script.py后,F5能看到所调用的实例类,静态类的具体名称了,分析算法和搞些花式修改也更容易。下载链接:https://github.com/Perfare/Il2CppDumper

 

接着去利用frida dump出内存中的il2cpp.so

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function dump_so(so_name) {
    Java.perform(function () {
        var currentApplication = Java.use("android.app.ActivityThread").currentApplication();
        var dir = currentApplication.getApplicationContext().getFilesDir().getPath();
        var libso = Process.getModuleByName(so_name);
        console.log("[name]:", libso.name);
        console.log("[base]:", libso.base);
        console.log("[size]:", ptr(libso.size));
        console.log("[path]:", libso.path);
        var file_path = dir + "/" + libso.name + "_" + libso.base + "_" + ptr(libso.size) + ".so";
        var file_handle = new File(file_path, "wb");
        if (file_handle && file_handle != null) {
            Memory.protect(ptr(libso.base), libso.size, 'rwx');
            var libso_buffer = ptr(libso.base).readByteArray(libso.size);
            file_handle.write(libso_buffer);
            file_handle.flush();
            file_handle.close();
            console.log("[dump]:", file_path);
        }
    });
}


得到了未修复的so

 

SoFixer-Windows-64.exe -s libil2cpp.so -o libil2cpp1.so -m 0x0 -d 修复

接着利用Il2CppDumper进行cs以及dll的抽取 发现要我手动找codeRegistration和metadataRegistration

 

然后借助 Il2cppdumper的使用姿势这篇帖子的操作找了 填写进去发现会报序列不包括任何匹配元素

在我反复思考看是不是我地址偏移找错的时候 回头看了看global-metadata.dat发现虽然文件头信息虽然一样但是其他文件字节是错误的

再借助大佬的代码dump一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/*
获取解密后的global-metadata.dat
github:https://github.com/350030173/global-metadata_dump
 
用法:
frida -U -l global-metadata_dump.js packagename
 
导出的文件在/data/data/yourPackageName/global-metadata.dat
 
*/
 
 
 
//
//get_self_process_name()获取当前运行进程包名
//参考:https://github.com/lasting-yang/frida_dump/blob/master/dump_dex_class.js
function get_self_process_name()
{
var openPtr = Module.getExportByName('libc.so', 'open');
var open = new NativeFunction(openPtr, 'int', ['pointer', 'int']);
 
var readPtr = Module.getExportByName("libc.so", "read");
var read = new NativeFunction(readPtr, "int", ["int", "pointer", "int"]);
 
var closePtr = Module.getExportByName('libc.so', 'close');
var close = new NativeFunction(closePtr, 'int', ['int']);
 
var path = Memory.allocUtf8String("/proc/self/cmdline");
var fd = open(path, 0);
if (fd != -1)
{
    var buffer = Memory.alloc(0x1000);
 
    var result = read(fd, buffer, 0x1000);
    close(fd);
    result = ptr(buffer).readCString();
    return result;
}
 
return "-1";
}
 
function frida_Memory(pattern)
{
Java.perform(function ()
{
    console.log("头部标识:" + pattern);
    var addrArray = Process.enumerateRanges("r--");
    for (var i = 0; i < addrArray.length; i++)
    {
        var addr = addrArray[i];
        Memory.scan(addr.base, addr.size, pattern,
        {
            onMatch: function (address, size)
            {
                console.log('搜索到 ' + pattern + " 地址是:" + address.toString());
                console.log(hexdump(address,
                    {
                        offset: 0,
                        length: 64,
                        header: true,
                        ansi: true
                    }
                    ));
                //0x1080x10C如果不行,换0x1000x104
                var DefinitionsOffset = parseInt(address, 16) + 0x108;
                var DefinitionsOffset_size = Memory.readInt(ptr(DefinitionsOffset));
 
                var DefinitionsCount = parseInt(address, 16) + 0x10C;
                var DefinitionsCount_size = Memory.readInt(ptr(DefinitionsCount));
 
                //根据两个偏移得出global-metadata大小
                var global_metadata_size = DefinitionsOffset_size + DefinitionsCount_size
                    console.log("大小:", global_metadata_size);
                var file = new File("/data/data/" + get_self_process_name() + "/global-metadata.dat", "wb");
                file.write(Memory.readByteArray(address, global_metadata_size));
                file.flush();
                file.close();
                console.log('导出完毕...');
            },
            onComplete: function ()
            {
                //console.log("搜索完毕")
            }
        }
        );
    }
}
);
}
 
setImmediate(frida_Memory("AF 1B B1 FA 18")); //global-metadata.dat头部特征

成功!

三.算法分析

得到了dump.cs以及dll

定位到游戏发包函数 接着利用ida插件辅助分析il2cpp.so
alt+f7 根据你的python版本选中 Il2CppDumper中的 ida_py3.py script.json li2cpp.h文件 ida则会自动识别将sub开头的函数识别对应dll中的函数名称 效果如下

经过经过一顿hook定位来到了带有zlib字样的压缩算法


紧接着抓包看看数据包是否带有zlib算法的特征
这里为789c很明显 拿去再进行zlib解密看看是否能够得到明文信息

ok 不得不说易语言是最好用的语音得到明文信息

 

按照他人给我的思路测试思路则是得到这种json数据则可以开始愉快的渗透测试了

四.测试

也不知道一些这种payload是否有效我咋感觉跟16.7年的wpe类似勒 如果这种渗透测试无效或者存在其他机制联系滴滴 不然显得我特别呆

最后给大家看看我的猫 太调皮被我挂起来了


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞8
打赏
分享
最新回复 (10)
雪    币: 242
活跃值: (154991)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
QinBeast 2023-2-22 10:28
2
0
tql
雪    币: 122
活跃值: (1390)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
koflfy 1 2023-2-22 10:55
3
0
mark
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
水丶山 2023-3-1 14:43
4
0
我的做法跟你前面差不多。后面加解密部分,我的思路不太一样,我HOOK点和修改点是数据加密之前,解密之后,因为不同游戏用的加解密规则实在太多了,不想每种都去分析。
雪    币: 158
活跃值: (755)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Mars. 2023-3-2 13:34
5
0
水丶山 我的做法跟你前面差不多。后面加解密部分,我的思路不太一样,我HOOK点和修改点是数据加密之前,解密之后,因为不同游戏用的加解密规则实在太多了,不想每种都去分析。
你是直接hook加密前替换payload进去呗   这种思路也行  不用去还原算法
雪    币: 1
活跃值: (150)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
暖心系 2023-4-1 22:24
6
0
大佬接开发吗?可否留个联系方式
雪    币: 37
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_aicyioze 2023-4-17 00:18
7
0
Mars. 你是直接hook加密前替换payload进去呗 这种思路也行 不用去还原算法
楼主在了 联系下 Q 1528103  弄着一个一样的游戏..
雪    币: 19299
活跃值: (28933)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
秋狝 2023-4-17 09:05
8
1
mark
雪    币: 219
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
Skyart 2023-4-18 14:44
9
0
mark
雪    币: 103
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mb_fecsatde 2023-5-3 20:01
10
0
联系方式
雪    币: 158
活跃值: (755)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Mars. 2023-5-4 20:10
11
0
q 1010202374
游客
登录 | 注册 方可回帖
返回