拆解输出不正确(BeaEngine)

Incorrect disassemble output (BeaEngine)

本文关键字:BeaEngine 不正确 输出      更新时间:2023-10-16

为了使用visualstudio实现我认为正确的BeaEngine设置,我经历了巨大的麻烦。我将很快总结设置过程:使用cmake 3.6 x64构建,源文件->C:\Users/Ulysse/Documents/baengine masterCmakeLogs:配置完成生成已完成之后,我在visual studio中打开了解决方案,并在发布模式下编译以获得.lib和.dll文件:BeaEngine_stdcall_64.dll和BeaEngine_stdcall_64.lib。我已经包含了include和lib文件夹,并将lib文件添加到我的Visual Studio 2015 x64项目中的链接器->输入->附加依赖项中。该项目是一个32位控制台应用程序。我现在正试图运行一个取自BeaEngine网站的示例,它编译、运行,但没有提供正确的反汇编指令输出,代码在这里:

int main(void)
{
/* ============================= Init datas */
DISASM MyDisasm;
int nfalse = 0, ntrue = 1;
int len, i = 0;
bool Error = nfalse;
/* ============================= Init the Disasm structure (important !)*/
(void)memset(&MyDisasm, 0, sizeof(DISASM));
/* ============================= Init EIP */
int n;
_asm
{
push eax
call get_eip
jmp out1
get_eip : mov eax, [esp]
ret
out1 :
mov n, eax
pop eax
}
MyDisasm.EIP = n; //0x401000;
/* ============================= Loop for Disasm */
while ((!Error) && (i<100)) {
len = Disasm(&MyDisasm);
if (len != UNKNOWN_OPCODE) {
puts(MyDisasm.CompleteInstr);
MyDisasm.EIP = MyDisasm.EIP + len;
cout << i << endl;
cout << MyDisasm.CompleteInstr << endl;
std::printf("%c", MyDisasm.CompleteInstr);
i++;
}
else {
Error = true;
}
};
Sleep(100000);
return 0;
}

请注意,我不得不添加内联asm部分,因为BeaEngine的作者给出的示例会使程序崩溃(错误的EIP,因为我编译的程序从未从0x401000开始)。现在我已经更正了EIP,程序不再崩溃,而是放入foction打印不可打印的字符,并且我添加的printf始终显示相同的字符(不是ASCII)。花了一整天的时间,我是不是错过了一些显而易见的东西?

好吧,我花了整整一天的时间,但我发现了问题。奇怪的是,一个控制台win 32成功地用x64版本的库编译,而且一半的程序没有崩溃,几乎完美运行(因为它只是在最后一个反汇编过程中失败了)。我浏览了该项目的源代码,最后我只尝试了每一个cmake构建。实际的问题是没有选择cmakegui程序的stdcall选项。请注意,CMakeLists.txt文件的前几行是:项目(BeaEngine)cmake_minimum_required(2.6版)

设置(CMAKE_MODULE_PATH"${CMAKE_SOURCE_DIR}/CMAKE")

设置(CMAKE_VERBOSE_MAKEFILE打开)

选项(optHAS_OPTIMIZED"打开优化"关闭)选项(optHAS_SYMBOLS"使用调试符号构建"ON)选项(optBUILD_64BIT"构建64位可执行文件"关闭)选项(optBUILD_DLL"构建共享对象"关闭)选项(optBUILD_STDCALL"使用STDCALL构建"关闭)

但是,如果你试图让这个库工作,请确保在编译时使用以下两个核心选项:DLL->在STDCALL上->开。然后用msvc构建,你就可以开始了。