繁体   English   中英

将外部 C 转换为内联 ASM

[英]Convert Extern C to Inline ASM

我有一个 C++ 项目,它调用位于 .asm (MASM) 文件中的 extern 函数。 有什么方法可以将 MASM 代码内联到 C++ 文件中,而不必使用单独的 .asm 文件?

.asm 文件

.data

.code

ZwReadVirtualMemory proc
    mov r10, rcx
    mov eax, 3Fh
    syscall
    ret
ZwReadVirtualMemory endp

end

这是C++文件

#include "stdafx.h"
#include <Windows.h>
#include <iostream>

using namespace std;

extern "C" NTSTATUS ZwReadVirtualMemory(HANDLE hProcess, void* lpBaseAddress, void* lpBuffer, SIZE_T nSize, SIZE_T* lpNumberOfBytesRead = NULL);

int main() {

    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 14648);
    if (!hProcess)
        return EXIT_FAILURE;

    int intBuffer = 0;
    void* lpBaseAddress = 0;
    SIZE_T lpNumberOfBytesRead = 0;

    NTSTATUS status = ZwReadVirtualMemory(hProcess, (PVOID)0x10ad0000, &intBuffer, sizeof(int), &lpNumberOfBytesRead);

    cout << "ZwRVM returned " << dec << status << endl;
    cout << "intBuffer = " << dec << intBuffer << endl;
    cout << "lpNumberOfBytesRead = " << lpNumberOfBytesRead << endl;

    cin.get();
}

某些 C/C++ 编译器支持非标准内联汇编块asm__asm__ 它们可用于将部分汇编代码合并到常规函数或方法中。

您的代码示例明确指出使用 WinAPI(因此 Windows 作为目标平台)和 Visual Studio 作为编译器( stdafx.h是最不可移植的部分)。 但是,Visual Studio 2010 和更高版本的更新停止支持 64 位目标的内联程序集: http : //msdn.microsoft.com/en-us/library/4ks26t93%28VS.100%29.aspx

您的选择:

  1. 将 MASM 文件编译成一个单独的目标文件,稍后将其与程序的其余部分链接。

  2. 使用适用于 Windows 的英特尔编译器。 它支持内联汇编器,旨在替代 Windows 上的 Microsoft 编译器,但是我不知道需要多少额外的移植工作。

  3. 汇编程序文件中唯一不能从 C/C+ 访问的部分是发出syscall机器指令。 如果您找到 MS VS 支持的该指令的内在函数,您可以使用它代替内联汇编块。 但是,我在这里找不到。 英特尔的内在函数 也好不到哪里去

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM