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

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

2023-9-4 14:55
11880
1
2
3
4
5
6
7
0x1 样本分析
 
样本:Y2MuamNsZC50YW9qaW5jaGVuZ3poZW4=
 
版本号:1.2.0
 
加固:360

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一下哈希算法试下。

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
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;

}
也不走这里。

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进行加密,也没有对算法进行魔改,基本上没有安全性。


[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

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

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

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