Avi*_*viv 7 c windows x86 assembly visual-studio
所以直截了当地问我:如何用32位ASM编译器编译我的ASM文件,将它包含在我的64位项目中并使用ASM文件的函数名访问编译后的代码?
如果有点不清楚,我可以详细说明:
我正在将我的一个项目从32位转换为64位,我遇到了技术问题.我的项目编译一个ASM文件,并使用编译后的二进制文件作为其用法的输入.
当我的项目是32位时,它很容易.我在项目中包含了ASM文件并添加了一个构建规则来编译它们Microsoft Macro Assembler
- 然后我可以从我的32位项目中访问已编译的代码,将我想要从ASM访问的每个函数导出.h
到头文件并使用它来访问它函数名称(我能够这样做,因为它被编译为obj,链接器知道符号,因为我将原型导出到.h
文件中).
现在,我需要将此代码转换为64位,但我仍然需要将ASM编译为32位代码,并且仍然可以执行相同的操作(从我的64位程序访问已编译的32位代码) ).但是,当我尝试编译它时,它显然无法识别指令,因为现在整个项目被编译为64位代码.
提前致谢.
如果我试图将 32 位代码嵌入到 64 位程序中(这是一件可疑的事情,但为了论证,让我们说你有充分的理由并且实际上知道你在做什么\xe2\x80\x94 我会采用 32 位代码,无论是用 C、汇编还是其他语言编写的 \xe2\x80\x94 并将其编译为单独的项目,生成一个 DLL输出。这在编译链中不涉及额外的奇怪之处:它只是一个普通的 32 位 DLL。
\n\n然后,该 32 位 DLL 可以作为二进制资源 \xe2\x80\x94 嵌入到您的 64 位应用程序中,只是您可以加载和访问的一块内存。
\n\n那么,如何使用该 DLL 中的编译代码实际执行任何操作呢?我会使用 Joachim Bauch 的MemoryModule库的某种破解版本来访问它。MemoryModule 旨在从一大块内存加载 DLL 并提供对其导出 \xe2\x80\x94 的访问,它就像 Windows API 一样LoadLibrary()
,仅从内存而不是从文件。它的设计目的是使用与调用进程相同的位大小,但是通过一些技巧,您可能可以将其编译为 64 位库,但能够读取 32 位库。由此产生的用法将非常简单:
// Load the embedded DLL first from the current module.\nhresource = FindResource(hmodule, "MyLibrary.DLL", "binary");\nhglobal = LoadResource(hmodule, hresource);\ndata = LockResource(hglobal);\nsize = SizeofResource(hmodule, hresource);\n\n// Turn the raw buffer into a "library".\nlibraryHandle = MemoryLoadLibrary(data, size);\n\n// Get a pointer to some export within it.\nmyFunction = MemoryGetProcAddress(libraryHandle, "myFunction");\n
Run Code Online (Sandbox Code Playgroud)\n\n也就是说,正如我之前提到的(其他人也提到过),即使您可以获得指向导出的指针,您也无法调用它们,因为代码是 32 位的,甚至可能无法调用它们。加载到低于 4GB 标记的地址。但如果您确实想在 64 位应用程序中嵌入 32 位代码,我就会这样做。
\n 归档时间: |
|
查看次数: |
649 次 |
最近记录: |