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的輸入符號的列表,有可能出現攔截不到的情況。第二種方法就是...