2017-01-23 4666 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