一个简单的反汇编引擎的实现小记

原创 2015年08月23日 14:31:05

根据在15PB所学的知识,做了一个简单的反汇编引擎,简记如下:


一、查手册时遇到的问题

1.sib表中的[*]列(手册的Table 2-3):

 在modrm的第一部分为00B时,此列相当于disp32

 否则,此列相当于EBP,代码如下

	if (getMod () != 0x0)
	{
		assert (getMod () == 0x1 ||getMod () == 0x2);
		addr->base = getRegName (getBase (), 4);			//normal
	}
	else
	{
		if (getBase () != 0x5)
			addr->base = getRegName (getBase (), 4);		//normal
		else
		{
			// treat 0x5 as disp32
			addr->base = RegName::NONE;
			addr->displacement = _reader.getDisplacement (4);
		}
	}



2.手册中表示操作数大小的字母:

 b:为1字节

 v:有前缀66H时为2字节,否则为4字节

3.存在前缀66H时,有些指令的名称会切换,比如:STOSD和STOSW

4.ESC(从D8HDFH)不是指令名,其类似于Grp,也需要根据随后的部分来知道其指令名

 

二、解析一条指令的大致流程

1.读取前缀直到不是前缀为止

2.读取Opcode,直到Opcode完整

3.根据手册可知Opcode对应的指令名、操作数个数、每个操作数的类型和大小。

4.解析每个操作数,如果其类型是:

         a 寄存器类型:读取modrm

         b 内存/寄存器类型:读取modrm,再根据modrm来判断是否需要读取sib和偏移

         c 立即数类型:读取立即数

 

三、编码时遇到的问题

   1.类的划分

      ByteReader:读取1、2、4字节的数据

      InstructionReader:读取前缀、modrm、sib等

      Disassembler:对单条指令的解析

   2.保证正确性

      使用测试来保证每次修改代码后,依然能够对指定的Opcode正确解析

  使用断言来加强对编程思路的表达和检查


四、还需改进的地方

 1.为了编写的方便,代码中throw和assert没有区分,测试表达式时使用了assert,无需测试的用了throw。

 2.没有做性能测试

 3.测试代码写的很乱,还需整理

 4.命名还需改进,比如类名

 5.其他

 


版权声明:本文为博主原创文章,未经博主允许不得转载。

各种开源汇编、反汇编引擎的非专业比较

转自:http://bbs.pediy.com/thread-205590.htm 由于平时业余兴趣和工作需要,研究过并使用过时下流行的各种开源的x86/64汇编和反汇编引擎。如果要对汇编指令进行分...
  • earbao
  • earbao
  • 2017年06月04日 11:06
  • 1031

一些反汇编引擎的资料

// ollydbg的反汇编引擎的文档及代码 http://www.ollydbg.de/srcdescr.htm#_Toc531975949 // Intel? 64 and IA-32 Arc...
  • cay22
  • cay22
  • 2012年03月31日 09:35
  • 2394

32/64位跨平台反汇编引擎BeaEngine使用简介

作 者: stanford 时 间: 2013-08-15,23:29:45 链 接: http://bbs.pediy.com/showthread.php?t=177301 1.Pref...
  • super_mimi
  • super_mimi
  • 2015年07月17日 18:11
  • 1635

BeaEngine反汇编引擎在C中的使用

BeaEngine是一个开源的反编译引擎,官网为 http://www.beaengine.org/ ,支持多种语言,比如:Python VC MASM32 Delphi 等。由于我在使用的时候遇到了...
  • skylinelulu
  • skylinelulu
  • 2017年05月29日 11:01
  • 829

一个反汇编引擎的开源代码

  • 2010年06月27日 12:33
  • 615KB
  • 下载

32/64位跨平台反汇编引擎BeaEngine使用简介

作 者: stanford 时 间: 2013-08-15,23:29:45 链 接: http://bbs.pediy.com/showthread.php?t=177301 1.Pref...
  • super_mimi
  • super_mimi
  • 2015年07月17日 18:11
  • 1635

用java实现简单的搜索引擎

纯java实现简单的搜索引擎
  • xiaojimanman
  • xiaojimanman
  • 2014年07月19日 11:10
  • 6987

一个简单的站内搜索引擎的实现

这学期的信息检索课程的实验要求做一个简单的站内搜索引擎,用来搜索山东大学新闻网(http://www.view.sdu.edu.cn/)的新闻内容。具体要求如下: 今天终于考完了这学期的最后...
  • john_bian
  • john_bian
  • 2017年07月05日 20:56
  • 2206

如何利用Capstone引擎写一个Android反汇编工具

转自:http://www.freebuf.com/sectool/88799.html 在做一些逆向工程时,偶然想到我还没有一款用于安卓反汇编二进制文件的工具。之后做了一些研究,我将目标选...
  • earbao
  • earbao
  • 2017年01月18日 00:33
  • 487

一个超轻量级的反汇编引擎

  • 2011年12月22日 14:14
  • 11KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个简单的反汇编引擎的实现小记
举报原因:
原因补充:

(最多只允许输入30个字)