最近在学习ollvm的时候,心血来潮地尝试着自己进行了一些魔改
如果有错误或者讲得不好的地方,欢迎各位大佬来指正
【清羽】Windows10下编译OLLVM-14.x_ollvm 编译优化后-CSDN博客
参考这位大佬的文章
原版ollvm的混淆效果


魔改后的


d810无法生效


一些更复杂的例子




我们先从一个普通的fla样本开始分析,并思考可能的魔改思路
图片中各个块的名称,我都尽量使用ollvm的源码中的变量名,以便后续更方便地阅读和修改代码




流程大概就是,函数从insert块开始,然后进入loopEntry块开始匹配numCase,接着进入到相应的origBB块
在每个origBB块的结尾,都会给switchVar赋一个新的numCase,然后跳转到loopEnd块
loopEnd再跳回loopEntry块中的parentSwDefault块中,在这里,switchVar的值赋给了LoadSwitchVar
然后每一个childSwDefault块,都是对LoadSwitchVar进行匹配,再进行跳转。
思考一下我们在进行ollvm去混淆的时候,核心是什么?是寻找所有的origBB块
那么我们又是怎么去寻找origBB块的呢?一般而言,就是去判断当前块的后继,是否为loopEnd块
像普通的ollvm案例,我们只需做一个简单的判断就可以了


那如果我们每个origBB的后继不是loopEnd块,也就是说不单止跳转到parentSwDefault块,也随机跳转到里面的childSwDefault块呢
那么简单地通过后继寻找orignBB就不可行了
我们先用idapython尝试一下效果
可以看到已经生成了更难看的cfg


虽然修改成功,但实际上修改后的程序跑出来的结果是不对的,直接死循环


我们再看回这张图,可以看到在每个origBB的末尾,将numCase赋值到的是switchVar
但在childSwDefault块中,进行判断的是loadSwitchVar值
将switchVar赋值给loadSwitchVar的操作只在parentSwDefault出现
而如果origBB直接跳转到childSwDefault块中,造成的结果将是loadSwitchVar值不变,因此可能会不断地进入一个origBB块造成死循环。
那么解决方案就有几种
将每个childSwDefault块都修改为判断switchVar的值
在每个childSwDefault块中都添加loadSwitchVar = switchVar的指令
有了大概的思路后,我们就可以尝试开始对源码进行修改
先尝试将switch的判断值改为switchVar
[培训]科锐逆向工程师培训第53期2025年7月8日开班!