调试器之反汇编引擎的使用
反汇编引擎有两种编译方式,一种是静态编译方式,一种是动态编译方式那么我们现在就先了解下什么是静态编译呢?什么是动态编译?
一、静态编译
静态编译就是编译器在编译可执行文件的时候,将可执行文件需要调用的动态链接库中的部分提取出来,链接到可执行文件中去,使可执行文件在运行的时候不依赖于动态链接库,
二、动态编译
动态编译的可执行文件需要附带一个动态链接库,在执行时,需要调用其对应动态链接库中的命令,
我们了解完静态编译、和动态编译了那我们现在就说一下反汇编引擎的使用。
首先我们来做第一步就是要把库+到我们要写的程序中的文件,然后在包上头文件,大家可以去网上下载beaengine-win32这个,大家看到这是32位的,那么有32位的那肯定就有64位的是吧,
[*]#include "stdafx.h"
[*]#include <stdlib.h>
[*]#define BEA_ENGINE_STATIC //标识以静态库的方式编译
[*]#define BEA_USE_STDCALL //以STDCALL方式调用
[*]#include "BeaEngine.h" //静态库头文件
[*]#pragma comment(lib,"BeaEngine.lib")
[*]int _tmain(int argc, _TCHAR* argv[])
[*]{
[*]
[*] DISASM ds ={0}; //保存结构体
[*] char szCode [] = {0x55,0xb8}; //创建一个数组保存汇编指令
[*] ds.EIP = (UIntPtr)szCode; //把汇编指令给EIP
[*] Disasm(&ds); //解析并保存汇编指令
[*] printf(ds.CompleteInstr); // 输出解析出来的字符串
[*] system("pause");
[*] return 0;
[*]}
复制代码
上面的代码是我在控制台上写的,大家可以参考下,代码我已加注释,
首先我们要去我们上面说的那个库也就我们包的头文件#include<BeaEngine.h>中去找到我们下面的结构体
[*]typedef struct _Disasm {
[*] UIntPtr EIP; //
[*] UInt64 VirtualAddr;//虚拟地址
[*] UInt32 SecurityBlock; //安全模块
[*] char CompleteInstr;
[*] UInt32 Archi;
[*] UInt64 Options;
[*] INSTRTYPE Instruction;
[*] ARGTYPE Argument1;
[*] ARGTYPE Argument2;
[*] ARGTYPE Argument3;
[*] PREFIXINFO Prefix;
[*] UInt32 Reserved_;
[*]} DISASM, *PDISASM, *LPDISASM;
复制代码
其实我们用不了这么多,我们只用到两个参数一个Eip、一个是CompleteInstr,还有一个函数是Disasm来获取字符串,其实这么就完事了,大家是不是觉的还有很多啊undefined ,其实就这些,其实我们说的直白一点就是获取解析出来的字符串。undefined
下面静态库和动态库,大家有需要可以自己下载,本人没怎么写过帖子,如有什么错的地方,还请大家多多指点,多多指教。
SecurityBlock是指令的安全长度啦,32/64位架构的指令限制不超过15字节,可以防止访问到无效内存。我写的教程最后目标就是写出类似这种反汇编引擎吧,其实很简单的 yuepo619 发表于 2014-8-27 23:19
值得一看
{:5_109:}我这还有呢调试器的一套把算是 那天有时间我传上来{:5_91:} 谢谢分享~ 值得一看 支持楼主~ 在很多源码中都有看到使用od的反汇编引擎的。
http://www.ollydbg.de/srcdescr.htm#_Toc531975954
官网有下载和很详细的使用解释。
只用过一次反汇编引擎
想问下beaengine有什么比较好的地方吗。还是说od的反汇编引擎有什么弊端。(我在一个文章看到有避免使用od反汇编引擎的情况。不知道为什么) 我有空想这个功能较全的调试器。所以问问。od2.01在加载一堆插件调试大型软件的情况下可能出现od死掉的情况。受不了。od1.x功能又没2.x叼 强烈支持楼主ing…… 支持楼主,谢谢分享
支持楼主,谢谢分享 就是来顶 支持 学习一下
页:
[1]