c++ - 带extern “c”和汇编的未定义函数

标签 c++ windows assembly abi nt-native-api

嘿,当我尝试编译代码时,我收到一个未定义的函数错误,我不知道为什么。

这是我的文件:
Api.h

extern "C" NTSTATUS NtWriteVirtualMem(HANDLE ProcessHandle, PVOID BaseAddress, PVOID Buffer, ULONG NumberOfBytesToWrite, PULONG NumberOfBytesWritten);

API_ASM.asm
.code
_NtWriteVirtualMem:
    mov r10, rcx
    mov eax, 3Ah
    syscall
    ret

end

它们都可以正确编译,但是由于定义了NtWriteVirtualMem却在我的asm中定义了它,因此我收到了错误消息?

编辑1.

所以我将代码更改为:
PUBLIC NtWriteVirtualMem

_TEXT SEGMENT
NtWriteVirtualMem PROC
    mov r10, rcx
    mov eax, 3Ah
    syscall
    ret
    NtWriteVirtualMem ENDP
_TEXT ENDS
END

该程序现在可以编译,但是写入无效。我已经对其进行了测试,以查看writeprocessmemory是否可以正常工作。另外,我的IDE显示,当我将鼠标悬停在C源代码中的名称上时,NtWriteVirtualMem仍未定义。

编辑2.

此外,该操作的NTSTATUS返回码是最大负整数。

最佳答案

Windows x64在asm符号名称中不使用前导下划线_。您的asm标签名称应仅为NtWriteVirtualMem,与extern "C"函数名称匹配。

例如,请参阅Agner Fog的 call 约定指南。 http://www.agner.org/optimize/calling_conventions.pdf

(如果需要,还请确保告诉汇编程序将其导出。与NASM一样,您将使用global修改该标签声明。如果MASM需要proc / endp或标签可以工作,则使用IDK。)

您的固定版本正确链接,并且您确认执行通过syscall指令执行。可能是您传递了错误的args,传递了错误的方式或使用了错误的电话号码。

syscall ABI在Windows上未记录且不受支持,并且可以在内核版本之间进行更改。 https://j00ru.vexillium.org/syscalls/nt/64/说,在所有Windows 10版本上,NtWriteVirtualMem的电话号码都是3Ah,但我不知道您是否正确传递了其他参数。在Windows的早期版本中,0x3a是一个不同的系统调用。

我将把问题的这一部分留给使用Windows并知道该系统调用会做什么的人。

关于c++ - 带extern “c”和汇编的未定义函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60247247/

相关文章:

c++ - 如何修复 C++ 中的 'Heap has been corrupted ' 错误?

python - 使用 boost::python 时将 python.io 对象转换为 std::istream

c - 线程同步和设置线程的优先级

.net - 如何配置 OpenFileDialog 来选择文件夹?

assembly - 指令集架构的定义是什么?

c++ - 尝试使用外部库时 undefined reference

c++ - 尝试在 getline 中使用 int

windows - Powershell命令不起作用: removing lines from file1 that are in file2

c - 如何更改程序集中的指针值 (x86)

c - outb 宏中的 GCC 错误消息