大家好,我是TeddyBe4r,前几期关于静态分析的文章热度不是很高,论坛里研究的同门还是太少遂决定发一期实战,这篇文章将会浅尝辄止的为各位构建出一个Windows平台下 x86/x64 CPU环境下的一个静态分析框架,并且会与IDA的基础功能进行比较,该框架仅仅是静态分析的基础如果想要在此基础上进行更多的探索则需要各位自己去完成,这个框架能干的事情非常多,譬如空闲寄存器分析,基本块分析,CFG分析,代码混淆,甚至是污点分析,我已经完成了整个框架的完整版并将他彻底构建为飘雪十二剑(我研发的一个闭源Rootkit远控平台)基础编译工具链的一个模块,但是我不能将他彻底开源(自己动手丰衣足食)我只能提取出一部分核心内容经过简化后供大家研究。这篇文章首先带领大家研究3个核心的主题在深入之前希望大家能够了解一些基本概念,如果大家对于理论知识感兴趣可以前往我前几期的文章查看。CFG又称控制流图(CFG - Control Flow Graph)控制流图是程序分析和编译器优化中的基础数据结构,用于表示程序执行过程中所有可能的控制流路径。它将程序的执行流程抽象为一个有向图,其中节点代表基本块(Basic Block),边代表控制流转移。
形式化定义
CFG 是一个有向图 G = (N, E, Entry, Exit),其中:
N:节点集合,每个节点代表一个基本块
E ⊆ N × N:边集合,表示控制流转移关系
Entry:唯一的入口节点
Exit:一个或多个出口节点基本块是编译器和程序分析中的基本单元,是一段顺序执行的代码序列,具有以下特点:基本块是构建控制流图(CFG)的基础单元,也是编译器优化的基本单位。
一个基本块 BB 是一个指令序列 {i₁, i₂, ..., iₙ},满足:基本块划分我这里再次给出划分规律,这个在我上期的静态分析文章中有提到过。虽然这篇文章看上去和神秘的F5功能相差甚远实则不然,该框架做出了F5功能的第一步。在这之前我们需要了解下IDAF5的原理,IDA一般遵守如下步骤而我们这篇文章设计采用了非SSA的标记汇编作为LLIL(严格意义上不算是LLIL不过为了方便理解和教学就使用了这种形式),并且完成了第3步,并构建了CFG和基本块划分LLIL (Low-Level Intermediate Language) 是低级中间语言,是程序分析和逆向工程中的一种中间表示形式。它将机器码抽象为更易于分析的形式,同时保留了底层的语义细节。关于设计LLIL我给出5条最为精炼的总结但是在文章中为了简化设计我们舍弃掉架构无关,我这里给出和完整版框架中不同的IL设计格式,大家在实际构建的过程中可以借助 Zydis,Capstone等反汇编框架完成该步骤的设计,这样可操作性更强方便大家动手而不需要去实现一个复杂的转换引擎。如上步骤可以通过常见的反汇编引擎轻易实现,给出一个实现后的样子
经过这样的处理之后我们即可把该反汇编后的文件格式转换为我们需要的LLIL了。我们要明确静态分析中需要的对象有哪些并且对此做出设计,我将列出所需的对象列表直接给出示例代码框架流程首先是严格按照上文所述依次构建分别是,下面我将给出最为核心的代码都标有详细的注释供大家阅读学习。首先给出流程掌握大体的结构。 输出绘制我们就给出CFG的实现把其他实现都很简单动动手就可以实现,注意CFG输出代码是AI生成的,我不推荐大家使用AIGC,可以帮忙干杂活但是核心的算法一定要手动实现,先注释后代码,注释驱动代码,会让你的编码水平得到提升然后给大家看看框架的效果吧,我们就直接和IDA9.0的基础CFG图的形式进行对比
基本块的构建
初始指令流的构建
; 这里是常规标签主要是用于标记指令标签的地址信息
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-289162.htm
[原创]实现一个基于LLIL的x86/x64的静态分析框架
388 浏览
11 回复
mark
mark
mark
mark
好
感谢分享
mark
mk
学习了
mk
感谢分享