Win2K下的Api函式的攔截

2021-04-12 16:47:41 字數 3149 閱讀 3477

win2k下的api函式的攔截

2007-01-01 17:09

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; 

Win2K下的Api函式的攔截

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

Win2K下的Api函式的攔截

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

Win2K下的Api函式的攔截

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