知乎x-zse-96算法

admin 2025-12-22 04:22:30 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文详细分析了知乎App中的x-zse-96算法,揭示其并非白盒AES而是一种魔改的AES查表法实现。作者通过Frida和IDA工具从Java层到so层进行逆向分析,发现该算法采用CBC模式,128位密钥,共9轮加密,使用了11张不同的表格进行查表操作。文章详细描述了加密流程、字节替换和轮密钥加操作,并提供了Python算法实现,纠正了关于该算法是白盒AES的误解。 综合评分: 88 文章分类: 逆向分析,移动安全,代码审计,漏洞分析,安全工具


cover_image

知乎x-zse-96算法

原创

Winter

Frida and So

2025年12月13日 22:52 上海

声明

本文仅供学习交流,如有侵权请联系删除!!

概述

魔改AES实现,而非魔改白盒,无任何混淆,完全不需要使用unidbg,纯借助fridaida静态分析。

Java层

okhttp3框架可通过Hook添加请求头,或者搜索x-zse-96定位法获取加密位置,一路向内部跟入,来到com.zhihu.android.o.aa方法,传入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模式,key128bit,进入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-3xorTable25张表。

10轮,无列混淆,只会执行字节代换,循环左移,轮密钥加,因此会用到SBOX盒,如下图所示,0 5 10 15这个顺序完美符合循环左移,而byte_C548又是一个256 bytes数组,最后还与roundskey进行了异或。

总结

综上所述,该ASE加密完全是魔改AES查表法,一共用到了11张表,伪代码都这么清晰,随便扣扣就成了,如下图纯python算法实现。

算法还原不是目的,写这篇文章一是为了自己看,二是纠正这不是白盒算法


查看原文:《知乎x-zse-96算法》

评论:0   参与:  2