山石网科安全技术研究院简称“山石安研院”正式成立于2020年4月,是山石网科的信息安全智库部门,山石安研院旗下包括干将、莫邪两大安全实验室,以及安全预警分析、高端攻防培训两支独立的技术团队。
今天看啥  ›  专栏  ›  山石网科安全技术研究院

从CFG图中分析ollvm控制流平坦化混淆源码

山石网科安全技术研究院  · 公众号  · 科技自媒体  · 2024-08-22 18:34

主要观点总结

本文介绍了从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图中可以看出 ………………………………

原文地址:访问原文地址
快照地址: 访问文章快照
总结与预览地址:访问总结与预览