嘿,当我尝试编译代码时,我收到一个未定义的函数错误,我不知道为什么。
这是我的文件:
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/