首页
论坛
课程
招聘
[原创]某math美4代设备注册加密分析
2021-9-8 18:43 14067

[原创]某math美4代设备注册加密分析

2021-9-8 18:43
14067

终于可以发贴了。

仅学习交流用途

最近看个样本,是4代注册协议了。来了兴致,分析了下

 

hHgNl9.png

 

跟3代比,没有了finger和pri。 我猜测data和ep也是八九不离十,也是这两个东西
hHgtSJ.png
jni注册是这3个函数,比之前少了很多,后面hook了下w11是主函数加密。 之前tn,pri都是在java层加密的。现在全部放在了ndk中。

 

进去w11这个之后,就是ollvm混淆的,hook一遍入参之后
hHg8FU.png

 

这里先从rsakey出发,为了验证之前的猜想。 查看引用,
hHgGYF.png
跟到这一块有字符串加密了
hHgJW4.png
那直接frida看内存就行。

 

这里推荐用unidbg去跑这个脚本,刚好之前龙哥也跑过sm,拿来就用。

 

先unidbg下个断点。

1
2
Debugger debugger = emulator.attach();
debugger.addBreakPoint(module.base + 0x17E00+ 1);

断下来之后在控制台直接看这一片的内存。

 

hHgwex.png
一清二楚了。

1
2
3
4
5
6
7
8
sub_8C1E8(v48, &byte_DB176, *orgation);
sub_8C1E8(v48, &byte_DB183, &byte_DB186);
sub_8C1E8(v48, &byte_DB18E, *appiddetaily);
sub_8C258(v48, &byte_DB194, COERCE_UNSIGNED_INT64(2.0), HIDWORD(COERCE_UNSIGNED_INT64(2.0)));
sub_8C258(v48, &byte_DB19B, COERCE_UNSIGNED_INT64(3.0), HIDWORD(COERCE_UNSIGNED_INT64(3.0)));
sub_8C1E8(v48, &byte_DB1A4, v52);// data  这个时候的data已经加密好了 随机数的md5key
sub_8C1E8(v48, &byte_DB1A9, v50);// tn a100str(有b1,就是data加密前的str)+ep+orgation+appid+sm_tn 的md5 加密,在一次rsa
sub_8C1E8(v48, &byte_DB1AC, v51);// ep 随机数的rsa

拿到这些,8c1e8一看就是hash.put这样的操作。

 

先从ep开始分析。在5280c这块查看了引用(这是另一个so,本文中调试的so不是这个地址)
hHgUyR.png
hHgaO1.png
unidbg断下来之后。看看这个函数的参数。 一般都是r0-r4.r0就是第一个参数。
hHg0w6.png
更加确定了ep会用rsa加密

 

第二个参数。
hHgsYD.png
分析过3代的都知道,是根据一个随机数加密的rsa。这个随机数就是指纹最终加密的aes的key。

 

这里我把它固定住了。
hHgrFO.png
从这个函数黎赋值的跟进去
hHgBTK.png

 

hHgyfe.png
用了这些c库,那就是随机值了,当前时间为随机种子。把它固定住好分析。

 

然后再跟进去51200这个地址,大致看一下,也就是调用java层的rsa加密。

 

这里可以通过unidbg的jni打印来验证猜想。

 

hHg26A.png
确实是,那直接从unidbg中hook住这些结果看看。
hHgcSH.png
这是我写3代的时候写的代码,结合unidbg输出看看。
hHgIk8.png
果然一看
hHgROI.png
那没事了。跟3代一样。

 

继续分析tn,回到开始hash.put这里。也是同样的套路。废话我就不多说了。
hHggld.png
到这里要注意,aa994是一个append操作。 byte_d51fa就是sm_tn .这个也很熟悉。。 51200就是rsa加密的函数。然后hook住这个v40.

 

是一串md5、从4d06c哪里打下断点来看,
hHgh0P.png
hHgLXn.png
v43是字符串拼接之后的东西,应该是md5了一下。拿去验证一下。结果是的。
hHgblj.png
最后在验证一下这个值。是对的, tn的加密值也就出来了。
hHgotS.png
最后重头戏,看data
data这里有很多处引用。慢慢分析吧,也可以根据unidbg先去打印一遍函数的执行流程。根据流程来trace。
hHg4Tf.png
这里我也是习惯断在函数的前一个地址
hHgTfg.png
v68就是之前那个随机数了。v'66是res,那么v67是啥。

 

v54 = sub_6D46C(a3, &v67);

 

这个函数引用了。a3就是我们需要加密的str。 这个把a3做了一些操作。

 

deflateInit2_(&strm, 9, 8, -15, 8, 0, &byte_D5C55, 56); deflateEnd(&strm);

 

里面用到了压缩算法,那就是把整体的a3压缩了一遍,在aes一下。 4c140里面是
hHgHpQ.png
hHgq6s.png
的确从内存中看,也是byte流
为了进一步的验证,我把hex提取出来。解压一下试试
hHgXmq.png
没啥问题。最后为了验证那个aes的算法。我们生成出来的data是根据随机值加密的。

 

固定住了,key也就固定住了。

 

拿到结果,进行解密一下,在解压缩.
hHgv7V.png
正常解。最终的算法我就不放了,自己研究一下就能搞定,都是标准算法。 没有任何魔改的点。

 

最终试试。
hHgzkT.png
没有任何毛病。

 

附上样本 链接:https://pan.baidu.com/s/17p3dWoFPMgPNHpNltqmEOg 提取码:mr8l app名:本地探聊陌生交友

 

unidbg部分的代码,需要大家自己去龙哥星球下载啦。 https://t.zsxq.com/JEUVfYf

 

另外:有个小问题,
hHgj00.png
有懂的大佬可以指教一下小弟。。


【公告】【iPhone 13、ipad、iWatch】11月15日中午12:00,看雪·众安 2021 KCTF秋季赛 正式开赛【攻击篇】!!!文末有惊喜~

最后于 2021-9-10 10:47 被chionyuna编辑 ,原因: 模糊化关键字
收藏
点赞5
打赏
分享
最新回复 (7)
雪    币: 9
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
_px 活跃值 2021-9-8 18:53
2
0
雪    币: 228
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
爱你的大饼头 活跃值 2021-9-8 19:02
3
0
牛哇,大佬
雪    币: 2399
活跃值: 活跃值 (429)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
淡定小胖子 活跃值 2021-9-8 19:54
4
0
tql
雪    币: 1616
活跃值: 活跃值 (2822)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lhxdiao 活跃值 2021-9-8 23:05
5
0
不错,不过下一个版本该改成Native的map了吧
雪    币: 1088
活跃值: 活跃值 (1303)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
chionyuna 活跃值 2021-9-8 23:40
6
0
下个版本估计上vmp了
雪    币: 703
活跃值: 活跃值 (13333)
能力值: ( LV9,RANK:216 )
在线值:
发帖
回帖
粉丝
0x指纹 活跃值 4 2021-9-9 18:57
7
0
这关键字文章容易无了,推荐模糊化下
雪    币: 1088
活跃值: 活跃值 (1303)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
chionyuna 活跃值 2021-9-10 10:47
8
0
0x指纹 这关键字文章容易无了,推荐模糊化下
遵命~
游客
登录 | 注册 方可回帖
返回