Windows 2000下Api函式的攔截分析

2021-04-01 09:26:35 字數 2982 閱讀 2502

簡介:

api攔截並不是乙個新的技術,很多商業軟體都採用這種技術。對windows的api函式的攔截,不外乎兩種方法,第一種是mr. jeffrey richter 的修改exe檔案的模組輸入節,種方法,很安全,但很複雜,而且有些exe檔案,沒有dll的輸入符號的列表,有可能出現攔截不到的情況。第二種方法就是常用的jmp ***的方法,雖然很古老,卻很簡單實用。

本文一介紹第二種方法在win2k下的使用。第二種方法,win98/me 下因為進入ring0級的方法很多,有ldt,idt,vxd等方法,很容易在記憶體中動態修改**,但在win2k下,這些方法都不能用,寫wdm太過複雜,表面上看來很難實現,其實不然。win2k為我們提供了乙個強大的記憶體api操作函式---virtualprotectex,writeproces**emeory,readproces**emeory,有了它們我們就能在記憶體中動態修改**了,其原型為:

bool virtualprotectex(

handle hprocess, // 要修改記憶體的程序控制代碼

lpvoid lpaddress, // 要修改記憶體的起始位址

dword dwsize, // 修改記憶體的位元組

dword flnewprotect, // 修改後的記憶體屬性

pdword lpfloldprotect // 修改前的記憶體屬性的位址

); bool writeproces**emory(

handle hprocess, // 要寫程序的控制代碼

lpvoid lpbaseaddress, // 寫記憶體的起始位址

lpvoid lpbuffer, // 寫入資料的位址

dword nsize, // 要寫的位元組數

lpdword lpnumberofbyteswritten // 實際寫入的子節數

); bool readproces**emory(

handle hprocess, // 要讀程序的控制代碼

lpcvoid lpbaseaddress, // 讀記憶體的起始位址

lpvoid lpbuffer, // 讀入資料的位址

dword nsize, // 要讀入的位元組數

lpdword lpnumberofbytesread // 實際讀入的子節數

); 具體的引數請參看msdn幫助。在win2k下因為dll和所屬程序在同一位址空間,這點又和win9x/me存在所有程序存在共享的位址空間不同,因此,必須通過鉤子函式和遠端注入程序的方法,現以乙個簡單採用鉤子函式對messageboxa進行攔截例子來說明:

其中dll檔案為:

hhook g_hhook;

hinstance g_hinstdll;

farproc pfmessageboxa;

int winapi mymessageboxa(hwnd hwnd, lpctstr lptext,lpctstr lpcaption,uint utype);

byte oldmessageboxacode[5],newmessageboxacode[5];

hmodule hmodule ;

dword dwidold,dwidnew;

bool bhook=false;

void hookon();

void hookoff();

bool init();

lresult winapi moushook(int ncode,wparam wparam,lparam lparam);

bool apientry dllmain( handle hmodule,

dword ul_reason_for_call,

lpvoid lpreserved )

case dll_thread_attach:

case dll_thread_detach:

case dll_process_detach:

if(bhook) unintallhook();

break;

} return true;

} lresult winapi hook(int ncode,wparam wparam,lparam lparam)//空的鉤子函式

hookapi2_api bool installhook()//輸出安裝空的鉤子函式

return(true);

} hookapi2_api bool uninstallhook()//輸出御在鉤子函式

bool init()//初始化得到messageboxa的位址,並生成jmp ***(mymessageboxa)的跳轉指令

newmessageboxacode[0]=0xe9;//jmp mymessageboxa的相對位址的指令

_a**

dwidnew=getcurrentprocessid(); //得到所屬程序的id

dwidold=dwidnew;

hookon();//開始攔截

return(true);

} int winapi mymessageboxa(hwnd hwnd, lpctstr lptext,lpctstr lpcaption, uint utype )//首先關閉攔截,然後才能呼叫被攔截的api 函式

void hookon()

void hookoff()//將所屬程序中jmp mymessageboxa的**改為jmp messageboxa

//測試檔案:

int apientry winmain(hinstance hinstance,

hinstance hprevinstance,

lpstr lpcmdline,

int ncmdshow)

messageboxa(null,"test","test",mb_ok);//可以看見test變成了hook,也可以在其他程序中看見

if(!uninstallhook())

return 0;

}

Windows 2000下許可權特性

許可權是具有繼承性 累加性 優先性 交叉性的。繼承性是說下級的目錄在沒有經過重新設定之前,是擁有上一級目錄許可權設定的。這裡還有一種情況要說明一下,在分區內複製目錄或檔案的時候,複製過去的目錄和檔案將擁有它現在所處位置的上一級目錄許可權設定。但在分區內移動目錄或檔案的時候,移動過去的目錄和檔案將擁有...

清空密碼進入WINDOWS2000

windows200所在的winnt system32 config下有乙個sam檔案 即賬號密碼資料庫檔案 它儲存了windows2000中所有的使用者名稱和密碼,當你登入時,系統就會把你輸入 的使用者名稱和密碼與sam檔案中的加密資料進行校對,如果兩者完全相符,則會順利進入系統,否則將無法的登入...

關於如何註冊Windows2000服務

想讓乙個程式在啟動系統的時候自動執行,你有什麼好辦法?新增到啟動組?那如果別人刪除掉就不管用了。如果你使用了windows nt 2000 xp,就可以試試把這個程式新增為乙個服務,這樣只有擁有許可權的人才可以更改服務,只要你設定好許可權,就不用擔心會被別人刪除了。把這兩個程式儲存在乙個方便的位置,...