主要观点总结
本文介绍了从CFG图中分析ollvm控制流平坦化混淆源码的过程,包括概览、分析源代码和结语。
关键观点总结
关键观点1: 控制流平坦化(Control Flow Flattening)是作用于控制流图的代码混淆技术,其基本思想是通过插入一个“主分发器”来控制基本块的执行流程,将每个basicblock都转为switch中的case,抹去原分支逻辑关系。
文章首先介绍了控制流平坦化的概念和基本思想,然后详细阐述了如何将ollvm的flatten以插件形式移植到llvm18 new pass中,包括概览、分析源代码和结语三个部分。
关键观点2: 文章通过具体的例子详细解释了控制流平坦化的实现过程,包括将if语句转换为switch语句,将基本块保存到向量中,生成switch随机的case值,将基本块放入switch中,修正各个bb(case块)的连接关系等步骤。
这个过程涉及到了LLVM IR和CFG图的转换,以及控制流图的修改,需要深入理解LLVM的工作原理和代码混淆技术。
关键观点3: 文章最后提到了控制流平坦化的变种和魔改,指出目前对于程序保护不再使用标准的控制流平坦化,而是使用各种变种,这些变种已经非常多样化,没有通用的反flatten方法。
这提醒我们在面对代码混淆时需要根据具体情况进行分析,了解所使用的混淆技术的基本原理和特性,才能更好地进行逆向工程和安全分析。
文章预览
从CFG图中分析ollvm控制流平坦化混淆源码 本文中的代码是将ollvm的flatten以插件形式移植到了llvm18 new pass中, 代码会略有不同, 但逻辑是一样的。 1. 概览 控制流平坦化(control flow flattening)是作用于控制流图的代码混淆技术,其基本思想是重新组织函数的控制流图中的基本块关系,通过插入一个 “主分发器” 来控制基本块的执行流程: 简单来说就是把每个basicblock都转为了switch中的case, 抹去了原分支逻辑关系。 比如以下代码: # include int main ( int argc, const char * argv[]) { if (argc > 2 ) puts ( "argc > 2" ); else puts ( "argc < = 2" ); return 0 ; } 看下其IR和汇编层面的CFG图: 原逻辑是很清晰的, 满足if就走右分支, 不满足就走左分支, 即使在汇编层面的CFG图中也具有清楚的逻辑。 但是被flatten了之后就看不出原分支逻辑了, 从IR的CFG图中可以看出
………………………………