2013-03-30 58 views
2

我一直在研究這段代碼幾個小時,這讓我瘋狂!在內存中創建一個進程C++

整個來源在這裏http://pastebin.com/Urxh68W4但我敢肯定,我知道這個問題。

extern "C" NTSYSAPI LONG NTAPI ZwUnmapViewOfSection(HANDLE, PVOID); 

當我運行它,我得到以下錯誤:

Error 1 error LNK2019: unresolved external symbol [email protected] referenced in function [email protected] 

我猜,有一些DLL或圖書館中,我應該包括,所以我說Ntoskrnl.lib到我的項目,因爲它包含ZwUnmapViewOfSection函數。

我絕對不知道該怎麼做。我應該使用Ntdll.dll嗎?如果是這樣,我怎麼連一個DLL?我以爲你只能使用Visual Studio 2010中的庫。

另外,究竟是NTSYSAPI和NTAPI?網上幾乎沒有任何信息。

任何幫助將非常感謝!

+0

最有可能的一個是調用約定,一個是導出規範。 – chris

+0

你能詳細說一下嗎?你有點模糊。 –

+0

看起來您正嘗試在用戶模式程序中使用內核模式API(適用於驅動程序)的功能。他們不會在一起。如果你需要關於內核模式API的信息,那麼可以使用WDK(Windows驅動程序工具包)。 – rhashimoto

回答

5

這看起來像用戶模式的代碼,所以你可能不想鏈接到ntoskrnl.lib。你寧願鏈接ntdll。

我可能會這樣做的方式是使用動態鏈接並調用GetProcAddressHANDLE傳遞給ntdll.dll和ZwUnmapViewOfSection

示例代碼:

typedef LONG (NTAPI *pfnZwUnmapViewOfSection)(HANDLE, PVOID); 
HMODULE hMod = GetModuleHandle("ntdll.dll"); 
pfnZwUnmapViewOfSection pZwUnmapViewOfSection= (pfnZwUnmapViewOfSection)GetProcAddress(hMod, "ZwUnmapViewOfSection"); 

我沒有編這一點,但它應該是類似的東西(也許添加一些錯誤檢查等)。

關於您的其他問題:NTAPI是一個宏定義調用約定,在這種情況下__stdcallcalling convention與如何傳遞函數的參數有關,以及誰將清除這些參數。

例如,__stdcall要求將參數按相反順序推入堆棧,被調用者將清理堆棧。

同樣,NTSYSAPI是一個宏,如果我正確記得,它只是解析爲__declspec(dllimport)

另外,我應該指出,在用戶模式下調用NtDll導出的函數通常會被忽略。而且,您正在編寫的代碼在整個過程中也會遇到其他問題(即使它似乎正在工作)。

如果您正在尋找另一個執行與您正在編寫的任務非常類似的任務的代碼示例,您可以檢查here。這是Duqu惡意軟件所使用的技術。祝你好運!

+0

「如果我記得正確。」大聲笑認真嗎?你只是從頭頂上知道這些東西?!這就是我喜歡SO的原因,有這麼多優秀的程序員。我的父親在VB.NET程序,所以他永遠不能幫助我與C++ DX –

+0

Np的男人,很高興我可以幫助。並小心與內存駐留代碼的東西。 ;) – mrduclaw