百度加固libbaiduprotect.so
1、本文是对特定样本ollvm的分析,提供一种反混淆的方法思路,包含详细的分析过程和针对该样本的反混淆脚本,不包含通用的ollvm反混淆脚本。
2、本文仅分析init_array中的第一个函数sub_88060 ,其余函数的反混淆可按照本文的思路自行处理。
对bcf和fla进行还原
ida查看函数的伪代码,包含大量的 ((dword_C0118 * (dword_C0118 - 1)) & 1) == 0 || dword_C0120 < 10 判断。
通过简单计算可知,该判断条件的结果永远为 false 。
所以我们要想办法把该判断识别出来,并把无效跳转给 nop 掉。
转到汇编窗口,找到该条件的汇编指令,
通过分析可知,最后的 B.EQ 永远不会跳转,所以把该指令 nop 即可。
先简单写个脚本尝试一下,按顺序匹配指令。
脚本执行后,发现只处理了一部分,
找到未识别的地方,查看汇编指令,发现这些指令并不全在一起,中间可能插入其他指令。
然后发现,未识别的这个地方最后8条指令是和前面分析的一致,而且前面的指令是取值,核心的判断逻辑是后面这8条指令,
于是直接把脚本中多余的指令判断全删除,只保留 AND 开始的指令。
ida重新加载so(上一次脚本把部分跳转指令nop掉了,直接执行会导致本次nop掉正常的跳转)
删除部分指令判断后,重新执行脚本,发现任然有部分未被处理。
分析后发现,最后几条指令之间也可能插入有其他指令。
再次修改脚本,在每两条指令中间,都加上判断。
ida重新加载so(上一次脚本把部分跳转指令nop掉了,直接执行会导致本次nop掉正常的跳转)
执行修改后的脚本,查看伪代码,判断条件全都被清除了。
此处再提供一种简单的处理方法,ida生成的伪代码之所以这么多垃圾代码,是因为bcf所引用的内存属性包含可写属性,所以我们可以通过将其引用的内存地址变为不可写,这样ida就会自动进行优化。
通过查看代码可知,bcf所引用的地址为 dword_C0118 和 dword_C0118 ,这两个地址都属于.bss段
.bss段的内存属性为可读可写,为了不影响ida对.bss中其他变量的分析,把这两个地址单独放在一个段。
发现这两个变量在.bss段的末尾,而.prgend段在.bss后面,并且.prgend没有内容,
因此可直接修改这两个段的大小,然后把.prgend段属性改为不可写。
手动设置比较麻烦,直接通过脚本设置一下。
执行脚本修改段属性后,效果和直接nop跳转一样
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2023-6-6 08:44
被卧勒个槽编辑
,原因: