-1

我正在尝试通过 asm 中的系统调用调用 NtReadVirtualMemory。我这样做有几个不同的原因,但这并不重要。所以我在我的主头文件中定义了这样的函数:

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);
4

1 回答 1

2

你需要在 c/c++ 中声明函数为

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

这是__stdcall功能

并在asmfor x86( ml /c /Cp code32.asm-> code32.obj)

.686p

.MODEL flat

_TEXT segment

_SysWPM@20 proc
...
ret 20
_SysWPM@20 endp
_TEXT ends
end

对于asmx64 ( ml64 /c /Cp code64.asm-> code64.obj)

_TEXT segment 
SysWPM proc

    ...
   ret
SysWPM endp


_TEXT ENDS

END
于 2017-01-23T20:13:07.047 回答