《基于IDA-Pro的软件逆向分析方法.pdf》由会员分享,可在线阅读,更多相关《基于IDA-Pro的软件逆向分析方法.pdf(3页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、2008 年年 11 月月November 2008 86 计计 算算 机机 工工 程程Computer Engineering第第34 第第22期期Vol卷卷.34 No.22 软件技术与数据库软件技术与数据库 文章编号:文章编号:10003428(2008)22008603文献标识码:文献标识码:A 中图分类号:中图分类号:TP311基于基于 IDA-Pro 的软件逆向分析方法的软件逆向分析方法 秦青文秦青文1,王,王 戟戟1,孙旭光,孙旭光2,梅文华,梅文华2(1.国防科技大学计算机学院,长沙 410073;2.北京航空工程技术研究中心,北京 100076)摘摘 要:要:二进制程序转换作
2、为软件逆向分析的主要手段发挥着积极作用。该文给出一种程序转换方法,应用软件二进制程序经 IDA Pro 反汇编得汇编语言程序,依据下推自动机原理设计汇编文法识别该汇编文件、制定相应的转换规则和优化措施将汇编语言转换成中间语言。转换所得中间语言可读性较强,具有通用性且易于理解。该方法达到了较高的自动化程度,缩小了目标程序的代码量,其应用可有效地减少软件分析和调试人员在追踪代码时所需的时间和工作量。给出应用上述方法进行程序转换的实例。关键词:关键词:逆向分析;程序转换;中间语言 Reverse Analysis of Software Based on IDA-Pro QIN Qing-wen1,
3、WANG Ji1,SUN Xu-guang2,MEI Wen-hua2(1.School of Computer,National University of Defense Technology,Changsha 410073;2.Beijing Aeronautical Technology Research Center,Beijing 100076)【Abstract】Binary program transformation has played an important role in reverse program analysis.This paper proposes a p
4、rogram transformationmethod.In the method,machine code is first disassembled by IDA Pro.Along with rules and optimizing strategies,the program is transformed tointermediate language.The deterministic finite automata and context-free grammars are designed to parse assembly language,and the codeoptimi
5、zation theory is also included in dataflow analysis.The intermediate language has a good readability,generality and comprehensibility.Aftertransformation,the code contracts dramatically.The technique described can run automatically,which effectively reduce the amount of time insolving software analy
6、sis problems and debugging executable programs.A transform instance using this technique is presented.【Key words】reverse analysis;program transformation;intermediate language 1 概述概述 随着逆向工程技术的热潮,软件逆向工程也在不断发展。逆向分析技术是软件逆向工程中的重要方法和技术,在某些领域甚至是关键和唯一的问题解决途径。逆向分析技术是指通过分析机器码或汇编码来理解代码功能,如各接口的数据结构等,然后用高级语言重新描述
7、该代码,逆向推出源程序的思路。二进制程序逆向分析作为程序转换1的主要手段发挥着积极的作用。程序转换被广泛用于对程序的理解和代码的编译,用来检测和维护代码、检测并定位bugs、学习算法、用户干预、增加功能等。程序转换的目标之一就是在尽可能大的语言范围内,以一种规范的方式对程序进行重用。2 中间语言中间语言 编译程序在将源程序转换成目标代码时,通常借助三元式等中间语言。为便于处理,二进制程序转换成高级语言程序过程中,也借助规范化定义的中间语言,这将显著降低程序转换的复杂度2。通过将汇编语言转换成中间语言,再翻译成高级语言,用户可以更多地干预翻译过程,这是现有条件下解决反编译通用性的途径之一。在反编
8、译技术中,复合数据类型的恢复一直是尚未克服的难题3,在向高级语言转换的过程中,这些数据类型以及其他复杂结构的转换会出现不准确甚至错误的地方,而借助可读性强的中间语言可以有效地避免这类情况,分析人员可根据中间语言程序的上下文环境来判断程序中某些难于恢复的复合数据类型的结构,提高理解的效率和准确性。本文所设计的中间语言是面向应用程序的使用者与维护者,它在语句形式上接近于高级语言的表示,又保留了汇编语言的一些特征,不需要反编译方面的知识就可以很容易阅读所生成的中间语言程序,这样有利于不同专业的人员对应用程序进行理解和维护。2.1 中间语言的程序结构中间语言的程序结构 中间语言程序以函数块为基本单位,
9、程序的执行依靠函数间的调用。函数的结构如下:proc near|far endp 2.2 中间语言语句类型中间语言语句类型 中间语言的语句类型有标号语句、函数调用语句、赋值语句、条件转移语句、无条件转移语句、返回语句。这些语句的特点是规范汇编指令的形式、统一操作数的格式、转换隐式操作数为显式操作数等,可读性强。它具有三地址码的指令格式:。三地址码较汇编代码更接近高级语言表示,一条指令表示的不只是操作数本身,而是一个表达式,操作数可视为最基本的表达式。中间语言语句的语法形式以及对应的高级表示如下:赋值语句:作者简介:作者简介:秦青文(1983),女,硕士研究生,主研方向:逆向工程;王 戟,教授、
10、博士;孙旭光、梅文华,高级工程师 收稿日期:收稿日期:2007-12-20 E-mail: asgn x:=y op z、x:=op y 和 x:=y 条件转移语句:jcond L if(x relop y)goto L 无条件转移语句:jmp offset goto L 子程序调用语句:call 函数或过程调用语句 程序返回语句:ret arithExp return 标号语句:L:其中,relop为关系操作符,如,等;L表示转向地址值;是指向程序调用图中被调用程序的指针。中间语言有类似于高级语言的简单数据类型,根据变量所占字节长度来划分数据类型,分别为字节(byte型)、单字(word型)
11、、双字(long型)。3 汇编语言到中间语言转换中的几项关键技术汇编语言到中间语言转换中的几项关键技术 3.1 IDA汇编程序词法和语法分析汇编程序词法和语法分析 为了对IDA Pro产生的汇编文件做进一步分析,首先需要识别其汇编语言格式。因此设计正则文法和上下文无关文法对IDA汇编文件分别进行词法和语法分析。其中词法分析基于如下确定性有限自动机(deterministic finite automata)实现,图1给出了该自动机的结构。图图1 确定性有限自动机确定性有限自动机 经过词法分析得出各种关键字、标识符、注释、字符串和数值等终结符,然后转入语法分析。语法分析通过设计上下文无关文法实现
12、,用于对汇编指令、伪指令的分析,以及程序块、函数、数据等定义的分析。为了便于程序实现,文法设计须避免二义性,根据文法和最左推导原则进行LL(1)语法分析。经过词法和语法分析,汇编文件的所有内容将被正确提取出来并存储在底层中间语言数据结构内,以供进一步进行数据流和控制流分析。关于汇编指令的分析文法如下所示:short|,|()large|ptr|byte|word|dword|near|far|es|ss|ds|:|$|offset|seg +|-|$=instruction_keywords register_keywords register_keywords identifier iden
13、tifier identifier number 根据上述文法针对指令进行最左推导并构造语法分析树分析语义。例如指令:cmp byte ptr es:di+arg_0,2Dh 则根据汇编指令所示文法构造相应语法树如图2所示。,图图2 指令“指令“cmp byte ptr es:di+arg_0,2Dh”语法树”语法树 根据指令格式文法构造语法树的过程中分析指令的语义,提取并记录指令操作、数据值和存储位置(寄存器或内存地址)以及指令所修改标志符等信息,并存储在底层中间语言数据结构内。3.2 汇编程序结构分析汇编程序结构分析 经过语法分析,汇编文件中的指令、数据、函数块、程序块等信息被解析出来。汇
14、编控制语句由条件转移、无条件跳转、函数调用等3种类型构成,其中条件转移可以归约为分支控制结构;然后可将其他转移语句和循环语句归约为循环控制结构(使用goto语句的C程序所编译出来的二进制代码除外),根据汇编程序的执行逻辑流程读取指令,并采用深度优先遍历算法构造程序控制结构图。函数调用中父函数与子函数体内指令序列互不交叉,故控制流分析以函数为单位进行。根据函数调用关系可以构造函数调用图,每个函数对应图中的一个节点,其中根节点为main函数。当存在n个函数的递归调用时图中存在长度为n的环(n=1,2,)。对函数调用图深度优先遍历每一个函数节space|t|n|0 start done0|n|+|=
15、|(|)|,|:number;0|n other string other error 0|n comment other identifier other keyword _|?|$|az|AZ|.|_|?|$|az|keyword check success-09|09 09|af|AF|h|H keyword check failedcm di for lbdescp tr 2Dh arg_0 :+bytees 87点,然后对该函数进行控制流分析,构造该函数的控制结构图。函数调用图和每个函数的控制结构图保存了整个汇编文件的程序信息。3.3 汇编语言到中间语言的映射汇编语言到中间语言的映射
16、 汇编语言映射成中间语言的途径是将某一小段指令序列转化成等价的中间语言表达式。例如数据和地址传送类指令最终可归约为赋值语句;而条件转移类指令可归约为分支语句或循环语句;算术和逻辑运算类指令映射后仍为算术和逻辑表达式,最易处理;程序调用类指令将归约为带有参数化列表的函数调用语句;堆栈操作类指令将归约为函数调用或变量声明等。赋值语句的归约采用Use-Def链4-5和寄存器拷贝替换算法5实现。其他语句的归约采用类似的原理。下面给出归约算法中采用的基本概念。定义定义1基本块是一组具有唯一的入口指令和出口指令的线性连续汇编指令序列。其中每一语句将修改或引用某一数据变量。对修改数据变量称为变量定义;读出数
17、据变量值称为变量引用。定义定义2 变量x在语句i处的Def-Use链是一组语句j的集合,其中x在语句i处被定义,在语句j i处被引用,且对任意的k,i k j没有对x的修改。定义定义3 变量x在语句j处的Use-Def链是语句i的集合,其中x在语句j处被使用,在语句i j处被定义,且对任意的k,i k=reg=!reg inc reg 定义上述启发规则识别左边汇编指令序列并直接转换为右边条件转移语句。然后构造启发知识库存储这些规则,在反编译过程中搜索知识库以便直接将汇编指令序列转换为中间语言语句。为了针对不同编译器实现启发式反编译,需要针对不同类型的编译器构造不同的启发规则知识库。通过深度优先
18、遍历函数调用图和函数控制结构图,并使用归约和启发式转换方法实现汇编语言程序到中间语言程序的转换。4 汇编语言到中间语言程序转换的实例汇编语言到中间语言程序转换的实例 系统的实现是基于IDA Pro6反汇编得到汇编语言文件。IDA Pro是DataRescue公司出品的一款功能强大的专业反汇编工具,全称为交互式反汇编工具(interactive disassembler)。它具有开放的架构,支持多线程、多文件格式,能够标注函数参数,而且可对无任何文档、无任何调试信息的程序进行分析。下文给出一个依据上述方法的程序转换实例。转换后,中间语言明显缩短程序的长度;基本上完整保留了汇编语言的数据信息;消除
19、了汇编语言程序中的一些冗余指令;函数及其参数信息恢复为类C语言形式,控制语句简单,且从该中间语言向高级目标语言转换相对容易。代码清单代码清单1 十六进制形式的机器码示例 55 8B EC 8B 56 04 8B 5E 06 3B D3 7E 04 8B C2 EB 04 8B C3 EB FA 5D C3 代码清单代码清单2 汇编语言程序示例 sub_303 proc near arg_0=word ptr 4 arg_2=word ptr 6 push bp mov bp,sp mov dx,bp+arg_0 mov bx,bp+arg_2 cmp dx,bx jle short loc_314 mov ax,dx loc_312:jmp short loc_318 loc_314:mov ax,bx jmp short loc_312 loc_318:pop bp retn sub_303 endp 代码清单代码清单3 转换后中间语言程序示例 max(int arg_0,int arg_2)int loc1;/*ax*/jcond(arg_0 y)return(x);return(y);(下转第99页)88
限制150内