基于IntelPin的自动化分析系统设计与实现
摘要
关键词
IntelPin;自动化;病毒;分析
正文
1 Prometheus介绍
Prometheus实现将函数流程、API调用进行整理展示,并且提供跳转至结构接口,这样就可以在实际项目分析中直观的分析出测试程序的函数调用,并且通过项目的参数查看接口可以清楚的看出API调用的参数,这样甚至于可以达到仅通过查看敏感API调用即参数来分析整理出测试项目的行为。
为此,需求与产品架构已经分析完毕,并且决定在后续的工作中完成此项目的研发。
1.1关于Pintool的研究分析
Pin 提供了丰富的 API,可以抽象出底层指令集特性,并允许将寄存器内容等上下文信息作为参数传递给注入的代码。Pin 会自动保存和恢复被注入代码覆盖的寄存器,以便应用程序继续工作。同时,对符号和调试信息的有限访问也是可用的。
Pin 拦截可执行文件的第一条指令的执行,并为从该指令开始的直线代码序列生成(“编译”)新代码。然后它将控制转移到生成的序列。生成的代码序列与原始代码序列几乎相同,但 Pin 确保它在分支退出序列时重新获得控制权。重新获得控制权后,Pin 为分支目标生成更多代码并继续执行。Pin 通过将所有生成的代码保存在内存中来提高效率,这样它就可以被重用并直接从一个序列分支到另一个序列。
在 JIT 模式下,唯一执行的代码是生成的代码。原始代码仅供参考。在生成代码时,Pin 为用户提供了注入自己的代码(插桩)的机会。固定所有实际执行的指令。他们居住在哪个部分并不重要。虽然条件分支有一些例外,但一般来说,如果一条指令从未执行过,那么它就不会被检测。
探针模式是一种使用 Pin 在指定例程开始处插入探针的方法。探针是放置在指定例程开始处的跳转指令。探针将控制流重定向到替换函数。在插入探针之前,指定例程的前几条指令被重新定位。替换函数调用被替换的例程并不少见。Pin 提供了重新定位的地址以促进这一点。
许多在 JIT 模式下可用的 PIN API 不适用于探测模式。特别是,探针模式不支持 Pin 线程 API,因为当应用程序本地运行时,Pin 没有关于线程的信息。工具编写者必须保证放置探针的地方没有跳转目标。一个探针最长可达 14 个字节。
此外,工具编写者有责任确保当前没有线程正在执行插入探针的代码。鼓励工具编写者在加载图像时插入探针以避免此问题。卸载图像时,Pin将自动移除探针。
使用探针时,必须使用PIN_StartProgramProbed()API启动Pin。
1.2编程语言的选择
其中Prometheus主要由C#实现:C#作为一种创新性的新式编程语言,它巧妙地结合了最常用的行业语言和研究语言中的功能。在保持C#设计思想不变的同时,Microsoft 在 C# 语言中引入了几种潜在的新功能,提高了开发人员在语言构造方面的效率。
此外,与其他严格的类型实现相比,泛型的 C# 实现降低了代码的膨胀速度。使用泛型创建具有类型的集合,可以在保持操作性能优势的同时避免创建每个类的特定变体。例如,程序可以创建一个参数化的 Stack 类,而无需创建用于存储整数的 IntegerStack、用于存储字符串的 StringStack 以及用于存储 Customer 类型的 CustomerStack。这样可以增加代码的可读性。只需创建一个 Stack 类,程序就可以将与某个堆栈相关联的所有操作封装在一个使用方便的类中。然后,在创建 Customer 类型的 Stack 时,尽管其中存储了 Customer 类型,但显而易见,程序使用的仍然是堆栈数据结构。
作为一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。被认为是一种中级语言,因为它综合了高级语言和低级语言的特点。
1.3 PrometheusUI框架的选择
SunnyUI.Net 是基于.Net Framework 4.0+、.Net Core3.1、.Net 5 框架的 C# WinForm 开源控件库、工具类库、扩展类库、多页面开发框架。
由原生控件开发,参考 Element主题风格,包含 按钮、编辑框、下拉框、数据表格、工控仪表、统计图表在内的常用控件超过 70 个,满足常规开发需求,每个控件都精雕细琢,注重细节;包含 Element 风格主题 11 个,其他主题 6 个,包含主题管理组件 UIStyleManager,可自由切换主题。
1.4应用前景分析
本项目基于插桩技术实现,指在保证原有程序逻辑完整性的基础上,在程序中插入探针,通过探针采集代码中的信息(方法本身、方法参数值、返回值等)在特定的位置插入代码段,从而收集程序运行时的动态上下文信息。
通过动态Hook在二进制每一个函数调用中插入一个二进制代码片段,通过污点传播分析技术自动分析函数调用参数返回值等等,从而构建出一个函数调用关系树,从而帮助分析人员更好的分析病毒行为,极大的方便了逆向分析的效率。
综合以上的特点,可以将其运用到实际中,提高二进制安全从业人员分析二进制文件的效率,应用前景良好。
2 作品设计与实现
2.1系统架构
系统主要基于.Net framework 使用C#语言的Winform技术实现GUI客户端,使用C/C++作为项目服务端。服务端使用intel pin二进制动态分析框架作为基础设施,基于这个基础设施开发Mypintools实现特定功能的二进制插桩。
Client端面向用户提供用户易于使用的可视化接口。Client段通过Socket通信与Server段建立连接使用Server提供的数据服务。Pin会将MyPintool作为动态链接库加载至pin自身的虚拟进程空间中,并接管使用Mypintool的功能。Server端通过Windows平台的命名管道技术(类似内存共享)与Mypintool进行通信。
2.2系统工作原理
下面主要介绍一下系统各模块之间是如何进行交互,各模块的主要工作原理。
2.2.1 Client模块
Client的模块的职责是负责与用户进行交互,提供方便使用的可视化接口。Prometheus Client负责与用户交互的四个界面类分别为MainForm、ApiForm、CallTreeForm、StringForm,而LogFrom负责内容呈现和与Server端进行Socket通信。
Client模块内部的关系如同下图所示。
图1 Client模块
2.2.2 Server模块
Server模块主要负责启动基础设施pin并将待分析二进制文件与MyPinTool加载至pin中,建立与pin中MyPinTool的命名管道通信,接收pin中MyPintool对二进制文件的动态分析结果,同时与Client端建立Socket TCP连接,将分析结果数据简单处理后发送给Client端,Client再将数据处理后呈现给用户。
Server段主要行为分为命令行参数解析、Socket通信初始化、命名管道初始化、启动pin以及持续监听指定TCP端口和命名管道。
参数解析功能主要需要用户指定客户端IPv4地址、目标二进制文件路径这两个必选参数,除此之外还有几个可选设置包括指定模块以及模块相关命令行参数。
参数指定正确后开始初始化与客户端的Socket连接。该SocketAPI 使用windows内置的Socket通信API,固定监听10086端口,连接类型为TCP。初始化完毕后Server端会持续监听10086端口,等待客户端端发来的确认字符串,以确定客户端也准备就绪。客户端与服务端约定的确认字符串信息为HereWeGo。
在服务端成功确认到来自客户端socket的确认信息后,开始进行下一步启动pin.exe。首先确认参数解析是可执行文件是否为PE文件,同时确定是32位和是64位可执行文件。接着就是根据可执行文件的信息选择将对应位数的MyPinTool动态链接库,添加至pin.exe启动时所需的命令行参数中。一切完毕之后通过CreateProcessA以指定命令行参数的形式创建pin.exe进程。
在Socket通信与pin启动完毕后,通过CreateNamedPipeA函数创建命名管道。本系统中约定名称为\\\\.\\pipe\\PrometheusPintoolNamedPipe, 管道可读可写、用于消息传递,无超时设置,用于在pin进程与Server端进程之间进行通信。
随后会将Server端与pin进程之间通信的结果简单处理通过Socket套接字传输到客户端。
2.2.3 MyPinTool模块
MyPinTool模块的借助Intel Pin框架提供的API实现动态的二进制插桩。其中MyPinTool主要监控了线程、函数调用、字符串引用、模块加载等几个方面。
MyPinTool首先仍然处理Server传递过来的命令行参数,其中主要是检测是有额外指定的模块路径。
处理完命令行后同样初始化一个命名管道用于与Server端进行通信。需要注意的是命名管道通信双方必须保证打开命名管道时管道名称一致。
随后开始将自身编写的指令监控函数添加至Pin中。MyPinTool一共编写了四个指令监控函数,分别是用于模块加载、函数栈Trace、线程启动与线程结束和字符串引用。
模块加载监控函数会一直监控可执行文件的模块加载情况,包括后续新增模块,并将这些模块加载的信息通过命名管道传输至服务端。
函数栈Trace会监控目标可执行文件运行过程中调用函数产生的函数堆栈Trace,并记录这些Trace的信息,包括函数调用参数信息,返回值信息,返回至那个地址那个函数等等。这些Trace的信息同样会通过命名管道发生至服务端模块。
线程启动与线程结束监控函数主要记录目标可执行文件在运行过程中的线程启动和线程退出情况,并记录下相关信息,包括线程ID,线程资源等有用的信息,同样通过命名管道将这些信息传输至服务端。
字符串引用监控函数则会将指令执行过程中使用的字符串及其引用信息记录下来,并通过命名管道将这些信息传输至服务端。
2.3系统主要功能
Prometheus是一个基于Intel Pin的二进制文件自动化分析系统,用于帮助二进制安全领域从业人员快速分析二进制可执行文件行为的工具。系统可以全程监控二进制文件运行过程中的函数调用与堆栈Trace、线程操作、字符串信息和函数调用关系,通过收集这些程序运行时信息刻画一个二进制文件的行为画像,帮助二进制分析人员分析程序。
3 创新性说明
根据对安全行业逆向分析师的调查发现,市场上缺少一个能够树状展示程序结构逻辑与函数调用的分析系统,根据Intel推出的Pintool与相关的拓展文档,还有几年来较火的二进制插桩技术,基于此开发了这款基于IntelPin的自动化结构分析系统,此系统具有如下创新性:
(1) 技术性创新,该系统使用动态Hook与污点传播技术实现自动化结构分析。
(2) 产品便携性强,作为一个轻量级系统,该程序dll依赖单一,程序适配性强。
(3) Prometheus主系统跨平台,只要编译不同平台的探针,便可以将所有平台程序的结构逻辑展示到主系统展示。
(4) 产品性能良好,该产品主系统使用C#开发,其中调用了自动回收资源等性能管理功能,探针程序使用C++开发,经过性能与安全性测试,测试结果均为良好。
(5) 拓展性强,主系统提供添加功能API,只需提供接口数据以及功能代码即可定制功能。
(6) 交互良好,程序主系统功能实用性强,易懂易上手。
产品实现了自动化分析程序的函数调用流程与展示程序对系统API调用及其调用位置,令逆向分析人员对程序分析更加便捷,能够一针见血的找到某次函数调用在函数流程位置,从而达到事半功倍的效果。
4 总结
在发展日益迅速的互联网下,病毒木马等非法软件更是层出不穷,甚至在哪之上,延伸出了APT攻击,即高级可持续威胁攻击,这些攻击通过各种方面来撒播恶意文件,最终实现介质感染,这一类攻击特点是针对性强,组织严密,高隐蔽性,以及持续时间长。最让用户难以防范的是这类恶意文件在传播中不会被防护软件视为恶意文件,这其中一大部分原因就是对系统敏感API的深层次的隐藏,导致防护软件的行为监控模块失效。
基于此,开发了这一款Prometheus分析系统,该程序可以直观的展示出测试文件所调用的函数结构与API列表,并且可以直观的找到测试其API调用时期与函数关系位置,让逆向分析者更加便捷的拿到函数调用流程与函数调用列表,以做到令恶意软件无所遁形。
参考文献
[1] 罗文华.基于逆向技术的恶意程序检测方法研究[J].警察技术,2012(06):26-28.
[2] 田志宏.网络空间高隐蔽未知威胁检测与溯源[J].信息通信技术,2020,14(06):4-7.
[3] Yang Pan,Kang Fei,Zhao Yuntian,Shu Hui. DRTaint: A Dynamic Taint Analysis Framework Supporting Correlation Analysis Between Data Regions[J]. Journal of Physics: Conference Series,2021,1856(1).
[4] 焦龙龙,罗森林,刘望桐,潘丽敏.结合路径标签和数据变异的模糊测试关键数据定位方法[J].北京理工大学学报,2020,40(09):1009-1017.
[5] 丛海.APT攻防之十大要点[J].数字传媒研究,2021,38(01):41-48.
[6] 梁晓兵,孔令达,刘岩,叶莘.轻量级嵌入式软件动态二进制插桩算法[J].信息网络安全,2021,21(04):89-95.
...