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

app shield 算法分析 9 / 13

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

前言

上一篇文章分析了 aes 算法,这一篇就来看看 md5,话不多说开始干

md5 分析

intercept 函数的 0x93EB0 就是 md5 的入口函数,有四个参数,先不分析具体传的啥了

这里的 sub_44418 函数,是 md5 init 逻辑,点进去看看

经过动态调试走的这个分支

点进来,这些逻辑看不出来是啥

往下走,就是核心逻辑了,这里的两个 for 循环,会拿前面 aes decrypt 结果跟 0x36 0x5c 进行异或,到的新的 hex 数据,然后在调用 md5 init update transform 等函数,来看看 sub_4C4F4 init 函数

没啥逻辑,就最后获取一个内存地址,是个函数跳转过去,暂时静态没法分析,稍后动态调试看看

sub_4C5C0 update transform 函数也是同样的逻辑,好家伙,看来只能上 unidbg 了啊

unidbg

先来看看 md5Handler 入口函数的输入是啥,unidbg 下个断

参数一,参数二,看不出来是啥

参数三报错了,参数四是字符串 main

sub_44418 md5 init 函数入口处,在下个断点

断下来,参数二跟参数四都是数字,应该就是,参数一参数三的长度了

参数一看不出来是啥,感觉中间应该是内存地址,参数二看起来有点熟悉,是前面 aes 解密的结果,不清楚的可以看看上一篇文章

这里下个断点

参数一未知,参数二是 aes 解密结果,加上未知地址

参数三是数字 64,参数四也是未知的

接着来到了这里,r0 ^ 0x36,所以我们要在获取 r0 数据下个断点

这里是 r0 + 0x14 = 0x402a6014 在取出 0x402a6014 地址的第一个字节也就是 0x9f

0x402a6014 地址的数据就是 aes 解密结果,长度 64 这里只需要循环 64 次即可

再来这里下断点

这里执行 r1 寄存器的函数,s 跟进去,然后在复制内存地址,ida 里跳过去

来到了这里,调用了 md5Init 函数,参数二是个常量

进入 md5Init 函数,在开头处下个断点

参数一是个 buffer 应该是用来存放结果的,参数二是个常量数据

可以复制这个地址 ida 跳转过去

这里可以看到密密麻麻的常量数据,随便复制一个 google 搜索一下,原来是 md5k

再来分析 md5Init 函数

先是调用 _aeabi_memclr4 清空 a1 348 字节数据
在把 md5 的四个常量 存进前 16 个字节里,这里的四个常量看起来不是标准的
*参数二如果不为空的话,在吧 k 值的 256 个字节数据,复制到参数一的 23 4 字节后面

接着回到 sub_4C5C0 md5 update transform 函数,下个断点

s 进入函数,ida 跳转过去,进入 sub_4CFAA 函数,开头下断点

查看参数一的 348 个字节,正是前面 md5init 函数结果

参数二还是 aes 结果,参数三是个数字 0x40

这里就是最后一个处理函数了,判断赋值,最后调用 md5Transform 函数进行运算获取结果,运算结果就不看了,再回到入口函数处

第一个 md5 init 函数,分析完了,下面两个也是核心逻辑

最后

介于篇幅原因,这一篇就到这里了,写文章分析 so 太难了,需要截大量的图片
这个 md5 算法还原有很多细节需要处理,想还原的小伙伴一定要有耐心,最终还原好的话差不多有个 700 行代码左右
下一篇文章,就来看看最后一个算法,应该是某红书自己写的数据处理算法 XY-DATA

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

发表评论

返回顶部