Win2K下的Api函式的攔截

2021-04-01 00:06:34 字數 3447 閱讀 2678

簡介:

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)的跳轉指令

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函式的攔截

win2k下的api函式的攔截 2007 01 01 17 09 api攔截並不是乙個新的技術,很多商業軟體都採用這種技術。對windows的api函式的攔截,不外乎兩種方法,第一種是mr.jeffrey richter 的修改exe檔案的模組輸入節,種方法,很安全,但很複雜,而且有些exe檔案,沒...

Win2K下的Api函式的攔截

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

Win2K下的Api函式的攔截

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