前言
最近在写个人项目中需要在内核模式下使用到反汇编引擎,找到几个并使用对比后我强烈推荐一款名叫BeaEngine的反汇编引擎。这是它的项目仓库链接:https://github.com/BeaEngine/beaengine
编译
项目下载下来后需要使用CMake编译,在此之前确保你的Visual studio*已安装支持CMake编译。我使用的是Visual Studio2019。操作流程:
- 打开VS2019,选择菜单中的文件,下拉框中选择CMake。此时会弹出打开文件对话框,选择并打开你下载保存的BeaEngine项目中的CMakeLists.txt文件。
- 默认的CMake配置只有x64,我们可以新增x32的编译选项。选择配置里的“+”号3.
- 选择x86-debug
- 并分别对这两个配置进行一些参数的修改。选择其中一个配置,例如x64-Debug。我们修改为使用vs2019编译
另一个x86-Debug配置则修改为
- 分别编译生成vs项目
- 使用vs2019打开生成的项目文件,在项目属性-》C/C++ -》高级-》调用约定改为 _stdcall,然后再预处理器-》预处理器定义里面添加 _NO_CRT_STDIO_INLINE。
- 项目属性-》链接器-》命令行中添加 /kernel。
- 生成BeaEngine_s_d_l项目,即可得到对应架构的BeaEngine_s_d_l.lib。
在项目中使用BeaEngine
- 属性-》VC++目录 -》包含目录中添加BeaEngine项目中BeaEngine.h的位置。
- 属性-》VC++目录 -》库目录中添加BeaEngine项目中对应架构的BeaEngine_s_d_l.lib的位置
- 属性-》C/C++ -》预处理器-》预处理器定于中添加BEA_ENGINE_STATIC和BEA_USE_STDCALL。
- 属性-》链接器-》附加依赖项中添加BeaEngine_s_d_l.lib。
然后就可以正常编码了,以下是使用示例。
VOID DecodeIns(PVOID Address,ULONG Size)
{
DISASM disAsm = { 0 };
disAsm.EIP = (UIntPtr)Address;
disAsm.VirtualAddr = (UIntPtr)Address;
PUCHAR pEnd = (PUCHAR)(disAsm.EIP + Size);
LONG len;
while (disAsm.Error >= 0)
{
disAsm.SecurityBlock = (UIntPtr)pEnd - disAsm.EIP;
if ((Int32)disAsm.SecurityBlock <= 0) break;
len = Disasm(&disAsm);
switch (disAsm.Error)
{
case OUT_OF_BLOCK:
break;
case UNKNOWN_OPCODE:
disAsm.EIP += 1;
disAsm.VirtualAddr += 1;
break;
default:
{
disAsm.EIP += len;
disAsm.VirtualAddr += len;
break;
}
}
}
}