终于可以发贴了。
最近看个样本,是4代注册协议了。来了兴致,分析了下
跟3代比,没有了finger和pri。 我猜测data和ep也是八九不离十,也是这两个东西
jni注册是这3个函数,比之前少了很多,后面hook了下w11是主函数加密。 之前tn,pri都是在java层加密的。现在全部放在了ndk中。
进去w11这个之后,就是ollvm混淆的,hook一遍入参之后
这里先从rsakey出发,为了验证之前的猜想。 查看引用,
跟到这一块有字符串加密了
那直接frida看内存就行。
这里推荐用unidbg去跑这个脚本,刚好之前龙哥也跑过sm,拿来就用。
先unidbg下个断点。
断下来之后在控制台直接看这一片的内存。
一清二楚了。
拿到这些,8c1e8一看就是hash.put这样的操作。
先从ep开始分析。在5280c这块查看了引用(这是另一个so,本文中调试的so不是这个地址)
unidbg断下来之后。看看这个函数的参数。 一般都是r0-r4.r0就是第一个参数。
更加确定了ep会用rsa加密
第二个参数。
分析过3代的都知道,是根据一个随机数加密的rsa。这个随机数就是指纹最终加密的aes的key。
这里我把它固定住了。
从这个函数黎赋值的跟进去
用了这些c库,那就是随机值了,当前时间为随机种子。把它固定住好分析。
然后再跟进去51200这个地址,大致看一下,也就是调用java层的rsa加密。
这里可以通过unidbg的jni打印来验证猜想。
确实是,那直接从unidbg中hook住这些结果看看。
这是我写3代的时候写的代码,结合unidbg输出看看。
果然一看
那没事了。跟3代一样。
继续分析tn,回到开始hash.put这里。也是同样的套路。废话我就不多说了。
到这里要注意,aa994是一个append操作。 byte_d51fa就是sm_tn .这个也很熟悉。。 51200就是rsa加密的函数。然后hook住这个v40.
是一串md5、从4d06c哪里打下断点来看,
v43是字符串拼接之后的东西,应该是md5了一下。拿去验证一下。结果是的。
最后在验证一下这个值。是对的, tn的加密值也就出来了。
最后重头戏,看data
data这里有很多处引用。慢慢分析吧,也可以根据unidbg先去打印一遍函数的执行流程。根据流程来trace。
这里我也是习惯断在函数的前一个地址
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里面是
的确从内存中看,也是byte流
为了进一步的验证,我把hex提取出来。解压一下试试
没啥问题。最后为了验证那个aes的算法。我们生成出来的data是根据随机值加密的。
固定住了,key也就固定住了。
拿到结果,进行解密一下,在解压缩.
正常解。最终的算法我就不放了,自己研究一下就能搞定,都是标准算法。 没有任何魔改的点。
最终试试。
没有任何毛病。
附上样本 链接:https://pan.baidu.com/s/17p3dWoFPMgPNHpNltqmEOg 提取码:mr8l app名:本地探聊陌生交友
unidbg部分的代码,需要大家自己去龙哥星球下载啦。 https://t.zsxq.com/JEUVfYf
另外:有个小问题,
有懂的大佬可以指教一下小弟。。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2021-9-10 10:47
被chionyuna编辑
,原因: 模糊化关键字