gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:20:50 25 4
gpt4 key购买 nike

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

这是我的文件:
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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com