文章总结: 本文详细分析了知乎App中的x-zse-96算法,揭示其并非白盒AES而是一种魔改的AES查表法实现。作者通过Frida和IDA工具从Java层到so层进行逆向分析,发现该算法采用CBC模式,128位密钥,共9轮加密,使用了11张不同的表格进行查表操作。文章详细描述了加密流程、字节替换和轮密钥加操作,并提供了Python算法实现,纠正了关于该算法是白盒AES的误解。 综合评分: 88 文章分类: 逆向分析,移动安全,代码审计,漏洞分析,安全工具
知乎x-zse-96算法
原创
Winter
Frida and So
2025年12月13日 22:52 上海
声明
本文仅供学习交流,如有侵权请联系删除!!
概述
魔改AES实现,而非魔改白盒,无任何混淆,完全不需要使用unidbg,纯借助frida与ida静态分析。
Java层
okhttp3框架可通过Hook添加请求头,或者搜索x-zse-96定位法获取加密位置,一路向内部跟入,来到com.zhihu.android.o.a的a方法,传入3个参数。
- 参数一:未处理的明文数据。
- 参数二:加密后的
key,在so层解密。 - 参数三:未处理的
iv。
继续跟入,来到com.bangcle.c.a方法,在此处对明文与iv进行预处理,处理逻辑单纯进行字节替换操作,而b.b同样也是字节替换,将处理后的数据传入so层进行加密。
//p0:未处理明文;p1:加密key;p2:未处理iv
return b.b(CryptoTool.laesEncryptByteArr(b.a(p0, p1, p2), p1, p2), p1, p2);
So层
在libbangcle_crypto_tool.so中进行静态注册,通过查找导出表快速定位,一路跟进,在sub_8B2C中存在检测函数,检测包名并对全局变量赋值,后续会对其进行判断。
继续跟入,进入Bangcle_internal_crypto,在此处对前面的全局变量进行检测。
继续向下走,在sub_3BA8处完成对轮密钥keys的解密,对deckeys的一系列属性进行赋值,最终解密后的数据存放到deckeys->roundkeys中。
该函数结束后,继续向下,根据deckeys->type属性对v22进行赋值,v22与填充有关,继续向下,在sub_45DC处完成填充。
填充手段与PKCS7类似,填充字节为查表得到,如明文长度为17,则需填充16-1位,填充字节为byte_AEA8[16-1]。
继续向下,进入Bangcle_CRYPTO_cbc128_encrypt,正式进入到魔改AES中,采用cbc模式,key为128bit,进入Bangcle_WB_LAES_encrypt函数。
魔改AES查表法
先进行初始轮密钥加,与标准AES查表法不同,先进行半字节异或拼接,然后查表置换,置换后又转半字节,最后两部拼接为一个字节。
v7[i] = (16 * (xorT1[(16 * (msg[i] >> 4)) ^ (keys[i] >> 4) & 0xf] >> 4)) ^ (xorT1[(16 * (msg[i] & 0xf)) ^ (keys[i] & 0xf)] >> 4)
根据key_bits计算加密轮数,9轮加密,非常有规律,完美符合查表法思想,只需要进行查表异或即可,16字节分成4组,需要异或3次,最后还要与轮密钥异或1次,一共4次,正对应下方4次异或,用到了Td0-3与xorTable2这5张表。
第10轮,无列混淆,只会执行字节代换,循环左移,轮密钥加,因此会用到SBOX盒,如下图所示,0 5 10 15这个顺序完美符合循环左移,而byte_C548又是一个256 bytes数组,最后还与roundskey进行了异或。
总结
综上所述,该ASE加密完全是魔改AES查表法,一共用到了11张表,伪代码都这么清晰,随便扣扣就成了,如下图纯python算法实现。
算法还原不是目的,写这篇文章一是为了自己看,二是纠正这不是白盒算法
查看原文:《知乎x-zse-96算法》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论