小红书的so比较简单, 安全程度和某音相比不是一个级别, 下面记录一次xhs算法的一个简单还原。
首先定位到算法关键位置。
通过分析,发现其实真是块就四块。 借鉴一下大佬的思路,虚假快对程序无影响,那么我们可以在真是块结束的位置,手动patch直接跳转到真实块,绕过虚假块,比如b loc_5CF32指令,可以直接改成b loc_5cF02,类似的把真实块连接起来,那么问题来了,如何确认真实块的执行顺序,这里我们借助ida的trace功能,得到真实块的so执行顺序。
我们就可以根据trace文件的内容手动还原。
未修复之前的f5 ,结果如下:
手动修复之后的f5 结果如下:
混淆已经被我们取出来,
最后把patch掉的so, 放到xhs apk上, 无报错。 代表patch成功。
更新:针对这种情况,写了一个脚本。 具体原理就是先得到函数的block,在通过特征匹配得到虚假block,我们认为不是虚假块的就是真实块(ps:死循环路径需要特判), 再通过trace文件得到真实块的执行顺序,最后把它patch起来。
去混淆之后的cfg: