app 公众号文章列表 so 加解密算法分析还原 | 加密 zip aes 分析

android 逆向 14 / 38

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

const 龙哥 = Function() {}

const a = 全能的傻宝,每天都会换一种姿势来分享各种操作,最近 10 月在分享密码学;
const b = 点击加入星球;
return "无敌的龙哥";

前言

想学习 unidbg android逆向 密码学 算法还原 的小伙伴可以 call 龙哥 ();
接着上一篇文章分析,本次来分析下 zip base64 的加密逻辑

0x1

v46 = sub_B178(s, v17, v11, v57);
先来看看这段代码,v46 刚好是 u 参数,调用 sub_B178 函数获取的

点进来可以看到一些算法,分别是 zip_compress aes base64

aes 算法了解的同学应该知道需要关注那些内容,不了解的可以 call 龙哥 () 跟着一起学习密码学
咱们需要关注的是
1、使用的密码长度:AES-128 or AES-192 or AES-256
2、明文是啥
3、密钥 key 是啥
4、加密模式是啥:ECB or CBC,如果非 ECB,那么 IV 是啥
5、填充方式是啥:No or PKCS5 or PKCS7

Tips: 下面一个一个来分析,先来看看 sub_B178 函数的入参是啥

1、s 是参数 a1
2、v17 是 s 的长度
3、v11 是 48字节大小的首地址加 16 的地址
3、v57 48字节大小的地址

Tips: 进入 sub_B178 函数继续分析

这里的 zip_compress 需要注意,是用的是 deflate 压缩算法
其他的 zlib gzip 实际在压缩的时候会添加上头和尾,使用这两个算法需要去掉头和尾才是真正的数据
参考链接 gzip,deflate,zlib辨析

继续分析 AES_Encrypt 函数,Base64Encode 函数可以暂时忽略,看下参数

1、v10 = v9 也就是 v9 的内存地址
2、v11 是 zip_compress 函数的结果
3、&v16 地址
4、v5 参数 a3,也就是前面 48字节的 后 32位
5、32u 32数字
6、v4 参数 a4 前面的 48字节
7、16u 16数字

Tips: 参数分析完,点击去继续分析

先分析 n_crypto::SetEncKeySym(&v20, v10, 8 * a5); 这一行代码,看像是密钥相关函数
1、&v20 char 类型的地址
2、v10 是参数 a4
3、8 x a5,a5 是参数 a5 8 x a5 = 256

SetEncKeySym 函数点进来,看到这个判断,就可以判断是 AES-256, 在AES-256中,密钥是32字节
这里的 a2 就是参数3,而参数1 = a4 = 32 字节,这里的参数1 应该就是密钥

再往下分析 padding 填充方式,目前看不出来是啥方式,不过通过参数 16u 可以猜测这个应该是 block 大小,Pcks#5 默认是 block = 8, Pcks#7 可变的 1-255,这里应该是 Pcks#7 填充,后面可以验证下

Tips: 继续分析 n_crypto::EncSym 函数

先来看下参数
1、&v21 是个内存地址。v21 在上面有初始化,a6 就是前面的 48字节,这里应该是取前 16 个字节,猜测:前 16 是 IV,后面 32 是密钥
2、v9 内存地址
3、v18 内存地址
4、v14 内存地址
5、&v20 应该是密钥的内存地址

EncSym 函数点进去,通过符号可以发现是 CBC 加密模式

前面的猜测确实正确,CBC 模式下的 IV 在运算会先跟密钥进行异或,这里应该就是异或的逻辑了

unidbg

又到了 unidbg debugger hook 阶段,验证一些数据

unidbg console debugger zip_compress

先在 0xB1B0 下个断点

运行代码,成功断下来,查看 mr0 的数据,就是我们传进来的 url

输入 n 指令单步执行,在查看 r6 的值,使用 cyberchef 转成 bas64 稍后再使用 python 来验证

这里为啥看 r6 的值呢,看下 so 就明白了 operator new[] 申请一块内存,存到 r6 寄存器,zip_compress 的加密结果存到了 v9 里也就是 r6

使用 python zlib 模块,头和尾分别是 2-4 个字节去掉即可

unidbg console debugger aes

最后再来看下 aes cbc 使用的啥填充模式,0x12970 下断点

查看 mr0 的值,第三行后面 11 都是填充的,模式就是 pkcs#7

最后

加密逻辑就分析完了,后面再看时间是否写算法还原的文章

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

发表评论

返回顶部