【原创】某音设备注册加密so文件破解

笔者最近在学习使用ida动态破解so文件,刚好想找个项目来练练手,在破解某音的时候,发现某音用了2个so文件对其发送请求的数据进行加密,所以笔者就从这两个开始下手,并且笔者选择了一个比较简单的ttEncrypt.so文件进行解密


前面对某音的源码进行分析,就能发现它加密的地方在ttEncrypt.so,笔者在这里就不在重复了,如果看到此文章的朋友想破解的话,建议先从源码开始看起,然后慢慢找到这个文件加载的地方,然后再进行破解,不能直接就开始破解so喔。好了废话了这么多,我直接开始吧!

一、动态调试环境

使用终端打开,连接真机!!(之前笔者在使用模拟器破解的时候,发现是失败的!我也不知道为什么,没有查,如果知道的朋友可以留言讨论一下)

AppledeMacBook-Pro:~ space$ adb devices
List of devices attached
* daemon not running; starting now at tcp:5037
* daemon started successfully
6d16cfb7d440  device
AppledeMacBook-Pro:~ space$ adb shell
santoni:/ $ su
santoni:/ # getenforce
getenforce
Permissive
santoni:/ # setenforce 0
setenforce 0
santoni:/ # cd /data/local/tmp
cd /data/local/tmp
santoni:/data/local/tmp # ./android_server
IDA Android 32-bit remote debug server(ST) v1.22\. Hex-Rays (c) 2004-2017
Listening on 0.0.0.0:23946...

紧接着要进行端口转发

AppledeMacBook-Pro:~ space$ adb forward tcp:23946 tcp:23946

最后打开ida,笔者这里是32位的

![![模块.png](https://upload-images.jianshu.io/upload_images/11633123-3c8067b324566123.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ](https://upload-images.jianshu.io/upload_images/11633123-b87ebf829105c6a0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

注意:如果使用模拟器的话pc指针会直接掉到最下面

二、开始动态调试

首先你需要自己构造一个apk,里面调用你需要破解的so文件,当然,你要会hook,把调用的输入参数获取和结果获取,你就知道输入了什么和得到什么。还有就是你需要知道输入是什么才能对加密进行破解是吧!

这个so文件调用了一个native方法是叫handleData(bytes [] bytes, int len );传进去一个字节数据和一个长度,好好分析一下吧!

首先你需要做的是找到你要调试的那个so文件,这里笔者是自己构造的,所以搜索ttEncrypt就能找到自己添加的内容了。

[图片上传中...(ttEncrypt.png-ea0603-1537953335293-0)]

搜索结果:

ttEncrypt.png
ttEncryptFunction.png

结果是这样的,很清晰的看到他加载了什么内容,这里有好几个,作者在看静态汇编代码的时候发现函数在handleData的地方调用了ss_encrypt和ss_encrypted_size所以笔者决定在handleData里面打断点

[图片上传中...(handleDataARM.png-63994e-1537953407572-0)]

双击handleData,就可以看到这个结构图,按空格就能转成arm汇编代码

handleDataARM.png

然后就可以在这里打一个断点,准备进行调试

breakpoint.png
begin.png

打好断点之后就可以开始跑了

IMG_0828.JPG

这是我自己做的apk,调用了ttEncrypt.so内部的方法,我看这个应该没有签名检验,所以直接就能调用了,据我所知,某音的另一个加密文件cms.so的签名检验巨多,所以过两天我都打算开始破解那个文件了!废话不多说,

直接按F8进行调试,注意!F7是单步调试

r3.png

看到了么,这个R3你觉得像什么,这个应该就是长度,还记得么,这个native函数传入字节数组和数组的长度是吧!我们接着往下走,因为笔者的macos打开ida调试的时候容易奔溃,所以就不截那么多图,有关键的地方才截图吧!

继续往下走,发现调用了initKey,暂时不知道有什么用,先看寄存器

initKey.png

这里可以F7跳进去看,但是笔者之前已经进去看过了,发现只是初始化一些字节,而且在ida静态代码可以查看,大家可以去自己看一下

initkeyFunc.png

接着这个顺序继续往下走,发现调用了这个ss_encrypted_size大家觉得会有什么用呢?

ss_encrypt_size.png

当笔者看到这个R0的值的时候,你会发现!这不就是输出结果的长度吗???所以计算返回长度的算法就在这里,这里笔者就不再进去看了,具体算法大家可以自行去查看,因为这里涉及某公司的利益,笔者就不放出来了。

size_20.png

继续按下面往下走,看见了到了调用了ss_encrypt这个函数,笔者点击F7进入了这个函数内部,因为如果直接往下走到话,你会发现很快就跳出handleData的函数了,所以笔者认为加密的地方就在里面,所以跳进去看了一下

ss_encrypt.png

这里就是ss_encrypt的实现,看到PUSH.W {R4-R9,LR}那么R0-R3干什么去了呢?大家看上面的图,是不是前面几句给R0-R3进行了赋值?这时候大家可以去看看寄存器里面的内容,下面就带大家看一下吧!

f7ss_encrypt.png

点击查看R0的内容,看到了么?这个不就是我们的输入吗?R0指着第一个地址下面连续的都是我们的字节,R1大家觉得存的是什么?存的是9,正正是它的长度,然后R3呢?R3存的是0x14,是16进制,翻译成10进制就是20,这不就是返回的长度么?这就明摆着是加密的地方啊

ss_encryptRo.png

尾部

到这里了,大家可以自己继续往下走下去看它的逻辑了,笔者就不带着大家继续看了!因为笔者的苹果使用ida的时候,疯狂奔溃,所以做着难受,这里就不再带大家走下去了,下面我在简单说一下它实现的逻辑吧!

首先大家记得之前我们有一串key吗?走下去发现这个key应该是个混淆代码,如果你传入的字节流长度不是16的倍数,这个算法会自动帮你补全16位,当然补全用的是它的密钥数组,存在程序的某个地方因为涉及某公司的利益,作者就不放出来了,大家自行寻找吧 使用你每个字符作为偏移量在密钥数组里面取值,取值之后程序就会对你这个字节流再做一次操作,按照你的长度来进行循环操作,每16位进行一次操作,首先取字节流的最高4位进行右移32位然后和给定的密钥(自行查找)进行异或操作的到一个新的32位二进制再转成16进制填入,然后取5-8位进行24位的右移再与一个密钥(自行查找) 进行异或操作的到新的32位二进制再转成16进制填入,然后取9-12位进行16位的右移再与一个密钥(自行查找) 进行异或操作的到新的32位二进制再转成16进制填入,然后取13-16位进行8位的右移再与一个密钥(自行查找) 进行异或操作的到新的32位二进制再转成16进制填入。并且循环,最后的到结果就是正确的结果了。

最后再说一下,笔者在这里已经完成了这个ttEncrypt.so的解密,不得不过这个小小的加密流程居然这么复杂,如果不耐心进行分析,还真不好的到,笔者在这里学到了挺多东西的!希望有兴趣的朋友可以自己研究一下,相信大家完成后会受益良多的!

转载必须得到作者同意,否则将会追究责任,本文仅仅进行学术研究,没有损害公司的利益,如果有损害公司的利益,请联系作者,笔者会将其删除

你可能感兴趣的:(【原创】某音设备注册加密so文件破解)