首页
社区
课程
招聘
[原创]IDA静态逆向分析模型原理透析
2021-3-20 19:39 8975

[原创]IDA静态逆向分析模型原理透析

2021-3-20 19:39
8975

对原理的分析和学习,可以加深我们对技术的认知,同时,我相信技术的本质都有共同性。当我们掌握了它,是可以达成事半功倍的效果。




逆向分析的目标是理解一个系统中软件以便更容易地进行增强功能、更正、增加文档、再设计或者用其他的程序设计语言再编码。

下面是我通过搜集的资料,给大家分享一个关于IDA进行静态逆向分析的规则框架。



如上图所示,该模型框架分为预处理模块、函数识别模块、类识别模块、异常处理识别模块、综合分析模块。其中,预处理模块,是对二进制可执行代码进行反汇编和初步分析,去除软件保护机制,初步识别PE文件格式、资源及导入导出表、程序入口等信息。函数识别模块用于识别系统库函数和用户函数,包括对变量、表达式、语句、函数传参调用和函数执行流程的分析。类识别模块用于识别存在于二进制文件中的类布局、对象结构、RTTI信息、this指针的使用,从而分析出成员变量和成员函数,推导出原始的类结构。异常处理模块用于识别二进制可执行代码中存在的异常处理信息,包括SEH和C++异常。综合分析模块对于上述的三个模块的处理进行综合分析,推导出二进制可执行代码对应的源代码、软件架构、算法、设计模式和文档。

或许上面的内容,看不懂,然后这里有另一张详细模型。(这张图,可以详细解释IDA静态逆向分析模型)


1. 分析前处理的原理


这里我对上图的内容进行一个简单的解说。为了便于分析可执行代码,去除程序保护,需要先用外壳探测程序获得目标程序所用保护的类型,然后针对该类型使用解包器、破解、脱壳、调试、内存转储等,将实际执行的代码剥离出来。对于打包器或者加壳工具对源程序和导入表造成的破坏有,还需要我们使用相应的工具来恢复。

分析前处理,还可以识别程序编写的语言,这有助于程序内用到的编程语言相关的库函数的签名识别。

一般手工分析程序编写语言可以通过剖析入口点特征,能快读定位编程语言,甚至编写库。另外还有一种可能,就是入口点只是一层语言外壳。所以更通用的方式是使用IDA等专业工具的库函数签名机制。


2. 分析程序中用到的函数原理


在Windows中,代码共享是进程通信的核心思想,用户程序不能直接控制硬件,也不能和Windows内核通信。所以Windows提供了各种功能的dll,这些dll的输出函数可以为用户程序提供内核服务,用户进程会经常调用API实现特定的功能。通常情况下,我们会使用PE导入表查看静态加载的API。


3. 分析程序中的资源原理

PE格式常见的资源包括位图、加速键、光标、图标等,分析PE资源可以通过调试技术快速定位到程序执行流程的关键点,其中字符串所包含的信息较为敏感,通过观察字符串和程序执行逻辑的变化,有助于快速定位到关键代码。

对于有界面框架的程序,对话框和菜单有着特殊的重要性。比如,在MFC工程中,根据菜单和对话框操作相关API,以及对话框中子控件资源属性和菜单ID,可以很容易分析出当前代码所产生的行为。

导入和导出函数可以用于定位到程序主干代码,便于理清逻辑。


4.分析入口函数的原理透析

程序的入口点是程序最先执行的代码位置。这里有很多初始化的操作。程序入口分为真正入口和用户入口。以MSVC为例,应用程序的真正入口点并不是main/WinMain/DllMain及其宽字符形式(w-)(这部分属于用户入口),这些函数仅仅是真正入口点(如start)所执行的一个可由用户重载和自定义的函数而已。对入口函数启动部分流程和库函数使用的分析,可以进一步确定程序相关的编程语言信息和使用库函数信息。

函数入口在开始执行用户入口函数之前所做的操作有:获取平台版本、初始化堆空间、初始化命令行参数、初始化环境变量、初始化全局数据和浮点寄存器等,可以通过该流程和用户入口函数的参数类型,找到用户入口函数。同时,在所有用户函数执行完之后,程序并没有结束运行,而是继续执行一些清理工作,例如exit 和 atexit函数,最后调用API终结进程,这部分也是在库函数代码中实现的。


5.识别库函数的原理

对于程序的分析,不可避免地会遇到库函数,而且通常这些库函数代码量会比用户实际编写代码量多出几倍。由于数量巨大,分析时间长,且库函数常常比简单地程序代码更加复杂而难以理解。

IDA使用了一种高效的方式,使用二叉树形式组织的标准库检索字节序列,这种搜索方式的时间复杂度是 O(logn),对于大多数情况使用函数开头的32字节足以准确识别[23]。在识别操作正确性方面,许多函数结束位置处于二叉检索树相同的叶节点,这会导致识别过程出现冲突或二义性,这也是在制作IDA的 sig(特征标志库)文件经常发生冲突的原因。为了减少错误,IDA通过启动代码识别编译器程序并加载相应的库文件,同时允许用户手工加载这些特征标志库文件。在程序链接时编译器常以用户OBJ模块与函数库的列表顺序分配函数,所以很多情况下代码区中的库函数段和用户代码段之间会有明显的分隔。


很多函数库包含了开发商信息和库版本的版权内容,这为识别编译器类型和版本带来了很大便利,只需要找到相应文本字串片段即可。特殊函数库带有某些特征也可以用来识别编译器,例如调用的Windows API种类(用于文件、内存、图形、网络、加解密、硬件等)、数学函数一般含有丰富的协处理器指令等。另外可以利用参数和常量等信息进行推断,如函数接受浮点参数,那么极有可能来自于某个数学函数库。最后,算法的识别也会有助于识别库函数。

 



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞6
打赏
分享
最新回复 (4)
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
wx_X_120 2021-3-22 17:16
2
0
这么复杂,这个图是怎么分析出来的?
雪    币: 1859
活跃值: (2215)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
奋进的小杨 2021-3-23 08:53
3
0
这是查阅资料,分析总结的结果。
雪    币: 1636
活跃值: (653)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
琅環玉碎 2021-3-24 09:45
4
0
清晰明了,大佬辛苦了,爱你
雪    币: 461
活跃值: (151)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
RNGorgeous 2021-3-30 10:57
5
0
给大佬跪了
游客
登录 | 注册 方可回帖
返回