C++系统调用未解决的外部问题
我正在尝试通过asm中的系统调用调用NtReadVirtualMemory。我这样做有几个不同的原因,但这并不重要。因此,我在主头文件中定义了如下函数:C++系统调用未解决的外部问题,c++,assembly,memory,ntdll,C++,Assembly,Memory,Ntdll,我正在尝试通过asm中的系统调用调用NtReadVirtualMemory。我这样做有几个不同的原因,但这并不重要。因此,我在主头文件中定义了如下函数: extern "C" NTSTATUS SysWPM(HANDLE ProcessHandle, PVOID BaseAddress, PVOID Buffer, ULONG NumberOfBytesToWrite, PULONG NumberOfBytesWritten); 我相信这些参数是正确的 然后我在项目中创建了一个ASM文件。我对
extern "C" NTSTATUS SysWPM(HANDLE ProcessHandle, PVOID BaseAddress,
PVOID Buffer, ULONG NumberOfBytesToWrite, PULONG NumberOfBytesWritten);
我相信这些参数是正确的
然后我在项目中创建了一个ASM文件。我对它的了解只足以尝试完成这项任务,因为它只是其中的一小部分。假设你不需要在任何地方包含这个asm文件,所以我把它留下了。这是:
.code
SysWPM proc
mov r10, rcx
mov eac, 37h
syscall
ret
SysWPM endp
end
然而,现在当我编译时,我得到了未解决的外部错误。我相信这是因为我需要在这个ASM文件中定义它,但我不知道如何去做。我做错了什么/我该怎么办
我想提及我在Windows 7上,实际的系统调用索引为37可能会有用,如下表所示:
以下是提问者的确切错误:
1>Main.obj : error LNK2019: unresolved external symbol _SysWPM referenced in function _main
1>c:\users\Reece\documents\visual studio 2015\Projects\cs-ext\Debug\cs-ext.exe : fatal error LNK1120: 1 unresolved externals
仍在使用已注释的解决方案获取错误:
_SysWPM@20 proc
mov r10, rcx
mov eax, 37h ;
syscall
ret
_SysWPM@20 endp
extern "C" NTSTATUS NTAPI SysWPM(HANDLE ProcessHandle, PVOID BaseAddress,
PVOID Buffer, ULONG NumberOfBytesToWrite, PULONG NumberOfBytesWritten);
您需要将c/c++中的函数声明为
extern "C" NTSTATUS NTAPI SysWPM(HANDLE ProcessHandle, PVOID BaseAddress,
PVOID Buffer, ULONG NumberOfBytesToWrite, PULONG NumberOfBytesWritten);
这是stdcall函数
对于x86 ml/c/Cp code32.asm->code32.obj,在asm中
对于asm x64 ml64/c/Cp code64.asm->code64.obj
你能显示链接器的确切错误吗?还有,你是如何编译asm文件的?你不是这样做的。在自己的代码中不使用syscall指令。您只需使用对NtDll.dll导出的函数的常规调用。请确保从asm文件(例如PUBLIC SysWPM或SysWPM proc PUBLIC)导出该函数,并使用正确的命名约定。嗯。。。不需要。只需针对相应的库ntdll.lib和ntdllp.lib进行链接即可。此外,错误消息显示了链接器正在查找的确切符号。只需重命名你的ASM程序名。它是37或55,我将测试两者。我是按你说的那样说的,现在我还在听error@Reece什么错误?请准确-我无法查看此远程未解析的外部文件。我甚至不认为ASM文件正在编译到program@Reece未解析的外部-确切名称是什么!?!您是否理解需要显示此R10和rcx当然不是x86寄存器。
.686p
.MODEL flat
_TEXT segment
_SysWPM@20 proc
...
ret 20
_SysWPM@20 endp
_TEXT ends
end
_TEXT segment
SysWPM proc
...
ret
SysWPM endp
_TEXT ENDS
END