首页
社区
课程
招聘
[原创] 记一次成功的ollvm-fla简单魔改尝试
发表于: 2025-6-1 13:47 1859

[原创] 记一次成功的ollvm-fla简单魔改尝试

2025-6-1 13:47
1859

最近在学习ollvm的时候,心血来潮地尝试着自己进行了一些魔改

如果有错误或者讲得不好的地方,欢迎各位大佬来指正

【清羽】Windows10下编译OLLVM-14.x_ollvm 编译优化后-CSDN博客

参考这位大佬的文章


原版ollvm的混淆效果

image-20250601120351090

魔改后的

image-20250601120510632

d810无法生效

image-20250601124442731

一些更复杂的例子

o2



我们先从一个普通的fla样本开始分析,并思考可能的魔改思路

图片中各个块的名称,我都尽量使用ollvm的源码中的变量名,以便后续更方便地阅读和修改代码

asm


asm2

流程大概就是,函数从insert块开始,然后进入loopEntry块开始匹配numCase,接着进入到相应的origBB块

在每个origBB块的结尾,都会给switchVar赋一个新的numCase,然后跳转到loopEnd块

loopEnd再跳回loopEntry块中的parentSwDefault块中,在这里,switchVar的值赋给了LoadSwitchVar

然后每一个childSwDefault块,都是对LoadSwitchVar进行匹配,再进行跳转。


思考一下我们在进行ollvm去混淆的时候,核心是什么?是寻找所有的origBB块

那么我们又是怎么去寻找origBB块的呢?一般而言,就是去判断当前块的后继,是否为loopEnd块

像普通的ollvm案例,我们只需做一个简单的判断就可以了

image-20250601101307573

那如果我们每个origBB的后继不是loopEnd块,也就是说不单止跳转到parentSwDefault块,也随机跳转到里面的childSwDefault块呢

那么简单地通过后继寻找orignBB就不可行了

我们先用idapython尝试一下效果

可以看到已经生成了更难看的cfg

QQ图片20250529092553

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

asm2

我们再看回这张图,可以看到在每个origBB的末尾,将numCase赋值到的是switchVar

但在childSwDefault块中,进行判断的是loadSwitchVar值

将switchVar赋值给loadSwitchVar的操作只在parentSwDefault出现

而如果origBB直接跳转到childSwDefault块中,造成的结果将是loadSwitchVar值不变,因此可能会不断地进入一个origBB块造成死循环。

那么解决方案就有几种

将每个childSwDefault块都修改为判断switchVar的值

在每个childSwDefault块中都添加loadSwitchVar = switchVar的指令


有了大概的思路后,我们就可以尝试开始对源码进行修改

先尝试将switch的判断值改为switchVar


[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 8
支持
分享
最新回复 (4)
雪    币: 263
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
学习一下
2025-6-1 22:05
0
雪    币: 6
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
感谢分享
2025-6-2 09:18
0
雪    币: 220
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
感谢分享
2025-6-5 09:37
0
雪    币: 620
活跃值: (1123)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
基于CFG识别Origin BB实际已经作用不大,仔细看你会发现原始ollvm存在SwitchVar赋值语句的就是Origin BB,所以仅仅改变CFG的意义没那么大,另外关于if和switch结构的转换可以看看llvm中自带的LowerSwitch Pass(看了你文中if、switch变换想起)
2025-6-5 21:43
0
游客
登录 | 注册 方可回帖
返回