2017-01-23 81 views
-1

我想通过系统调用在asm中调用NtReadVirtualMemory。我出于几个不同的原因这样做,但这不重要。所以我定义我的主头文件,像这样的功能:C++ SysCall 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有用:

table

这里是为那些询问确切的错误:

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 

仍然得到错误与评论的解决方案:

[email protected] proc 

    mov r10, rcx 
    mov eax, 37h ; 
    syscall 
    ret 

[email protected] endp 

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

你能从链接器显示确切的错误吗? – Alden

+0

另外,你如何编译asm文件? – Alden

+0

这不是你如何做到的。您不要在自己的代码中使用“syscall”指令。您只需使用一个常规的'调用'来导出由NtDll.dll导出的函数。 –

回答

1

需要声明在C/C++函数作为

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

这是__stdcall功能

asmx86ml /c /Cp code32.asm - >code32.obj

.686p 

.MODEL flat 

_TEXT segment 

[email protected] proc 
... 
ret 20 
[email protected] endp 
_TEXT ends 
end 

asm x64的(ml64 /c /Cp code64.asmcode64.obj

_TEXT segment 
SysWPM proc 

    ... 
    ret 
SysWPM endp 


_TEXT ENDS 

END 
+0

它或者37或55我将同时测试。 我宣布它如何说,仍然收到错误 – Reece

+0

@Reece什么错误?请确切 - 我无法查看此远程 – RbMm

+0

未解析的外部。我甚至不认为ASM文件正在被编译到程序中 – Reece