基于32位IntelCPU的反汇编引擎设计与实现图文.docx
- 文档编号:9244664
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:11
- 大小:31.01KB
基于32位IntelCPU的反汇编引擎设计与实现图文.docx
《基于32位IntelCPU的反汇编引擎设计与实现图文.docx》由会员分享,可在线阅读,更多相关《基于32位IntelCPU的反汇编引擎设计与实现图文.docx(11页珍藏版)》请在冰豆网上搜索。
基于32位IntelCPU的反汇编引擎设计与实现图文
第9卷第7期2010年7月
软件导刊
SoftwareGuide
V01.9No.7Jul.2010
基于32位IntelCPU的反汇编引擎设计与实现
闫培宁1,张戈2,谢状平2
(1.河南大学软件学院,河南开封475001;2.河南大学计算机与信.g-工程学院,河南开封475001
摘要:
通过对IntelIA一32机器指令与中断调试机制等技术的研究,采用动态反汇编技术,设计了基于32位Intel系列CPU的反汇编引擎.并在此基础上开发动态调试器,以实现应用程序的反汇编与动态调试功能。
关键词:
反汇编;动态调试;机器指令;汇编语言
中图分类号:
TP312文献标识码:
A文章编号:
1672—7800(201007-0069-03
O引言
反汇编技术在程序优化、数据解密、软件汉化、逆向软件工程和汇编语言教学等领域发挥着重要的作用。
主要是将编译、封装后的应用程序反汇编成为汇编语言代码。
供开发研究人员进行分析优化等。
基于主流的操作系统为32位,且Intel系列及其兼容CPU应用广泛的现状.笔者根据高校在教学科研工作中的实际需要。
采用动态反汇编技术设计了基于32位Intel系列CPU的反汇编引擎。
并应用此反汇编引擎开发了动态调试器,实现了应用程序的反汇编与动态调试功能.在实际应用和教学过程中起到了良好的作用。
1反汇编引擎概述
反汇编引擎主要功能是将可执行的文件中的二进制机器指令经过分析转变为汇编程序。
其分析转变的依据是机器指令格式,也是机器代码和汇编语言格式之间的桥梁。
不同类型的CPU的指令格式是不同的.本文主要探讨的为常用的Intel系列兼容CPU机器指令格式。
以此为基石设计和开发反汇编引擎。
1.1机器指令
Intel机器指令一般分为Intel64和IA一32,分别是64位指令和32位指令.本文仅讨论32位指令的情况,但其中的很多内容对于intel64也是同样适用的。
Intel64及IA一32机器指令格式如图1所示。
一条指令包括可选的指令前缀、主操作码、由ModR/M和SIB字节组成的地址格式描述符、偏移量以及立即数。
I前缀}操作码ModR/MSIB偏移营立即数l
最多4个123字节1字节1字节124字节124字节
前缀每个(可选(可选(可选(可选J
l字节f可选/\
765320765320
匝正亟互三团区五固
图lIntel64及IA-32机器指令格式
其中前缀是指令操作的辅助说明;主操作码表示操作的类型:
ModR/M字节用于编码操作数的类型:
SIB是ModR/M的扩展,SIB用于编码寻址方式;偏移量用于编码指令中的偏移量部分;立即数用于编码指令中的立即数部分。
1.2汇编语言
汇编指令格式一般分为Intel和AT&T格式.Intel格式一般用于Windows系统,而AT&T则用于Unix和类Unix系统。
其中Intel汇编有着固定的格式:
Label:
mnemonicopemndl、operand2、・operand3。
其中:
(重label:
为一条指令的开始.代表该条指令在内存中的起始位置;(至mnemonic:
为助记符。
表示机器码代表的操作;(要operandl、operand2、operand3:
为操作数.Intel指令最多可以有3个操作数,当只有两个操作码的时候。
一般第1个为目标操作码,第2个为源操作码。
1.3反汇编引擎架构
反汇编引擎的目的是将上述目标机器代码翻译为汇编格式指令。
一般来说可以采用以下两种方法:
①设计一张庞大的操作码表格,里面包含解析所需要的所有信息,设计一个通用的解析函数。
该函数查询操作码在表内对应的条目.以解析机器指令:
②分别设计函数解析指令的每一组成部分,反汇编时分析读取到的操作码。
若指令存在某组成部分则调用解析该部分的函数,最后合成各组成部分的解析结果,得到最终的反汇编的指令助记符字符串。
这种架构是不依赖于表格的。
基金项目:
河南省教育厅自然科学基-奎(2010A520005。
河南大学自然科学基金(2008YBZR026.2007YBZR009
作者简介:
闰培宁(1983一,男,河南郑州人.河南大学软件学院硕士研究生,研宄方向为软件工程、电子政务;张戈(1983一,男,河南开封人,河南大学计算机与信息工程学院硕士研究生.研究方向为软件工程;谢状乎(1987一,男,湖南邵阳人,河南大学计算机与信息工程学院本科生。
研究方向为Windows系统软件研发。
万方数据
・70・软件导刊2010矩
由于第1种方式需要维护庞大的操作码表格,且灵活性和扩展性上不如第2种,本文采用第2种分段解析方法实现反汇编引擎:
2反汇编引擎的设计实现
Intel指令集是典型的CISC指令系统。
由于计算机发展早期内存设备昂贵,设计师充分利用了指令编码的每一比特。
对Intd指令集的解析相对复杂。
指令的每个组成部分都应该设计相应的解析函数,解析函数返回解析的字符串,将这些字符串组合起来反汇编为指令助记符。
下面就指令主要组成部分的解析进行探讨。
2.1指令对象设计
在设计中,将一条指令对应着一个指令对象。
指令对象的成员变量由其格式决定,具体实现时将指令对象设计为如下所示的结构:
typedefstruct_INSTRUCrllON
{
CharPrefixRepeat;//重复和锁定前缀
CharPrefixSegment:
//段重载前缀
charPrefixOperand;//操作数尺寸重载前缀
charPrefixAddress;//地址尺寸重载前缀
unsignedintOpcode:
//主操作码
charModRM;//ModR/M字节
charSIB;//SIB字节
unsignedintDisplacement;//偏移量
unsignedintlmmediate:
//立即数
umignedintLinearAddress;//指令起始的线性地址
charFlagD,nagW,FlagS;/Id,W,s位
}INSTRUCTION,*PINSTRUCTION;
结构的每个成员对应着指令格式的每一个组成部分。
且大小足以容纳该组成部分。
先将解析出的机器指令各个部分.并赋值给该指令对象相应的成员变量,最终由指令对象转化成汇编指令格式。
北指令前缀的解析
解析前缀的任务是解析出当前的指令前缀并保存,供后续的解析代码使用。
解析前缀主要依据指令格式,但也会出现特殊情况。
如对于机器代码序列:
6667266667AC。
其中AC是LODSB的机器码.但66和67都出现了两次,但依据格式指令前缀分为4组.并且每组最多可以有一个前缀被使用。
本文采用重复扫描的办法来解决这个问题。
具体的说,第_二遍对操作码序列进行扫描,若检测到上述情形则记录重复的前缀.重新扫描该序列。
当出现该被记录的前缀时,将该处设为该指令的结束位置,下一指令从该处后一个位置开始扫描,如此反复。
第1遍:
66672666,扫描到第四个字节时发现66重复。
则记录该前缀;第2遍:
66。
当扫描第一个字节时发现被记录的前缀,于是将该处设为当前指令结束处。
下一条指令从6726
6667AC开始。
2.3操作码的识别
对操作码的识别是依据Intel操作码表进行的。
Intel机器码表由数张表格组合而成,包括:
单字节操作码表,双字节操作码表,3字节操作码表,组指令操作码表.转义操作码表,在识别过程中需要结合使用。
在设计过程中,对操作码表的识别应当尽量抓住指令之间的规律,比如域d.w、S、reg、sre92与sre93等.此外还应尽量将操作数属性一致的指令合并解析为一处,这样不仅可以缩小代码量,也易于代码的阅读。
如以下的栈操作指令机器码:
机器码指令助记符
06pushES
0EpushCS
16pushSS
1EpushDS
07popES
17popSS
IFpopDS
分析可知其中编码了sre92域(包含两位的段寄存器域,通过sre92域可以将其合并解析。
2.4指令其它部分的解析
对偏移量的解析是内置于操作码的识别过程中的,具体解析时读取固定大小的内容即可。
立即数的解析和偏移量类似,不过立即数受s位的影响,根据S位的值进行不同的处理。
SIB的解析是依据Intel体系结构手册中带SIB的寻址模式表进行。
因为存在re@opcede可能表现为操作码扩展的情形,对ModR/M的解析一般分为R/M域和reg/opeode域进行。
对32位M0dm伽解析的依据是Intel体系结构手册中带ModMH的32位寻址模式表。
反汇编引擎采用C“编写,实现方式采用SDK的方式,即直接调用API完成所需的功能,最终的反汇编引擎为动态链接库的形式。
该动态链接库导出一个名为Disassemble的函数供外界(如动态调试器、反编译软件等调用。
3动态调试器的设计实现
在实现反汇编引擎的基础上,通过对CPU中断、调试机制和文件格式的研究,设计实现动态调试器。
可以进行可执行程序的动态反汇编与调试,并实现了指令断点设置、单步步进、单步步过、内存与寄存器查看等功能。
3.1设计思路
为了方便与用户交互,动态调试器采用图形界面的形式。
调试事件的检测应当是在一个无限循环里进行的,这里称该循环为调试循环。
由于图形界面程序的缘故,程序的主线程主要用于处理图形界面相关的一些工作的,因此将调试循环作为一个独立的线程。
具体设计是,主线程创建图形界面并接受用户的输入。
如
万方数据
第7期闫培宁。
张戈,谢状平:
基于32位IntelCPU的反汇编引擎设计与实现・71・
系统热键、加速键、菜单项选择、按钮单击等;而调试线程循环监视系统产生的调试事件,并进行相应的处理。
当目标进程被创建或附加时,应当先分析目标可执行文件格式,获取某些重要信息,反汇编整个代码节,并以某种形式显示在用户界面上。
3.2调试循环的实现
程序在调试循环中检测到系统的调试事件,此时应当将目标进程的当前状况以某种方式反馈给用户。
并等待用户的操作命令,即应当与用户界面进行交互。
具体的实现是,调试循环检测到目标进程产生的调试事件,此时目标进程已被系统挂起,调试循环应当等待用户通过用户界面发出的命令,当接收到命令后做出相应的反应。
特别需要注意的是,由于存在两个线程互相等待的情形,应当进行线程同步实现。
调试循环的伪代码如下所示:
DEBUG_EVENTstDbgEvent;
while(true{
WaitForDebugEvent(&stDbgEvent,INFINITE;
if(stDbgEvent.dwDebugEverItCode==EXCEPn0N—DEBUGEVENT
switch(stDbgEvent.u.Exception.ExceptionRecord.Exception
Code
{
cage
EXCEVI
ION_SINGLE_STEP:
//将系统当前状态反馈给用户
WaitForsingleObject(g_hEvent.INFINITE;//等待命令
//根据用户命令.执行相应的操作
break;
}}
循环中首先用WaitForDebugEvent函数获取调试事件。
然后用一个分支语句检测事件类型,当发现事件代码为EXIT_PROCEKS_DEBUG_EVENT(进程退出时,用break语句结束循环;在其他情况下.程序根据不同的事件码进行不同的处理。
其中WaitForSingleObject函数测试事件对象。
相应的,应当在主线程向调试循环所在线程发出命令时设置事件对象SetEvent(g_hEvent。
这样调试循环所在线程的WaitForSingle
Object函数返回,调试线程继续向下执行。
当不再需要事件对象的时候,可以使用CloseHandle函数将其释放。
3.3运行效果
动态调试器的运行效果如图2所示。
可以通过菜单或者对应的系统热键进行操作。
上图中左上部分列出的是指令地址、指令对应的机器码、指令助记符以及注记:
右上部分列出的是运行时各寄存器的值;左下部分显示的是目标程序的内存数据;右下部分列出的是当前的堆栈状态。
通过动态调试器可以对可执行程序进行断点设置、单步步进、单步步过等方式的调试。
4结束语
图2动态调试器运行效果
本文设计的反汇编引擎。
以及在其基础上实现的动态调试器在实际应用中起到了良好的作用。
但还存在改进的空间,如反汇编引擎目前还暂不支持SIMD和浮点指令,反汇编的格式也仅支持Intel格式。
对花指令、反调试技术还需要进行深入的
研究。
参考文献:
【1]
Intel64andIA一32ArchitecturesSoftware
Developer'sManual
[M].Volume,1999.
[2]杨慕晗.一种基于中断处理机制的动态反汇编算法[J].计算机科
学,2008(12.
[3]
蒋烈辉,周博,费勤福,等.反汇编结果代码结构分析算法研究[J].小型微型计算机系统,2007(6.
[4]许敏,陈前斌.静态反汇编算法研究[J].计算机与数字工程,2007
(5.
[5]杨慕晗.一种基于中断处理机制的动态反汇编算法[J].计算机科
学。
2008(12.
[6]罗云彬.Windows环境下32位汇编语言程序设计(第2版[M】.
北京:
电子工业出版社.2006.
(责任编辑:
王钊
DesignandImplementationofDisassemblyEngine
Based
on
32-BitIntelCPU
Abstract:
Throughtheresegl'choftheIntelIA-32machineinstructionandinterruptdebuggingmechanism,thispaperadoptsthedynamicdisassemblytechnologyanddesignsthe
disassemblyeng/ne
whichisbased
on
32-bitIntelCPU.Onthebasisoftheaboveresearch,this
paper
developsthedynamicdebuggingto
implementthedisassemblyanddynamicdebuggingofapplicationprograms.
Key
Words:
Disassembly;Dynamic
Debugging;Machine
Instruction;Assembler
万方数据
基于32位IntelCPU的反汇编引擎设计与实现
作者:
闫培宁,张戈,谢状平,YanPeining,ZhangGe,XieZhuangping
作者单位:
闫培宁,YanPeining(河南大学,软件学院,河南,开封,475001,张戈,谢状平,ZhangGe,XieZhuangping(河南大学,计算机与信息工程学院,河南,开封,475001
刊名:
软件导刊
英文刊名:
SOFTWAREGUIDE
年,卷(期:
2010,09(7
参考文献(6条
1.蒋烈辉;周博;费勤福反汇编结果代码结构分析算法研究[期刊论文]-小型微型计算机系统2007(06
2.杨幕晗一种基于中断处理机制的动态反汇编算法[期刊论文]-计算机科学2008(12
3.杨慕晗一种基于中断处理机制的动态反汇编算法[期刊论文]-计算机科学2008(12
4.许敏;陈前斌静态反汇编算法研究[期刊论文]-计算机与数字工程2007(05
5.罗云彬Windows环境下32位汇编语言程序设计2006
6.Intel64andIA-32ArchitecturesSoftwareDeveloper'sManual1999
本文链接:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 32 IntelCPU 汇编 引擎 设计 实现 图文
![提示](https://static.bdocx.com/images/bang_tan.gif)