2011-06-27 34 views
0

我正在讀的環0特權在視窗XPc語法LONG(NTAPI名稱)(type1,type2 ...);

在該代碼

獲取source code

有2行

其是

LONG (NTAPI *NtSystemDebugControl)  (int,void*,DWORD,void*,DWORD,DWORD*); 
*(DWORD*) &NtSystemDebugControl =(DWORD)GetProcAddress(LoadLibrary("ntdll"),"NtSystemDebugControl"); 

它是第一次看到這樣一個語法

兩行代表什麼意思?

回答

3

第一行創建一個函數指針,第二行以一種相當可怕的方式初始化函數指針(它在64位機器上會失敗,儘管在這種情況下可能無關緊要)。

如果你問什麼GetProcAddress建議閱讀MSDN

0

ULONG_PTR,這是有原因的。在DWORD與x64和x86兼容的情況下,這對成功至關重要。使用它:) x64的替代方法是DWORD64類型轉換,而不是。 GetProcAddress返回NtSystemDebugControl內部的偏移量ntdll

當在堆棧中查看時,與ntdll.dll!NtSystemDebugControl關聯的地址現在指向在typ​​edef中定義的函數指針。

從這裏你可以啓動指針這樣的:

NtSystemDebugControl My_NtSystemDebugControl; 
if (My_NtSystemDebugControl != NULL) { 
    My_NtSystemDebugControl(...); 
} 

基本上這是什麼所做的是解決在運行時API,而不需要在編譯時鏈接。如果您的申請在CFF Explorer中查看,那麼IAT (Import-Address-Table)將僅包含GetProcAddressLoadLibrary。但NtSystemDebugControl將不會出現,因爲它正在運行時被解析。

這樣做的好處是,它阻礙了很多反病毒的啓發式分析,它使得你的二進制文件的大小更小,因爲你在編譯時沒有連接大量無用的庫,並且它給了你更多的東西靈活性只需定義您需要的功能,而不是整個庫!

此外,您應該嘗試使用GetModuleHandle("ntdll"),並在進入LoadLibrary("ntdll")之前將結果與!= NULL進行比較,因爲它的侵擾性更小!

相關問題