【摸鱼–1】小H书X-s算法还原
摸鱼还原xhs X-s算法,之前核心是3des据说更新之后换到了AES算法。本文介绍一种取巧获取AES密钥的方法。
补环境实现
个人习惯使用nodejs配合chrome devtools调试,所以先简单的补充一下环境。xhs补充环境的文章很多随意找一个粘贴Proxy稍微补充一下环境,能跑出和浏览器抓包类似的结果就行。
简单总结补充的环境如下:
- window:[window, sdt_source_init, external]
- document: [createelement, documentElement, cookie, querySelectorAll]
- navigator: [appCodeName, appName, platform, userAgent, webdriver, cookieEnabled]
- localStorage: [getItem]
- location: [host]
大概就是上面这些简单的环境,然后运行:
如上图能大概得到差不多结果即可。
算法分析
因为去年分析过3des算法,所以这里省略前面输入参数计算md5以及拼接x1,x2,x3,x4等等,直接介绍取巧获取aes加密密钥的方式。
- 从上面补环境的脚本开始单步调试寻找有助于分析的日志断点,这里只是粗略查找了一个地方,凑合分析,如果有更精确到运算步骤的位置欢迎评论。
这里选择这个位置对o1 和 o2 进行输出,虽然缺少中间过程,但是可以看出部分逻辑,例如前面md5以及最后base64的踪迹,最关键的是可以看到aes加密过程中10轮运行的规律和iv计算的过程这部分和X音X-Argus AES部分只能说是一模一样。 - 取巧的方案则是实用dfa的方式得到第10轮轮钥,通过工具aesschedule还原每一轮的密钥,第一轮密钥则是初始密钥,此方法多用于白盒AES分析。
- 通过日志信息在代码中添加判断进入第9轮结果,接着每次随机修改第9轮结果一个字节收集数据,使用phoenixAES计算第10轮密钥。没修改一个字节应该会造成最后结果发生4字节变化,详细细节网上案例很多。
- aes每组计算数据16字节,所以将第9轮结果挨个修改一个字节后就可以了,之所以可以这样做,是因为第一组数据是
x1=md5Result
,只要不修改输入数据那么aes第一组输入就是固定的,日志中一共计算了10轮也可以确定密钥的长度,并且输入数据也有和iv异或,可以确定算法是AES-128-CBC,但是初始向量是随每一组结果变化的。
测试
拿到密钥之后基本上所有算法就都明确了,写个python脚本随便测试一个接口。
总结
还是需要定位到能够输出计算的细节,本文使用dfa过于取巧,不具有普遍性。欢迎大佬评论能看到计算过程的断点位置。