以前写的,放在本里面很久了,一直没动。拿出来像大牛学习下。别拍砖
软件逆向工具:反汇编器比较
time:2009-10
author:fenggui321
--------------------------------------------------------------------------------------
摘要:
软件逆向工程作为一种分析软件关键功能实现和软件架构设计的的手段,在软件安全和软件开发中有广泛应用。在软件开发中,通过逆向手段可以实现与专利软件的互操作、开发竞争软件,同时可以借助逆向评估软件的质量和健壮性。本文就软件逆向分析中常用静态反汇编工具实现进行比较和分析。
关键词:软件逆向 线性扫描 递归遍历 反汇编器
一.逆向工程及工具介绍
软件逆向工程(Software Reverse Engineering)又称软件反向工程,是指从可运行的程序系统出发,运用解密、反汇编、系统分析、程序理解等多种计算机技术,对软件的结构、流程、 算法、代码等进行逆向拆解和分析,推导出软件产品的源代码、设计原理、结构、算法、处理过程、运行方法及相关文档等.通常,人们把对软件进行反向分析的整 个过程统称为软件逆向工程,把在这个过程中所采用的技术统称为软件逆向工程技术.
逆向工程的目标是理解一个软件系统以便于更容易地进行增强功能、更正、增加文档、再设计或者用其他的程序设计语言再编码.逆向工程工具支持产生程序的高层 抽象,使维护者更容易理解程序,重用旧代码,以及准确加入新功能,避免死码的产生.这正是逆向工程工具的研究目的和意义.做为逆向的初步工作反--反汇编结果的正确将直接影响后期的分析。目前主要的反汇编工具如表1:
反汇编/调试器名称 反汇编方式
OllyDbg 递归遍历
NuMega SoftICE 线性扫描
Microsoft WinDbg 线性扫描
IDA Pro 递归遍历
PEBrowse Professional(包括交互式反汇编版本) 递归遍历
表1:常见逆向工程工具和反汇编器体系结构
二.反汇编方式比较
按照反汇编方式可分为线性扫描和递归遍历方式。线性扫描简单对整个模块中每条指令按顺序进行反汇编。递归遍历依据程序的控制流遍历指令进行分析和反汇编。我们以如下指令进行测试:
Jmp Junk;
_emit 0x0f;
Junk:
Mov eax,[some]
[some code]
各种反汇编工具结果:
WinDbg
-----------------------------------
jnp 763f6017
cld
call image00400000+0x1118 (00401118)
push offset image00400000+0xe004 (0040e004)
OllyDbg
---------------------------------------
jmp short test.0040100E
db 0F
mov eax,dword ptr ds:[ebx]
push eax
IDA pro
------------------------------------------
jmp short loc_40100F
.text:0040100C ; ?
.text:0040100E db 0Fh
.text:0040100F ;
.text:0040100F
.text:0040100F loc_40100F: ; CODE XREF: sub_401000+C j
PEBrowse Professional
-------------------------------
JMP 0x40100E ; (*+0x3)
; Section: .text
MOV EAX,DWORD PTR [EBX]; <==0x0040100B(*-0x3)
PUSH EAX
从测试指令1反汇编结果中可以看出_emit 指令迷惑了线性扫描方式。递归遍历方式则成功反汇编出结果。
测试指令二: mov eax,2;
cmp eax,2
je junk;
_emit 0x0f;
junk: [somecode]
OllyDbg
---------------------------
mov eax,2
cmp eax,2
je short test2.00401016
db 0F
mov eax,dword ptr ds:[ebx]
IDA pro
---------------------------
mov eax, 2
cmp eax, 2
jz short near ptr loc_401015+1
loc_401015: ; CODE XREF: sub_401000+13 j
jnp near ptr 763F601Eh
cld
call sub_40111F
PEBrowse Professional
---------------------------
MOV EAX,0x2
CMP EAX,0x2
JE 0x401016 ; (*+0x3)
JPO 0x763F601E ;Section: .text
MOV EAX,DWORD PTR [EBX]; <==0x00401013(*-0x3)
表3:测试指令2反汇编结果
可见控制流变换和暗晦谓词成功欺骗了IDA Pro。
测试指令3:mov eax,2;
cmp eax,3
je trap;
jne junk;
trap:
_emit 0x0f;
junk:
mov eax,dword ptr[ebx];
OllyDbg
---------------------------
mov eax,2
cmp eax,3
je short test3.00401017
jnz short test3.00401018
jpo 763F6020
cld
call test3.00401121
PEBrowse Professional
---------------------------
MOV EAX,0x2
CMP EAX,0x3
JE 0x401017 ; (*+0x4)
JNE 0x401018 ; (*+0x3)
JPO 0x763F6020 ; <==0x00401013(*-0x4) ; Section: .text
MOV EAX,DWORD PTR [EBX]; <==0x00401015(*-0x3)
表4:测试指令3反汇编结果
从表中可以看出复杂变换控制流成功迷惑了OllyDbg。但PEBrowse Professional成功识别了这种控制流。
总结:递归方式较线性扫面能更好的对文件进行反汇编。但对于暗晦谓词和复杂控制流变换在没有相应处理脚本情况下,很难正确判断。
三.调试功能比较
在上述中调试器中OllyDbg、IDA Pro、PEBrowse Professional均为用户模式调试器。WinDbg和SoftICE则为内核模式调试器,能够对操作系统内核代码进行调试。WinDgb则由于和windows操作系统的紧密结合,可以方便的调试DLL初始化代码和内核,同时在调试过程中下载对应符号信息,方便理解调试程序。
四.总结
各种反汇编器能有效帮助逆向工程师进行逆向分析。对于上述的简单复杂控制流和暗晦谓词能通过数据流分析能容易获得正确的汇编源码。但如果将真正跳转地址导出到一个重要的、运行时生成的数据结构中就更难的到正确的反汇编结果了。这也是反逆向的一种方式。
对于逆向中反汇编和调试工具的选择可根据需要选择。
参考文献:
[1].基于逆向工程的信息隐藏软件研究[J].钱思进,何德全, 端木庆峰等 《华中科技大学学报(自然科学版)》 2007年 第35卷 第九期
[2].基于 MDA 的软件逆向工程研究及应用[J]. 於在稳,谢强,丁秋林 《中国制造业信息化》 第36卷 第21期2 007年
[3].软件逆向工程技术研究[J].严秀,李龙澍 《计算机技术与发展》.第19卷 第4期2009年
[4].基于IDA•Pro的软件逆向分析方法[J]. 秦青文 王杭 孙姐光 梅文华 <<计算机工程>> 第34卷 第24期 2008年
[5].结合逆向工程和fuzz 技术的 Windows软件漏洞挖掘模型研究[J]. 刘坤 《成都信息工程学院学报》 第23 卷第2 期 2008年
[6].<<Reversing:逆向工程揭秘>>[美] Eldad Eilam 著 韩琪 杨艳等译 电子工业出版社.北京 2007年9月
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)