app shield so 加密算法分析破解还原|aes 算法分析破解

app shield 算法分析 8 / 13

仅供学习研究 。请勿用于非法用途,本人将不承担任何法律责任。

前言

前面分析了整体加密逻辑,这一章就来看看离我们最近的 aes 算法

阅读本文内容需要对 aes 有些了解,当然博主也是密码学小菜鸡,对 aes 也是一知半解,这里推荐一篇文章,有兴趣的大佬可以看看
密码学基础:AES加密算法 https://bbs.pediy.com/thread-253884.htm
一般标准的 aes 逆向咱们需要关注一下几个点
1、明文是什么 ?
2、密钥是什么 ?
3、数据填充方式是什么 ?
4、初始化向量IV是什么 ?
5、工作模式是什么 ?
前面分析的搜狗搜索 app 就是一个很好的样本,里面使用的就是标准 aes 算法,有兴趣的可移驾看看
搜狗搜索 app 微信公众号文章列表 so 加解密算法分析还原
下面开始今天的正文

AES 分析

上一篇文章是分析到了这里 sub_117A0 函数,有三个参数,分别是 参数一:JNIEnv,参数二:main_hmac,参数三:main,点进去看看

前面是是一些赋值操作,CallStaticObjectMethodV(v11, v14, dword_B5084, v10); 这里是调用 baseDecode 函数,参数是 main_hmac 字段,再往下就是获取字符串长度等,最后调用 aes 函数

点进来,做了一些处理,然后继续调用 aes 函数

这个函数,前面是定义了一些常量,中间有 for 循环,应该是初始化一些数据,在就是调用两个函数,先来看看 init 函数

aes init

init 有三个参数
参数一:目前看不出是啥
参数二:128
参数三:内存地址,应该是用来存放数据的

点进函数,这里先是调用了 key_expansion 函数,这个应该就是获取 aes 密钥的函数了
下面是两个 for 循环,具体作用未知,来看看 key_expansion 函数

key expansion

这个函数就比较清晰了,参数二传进来的是 128 所以这里是 AES-128,而 AES-128 的密钥一般是 16 个字节
再往下是个 while 循环,一共循环 10 次,aes init 的逻辑比较简单,基本就是初始化数据,看看另外一个函数 aesFunction

aes function

这个函数的参数还是比较多的,就不一一分析了

这里有两个加解密函数, encrypt decrypt,咱们这次主要看解密的,先看看 sub_4C194 函数

核心逻辑是这个 while 循环,每次循环都会先调用 a6 函数,也就是 XYAES_decrypt 函数,一共会执行 base64DenodeLength / 16 次,执行完后再来个小的 for 循环,具体作用未知,下面来看看 XYAES_decrypt 函数

xyaes decrypt

这个函数也比较清晰,都是运算逻辑,这里应该就是 aes 的轮训加密运算了

Tips:至此整个逻辑就分析的差不多了,这个样本的 aes 还算比较友好,没有做过多的符号混淆,虽然算法魔改了,但是逻辑都很清晰,下面来使用 unidbg 动态调试,辅助分析看看,一些数据

unidbg

现在入口处 aes1 函数下个端点,看看传了那些函数

成功断下来,r1 r3 这两个参数是数字,应该是 r0 r2 的长度

查看 r0 的数据,应该是 main_hmac base64Decode 出来的数据

使用 CyberChef 解码看一下,结果一样

查看 r2 数据,发现是 device_id 长度刚好 36 个字节

参数五在 msp 堆栈里,查看数据,应该是 bufferaes 入口参数分析的差不多了

在来 aesInit 函数下个端点,看看参数是啥

r0 的数据是,device_id 的前 16 个数据

r2 寄存器的数据,暂时看不出来是啥

点进来在 key_expansion 函数在下个端点

这三个参数都是我们传进来的,单步调试,然后在查看 r2 寄存器的数据 0xbffff488,分析下 key_expansion 就知道数据最终是存到参数三的地址里了

这里猜测应该就是生成的 aes key

这里的两个 for 循环都是取 v16 + 60 的数据,v16 = a3 = r2 咱们直接看下数据

查看 241 个字节,在 arm 里地址加一就是加四个字节0xa = 10

key_expansion 里可以看到这里赋的值

再来这里下断点,查看输入

参数一是 hmac 解码的结果,参数三是数字 0x60 应该是 hmac 的长度

参数二是 buffer 应该是用来存放结果的,可以先记录地址,参数四应该是前面 aes-init 的结果

参数五的数据,是前面的四个常量

输入 n 单步执行,再次查看 参数二的数据,发现有数据了,应该是 aes 的解密结果

python

这个 aes 算法还是可还原的,最终使用 python 还原出来,大概 500 代码左右

运行结果也是跟 unidbg 一样的

最后

本章废话还是比较多的,不过总算是分析完了,如果有不懂的小伙伴可以加我一起讨论
下一章再来分析看看 md5 算法

2 条评论
本文作者:
本文链接: https://www.qinless.com/?p=630
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 qinless 的博客!
100

2 条评论

44soul

大佬有看新版的么,找不到libshield.so在哪

回复

会爬山的小脑虎

@44soul 没看新版的,听说挺复杂的,so 文件都隐藏的

回复

发表评论

返回顶部