首页
社区
课程
招聘
某淘X城镇unity应用协议分析
发表于: 2023-9-4 14:55 13842

某淘X城镇unity应用协议分析

2023-9-4 14:55
13842

0x2 抓包分析
图片描述

现在APP不知道为什么进不去了,用的之前的图片凑合一下

通过截图看得出来,有signaturenonce和signature很像加密。多次抓包比对,同样的参数提交signature都不一样,那么这个signature就是我们要处理的参数了。同时返回值也进行了加密。

0x3 脱壳&&反编译
图片描述

先查一下壳,360免费版的。免费的360还是随便脱的。脱好了之后直接拖入jadx来看一下。
图片描述

就一处,不会这么简单就完结了吧。
图片描述

timestampkeep没见过,frida hook一下

let SecurityUtil = Java.use("net.security.device.api.SecurityUtil");
SecurityUtil["sendPopRequest"].implementation = function (str, map, map2) {
console.log('sendPopRequest is called' + ', ' + 'str: ' + str + ', ' + 'map: ' + map + ', ' + 'map2: ' + map2);
let ret = this.sendPopRequest(str, map, map2);
console.log('sendPopRequest ret value is ' + ret);
return ret;
};
发现不走这里。

换下思路,signature 是40位的,首先想到的就是sha1。那就HOOK一下哈希算法试下。

}
也不走这里。

0X4 初识unity
图片描述
注意到app页面在第一次加载的时候有明显的卡顿,怀疑不是纯java开发。解压查看一下lib库都有哪些。注意到这里有个unity的so,大概率是unity开发的APP了。unity主要可以看成两类,dll游戏和libil2cpp游戏。这里没有看到libil2cpp,那么大概率就是dll游戏了。解压APK资源assets\bin\Data\Managed这个路径下找到Assembly-CSharp.dll就是主要逻辑所在的dll了反编译这个来进行逆向。

0X5 反编译Unity与还原算法
图片描述
下载安装ILSpy,需要.net 的运行环境,如果没有的话第一次启动会跳转到.net的下载。将dll拖进去。

选择保存代码。Vscode打开文件夹,查看代码资源。搜索signaturenonce 可以看到很明了的代码。
图片描述
那么signature就是 signaturenonce=&timestamp=&body=按照ascii码升序排序,之后加一个盐值tGgFVEed0KSZ5So4VgcXAluyELikd1eF然后进行sha1计算。验证一下,解决。
图片描述
另外就是返回值解密部分,
图片描述

图片描述

AES ECB模式。测试一下

图片描述

搞定,完结

0X6 总结

unity主要可以看成两类,dll游戏和libil2cpp游戏。其中dll游戏可以通过反编译直接看到源码来进行逆向修改,属于比较简单的。本次样本360的免费加固+dll的unity属于入门级的,适合练手。并且没有对dll进行加密,也没有对算法进行魔改,基本上没有安全性。

0x1 样本分析
 
样本:Y2MuamNsZC50YW9qaW5jaGVuZ3poZW4=
 
版本号:1.2.0
 
加固:360
0x1 样本分析
 
样本:Y2MuamNsZC50YW9qaW5jaGVuZ3poZW4=
 
版本号:1.2.0
 
加固:360
var md = Java.use('java.security.MessageDigest');
md.getInstance.overload('java.lang.String','java.lang.String').implementation = function (a,b) {
   send("======================================");
   send("算法名:" + a);
    return this.getInstance(a, b);
}
md.getInstance.overload('java.lang.String').implementation = function (a) {
   send("======================================");
   send("算法名:" + a);
    return this.getInstance(a);
}
md.update.overload('[B').implementation = function (a) {
   send("======================================");
   send("update:" + ByteToString(a))
    return this.update(a);
}
md.update.overload('[B','int','int').implementation = function (a,b,c) {
   send("======================================");
   send("update:" + ByteToString(a) + "|" + b + "|" + c);
    return this.update(a,b,c);
}
md.digest.overload().implementation = function () {
   send("======================================");
    var result = this.digest();
   send("digest结果:" + BytesToHex(result));
    //console.log("digest结果:" +ByteToString(result));
    return result;
}
md.digest.overload('[B').implementation = function (a) {
   send("======================================");
   send("digest参数:" + ByteToString(a));
    var result = this.digest(a);
   send("digest结果:" + BytesToHex(result));
//send("digest结果:" + ByteToString(result));
     return result;
var md = Java.use('java.security.MessageDigest');
md.getInstance.overload('java.lang.String','java.lang.String').implementation = function (a,b) {
   send("======================================");
   send("算法名:" + a);
    return this.getInstance(a, b);

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

收藏
免费 4
支持
分享
最新回复 (19)
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
看起来好像特别简单一样,脑子已经学会了,手还没有
2023-9-8 17:56
0
雪    币: 514
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
Assembly-CSharp.dll 为啥你这能看到函数体 我用 Il2CppDumper 出来的 dll 都看不到函数体
2023-9-8 19:33
0
雪    币: 37
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
啥工具脱的壳   求介绍
2023-9-8 20:24
0
雪    币: 295
活跃值: (4166)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
aqingadmin Assembly-CSharp.dll 为啥你这能看到函数体 我用 Il2CppDumper 出来的 dll 都看不到函数体
因为这是mono的啊mono打包的可以直接用dnspy之类的工具反编译,你那个是il2cpp的dump出来的只有结构,代码都已经全变成机器码塞进libil2cpp里了
2023-9-8 20:34
0
雪    币: 263
活跃值: (699)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
啥也不会2 啥工具脱的壳 求介绍
免费版可以看下这个https://bbs.kanxue.com/thread-268006.htm#msg_header_h2_3
2023-9-11 17:48
1
雪    币: 263
活跃值: (699)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
libil2cpp游戏 函数体是看不到的,逻辑在so里面,Il2CppDumper 出来的会有函数名和便宜,根据可疑的函数名去HOOK
2023-9-11 17:49
0
雪    币: 12
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8

这个参数在官网有详细生成介绍

2023-9-11 20:09
0
雪    币: 263
活跃值: (699)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
花天狂骨 这个参数在官网有详细生成介绍
你说的这个好像和我分析处理的不一样, signaturenonce=&timestamp=&body=按照ascii码升序排序,之后加一个盐值tGgFVEed0KSZ5So4VgcXAluyELikd1eF然后进行sha1计算。图片上写的是HMAC,或许是指的net.security.device.api.SecurityUtil下面的sendPopRequest方法?我没有去看官网,单从逆向的角度分析的
2023-9-12 10:11
0
雪    币: 263
活跃值: (699)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
印象中sendPopRequest应该是HMAC,时间太久了,记不清了
2023-9-12 10:12
0
雪    币: 3004
活跃值: (30866)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
感谢分享
2023-9-12 11:12
1
雪    币: 2114
活跃值: (3791)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
请问返回值解密函数要怎么定位
2023-9-17 18:06
0
雪    币: 263
活跃值: (699)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
mb_bppcorlj 请问返回值解密函数要怎么定位
一般先看请求部分当前文件里面有没有相关的,先单文件搜decrypt,没有的话可以全局搜一下decrypt
2023-9-18 09:26
1
雪    币: 0
活跃值: (452)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
脱壳使用什么方法?
2023-9-18 17:14
0
雪    币: 2114
活跃值: (3791)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
wx_Deity 一般先看请求部分当前文件里面有没有相关的,先单文件搜decrypt,没有的话可以全局搜一下decrypt
谢谢回复
2023-9-20 20:50
0
雪    币: 27
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
16
应该怎么抓包呢
2023-10-18 23:41
0
雪    币: 263
活跃值: (699)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
mb_ryjtkznl 应该怎么抓包呢
就像正常的APP抓包就可以了,手机设置代理
2023-10-19 09:46
0
雪    币: 28
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
18
查壳工具用的哪个呀
2024-3-27 21:40
0
雪    币: 263
活跃值: (699)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
windfgg 查壳工具用的哪个呀
appmsg github上有开源
2024-3-29 09:36
0
雪    币: 222
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
20
frida_dump脱壳的吗
2024-3-29 16:06
0
游客
登录 | 注册 方可回帖
返回
//