我试图通过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);
答案 0 :(得分:1)
你需要在c / c ++中声明函数
extern "C" NTSTATUS NTAPI SysWPM(HANDLE ProcessHandle, PVOID BaseAddress,
PVOID Buffer, ULONG NumberOfBytesToWrite, PULONG NumberOfBytesWritten);
这是__stdcall
函数
和asm
x86
(ml /c /Cp code32.asm
- > code32.obj
)
.686p
.MODEL flat
_TEXT segment
_SysWPM@20 proc
...
ret 20
_SysWPM@20 endp
_TEXT ends
end
代表asm
x64(ml64 /c /Cp code64.asm
- > code64.obj
)
_TEXT segment
SysWPM proc
...
ret
SysWPM endp
_TEXT ENDS
END