第9卷第7期2010年7月软件导刊SoftwareGuideV01.9No.7Jul.2010基于32位IntelCPU的反汇编引擎设计与实现闫培宁1,张戈2,谢状平2(1.河南大学软件学院,河南开封475001;2.河南大学计算机与信.g-工程学院,河南开封475001摘要:通过对IntelIA一32机器指令与中断调试机制等技术的研究,采用动态反汇编技术,设计了基于32位Intel系列CPU的反汇编引擎.并在此基础上开发动态调试器,以实现应用程序的反汇编与动态调试功能。关键词:反汇编;动态调试;机器指令;汇编语言中图分类号:TP312文献标识码:A文章编号:1672—7800(201007-0069-03O引言反汇编技术在程序优化、数据解密、软件汉化、逆向软件工程和汇编语言教学等领域发挥着重要的作用。主要是将编译、封装后的应用程序反汇编成为汇编语言代码。供开发研究人员进行分析优化等。基于主流的操作系统为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字节前缀每个(可选(可选(可选(可选Jl字节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指令集的解析相对...