您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)Hook全版本IE并修改網(wǎng)址的示例分析,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
先導(dǎo)入一波引用
#include <windows.h>
#include <WinInet.h>
#include <string>
#include <iostream>
using std::string;
using namespace std;
#pragma comment(lib,"wininet.lib")
首先我們知道http應(yīng)用層的函數(shù)基本都在wininet.dll中故我們導(dǎo)出wininet.dll的函數(shù)列表(這里我使用的是ProcessHacker)
我們要對(duì)Url進(jìn)行攔截修改所以先要查找和Url有關(guān)的函數(shù),這邊的Delay驗(yàn)證了我之前說(shuō)的wininet.dll是延遲導(dǎo)入IAT HOOK是無(wú)效的。
這里我們找到了InternetCrackUrl這個(gè)函數(shù)同時(shí)上面一個(gè)InternetConnect看上去非常有用,調(diào)試IE在該函數(shù)加斷點(diǎn) 這里我使用的是開(kāi)源的x64_dbg 輸入指令bp InternetConnectW
這樣我們可以確定IE在訪問(wèn)網(wǎng)址是必然會(huì)執(zhí)行這個(gè)函數(shù)我們需要對(duì)其進(jìn)行inline hook,避免大家采坑說(shuō)明一下IAT Hook是行不通的,IE瀏覽器進(jìn)行了DelayLoad,一開(kāi)始并沒(méi)有加載wininet.dll,通過(guò)查找wininet.h我們可以得到該函數(shù)的參數(shù)以及類型
typedef HINTERNET(WINAPI *tInternetConnectWFunc) ( HINTERNET hInternet, LPCWSTR lpszServerName, INTERNET_PORT nServerPort, LPCWSTR lpszUserName, LPCWSTR lpszPassword, DWORD dwService, DWORD dwFlags, DWORD_PTR dwContext );
注意一定要引入wininet.h不然會(huì)有類型找不到
接下來(lái)我們需要準(zhǔn)備一個(gè)變量來(lái)存儲(chǔ)該函數(shù)的原調(diào)用
tInternetConnectWFunc oInternetConnectWFunc ;
然后需要編寫(xiě)該函數(shù)的新回調(diào),注意這邊用到了Hook和UnHook需要現(xiàn)在頭部聲明,另外WCharToMByte這個(gè)轉(zhuǎn)換函數(shù)在文章最后我會(huì)給出。
HINTERNET WINAPI hkInternetConnectW( HINTERNET hInternet,//internet句柄(我是這么理解的) LPCWSTR lpszServerName,//服務(wù)器名 INTERNET_PORT nServerPort,//端口 LPCWSTR lpszUserName, LPCWSTR lpszPassword, DWORD dwService, DWORD dwFlags, DWORD_PTR dwContext ) { UnHook();//先解除hook取得返回值后在重新Hook oInternetConnectWFunc = (tInternetConnectWFunc)GetProcAddress(GetModuleHandle(L"wininet.dll"), "InternetConnectW");//通過(guò)wininet.dll獲取原函數(shù)并轉(zhuǎn)換成我們聲明好的類型 LPCWSTR url = lpszServerName; if (WCharToMByte(url).find("*****.com") == string::npos)//此處判斷是否是某地址不是強(qiáng)制修改為某地址 { url = L"*****.com"; } HINTERNET rest = oInternetConnectWFunc(hInternet, url, nServerPort, lpszUserName, lpszPassword, dwService, dwFlags, dwContext);//再次強(qiáng)調(diào)現(xiàn)貨區(qū)返回值在恢復(fù)hook InHook(); return rest; }
接下來(lái)是InLineHook非常簡(jiǎn)單
BYTE oldAddress[5]; BYTE newAddress[5] = { 0xE9 }; void InHook() { memcpy(oldAddress, InternetConnectW, 2); //保存原字節(jié) BYTE pByte[2] = { 0xEB,0xF9 }; //優(yōu)化以防重復(fù)Hook if (*(BYTE*)InternetConnectW == 0xEB) return; // 計(jì)算偏移 DWORD Offset = (DWORD)hkInternetConnectW - (DWORD)InternetConnectW; *(DWORD*)(newAddress + 1) = Offset; DWORD Protect; VirtualProtect((LPVOID)((DWORD)InternetConnectW - 5), 7, PAGE_EXECUTE_READWRITE, &Protect);//修改內(nèi)存屬性 // 修改函數(shù)地址數(shù)據(jù) memcpy((LPVOID)((DWORD)InternetConnectW - 5), newAddress, 5); memcpy(InternetConnectW, pByte, 2); VirtualProtect((LPVOID)((DWORD)InternetConnectW - 5), 7, Protect, &Protect);// 還原內(nèi)存屬性 }
void UnHook() { DWORD Protect; VirtualProtect(InternetConnectW, 2, PAGE_EXECUTE_READWRITE, &Protect); memcpy(InternetConnectW, oldAddress, 2); VirtualProtect(InternetConnectW, 2, Protect, &Protect); }
最后就是dll的入口
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: InHook(); case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; }
最后是講LPCESTR 轉(zhuǎn)換成string的函數(shù),該函數(shù)需要放在最上面,或者先聲明在調(diào)用
string WCharToMByte(LPCWSTR lpcwszStr) { string str; DWORD dwMinSize = 0; LPSTR lpszStr = NULL; dwMinSize = WideCharToMultiByte(CP_OEMCP, NULL, lpcwszStr, -1, NULL, 0, NULL, FALSE); if (0 == dwMinSize) { return FALSE; } lpszStr = new char[dwMinSize]; WideCharToMultiByte(CP_OEMCP, NULL, lpcwszStr, -1, lpszStr, dwMinSize, NULL, FALSE); str = lpszStr; delete[] lpszStr; return str; }
到這里基本就完成了,這邊值得注意的是ie11有多個(gè)進(jìn)程主進(jìn)程是64位每個(gè)標(biāo)簽的子進(jìn)程是32位故此我們需要編譯成Release x86 和x64兩個(gè)版本,注入我這邊測(cè)試是使用ProcessHacker進(jìn)行注入的
需要對(duì)ie的所有進(jìn)程進(jìn)行注入,如果自己編寫(xiě)注入器的話需要注意x86和x64的區(qū)分注入方法非常多這里我就不多做累述了,值得注意的是雖然Proccess Hacker是驅(qū)動(dòng)級(jí)任務(wù)管理器,但是部分進(jìn)程他還是無(wú)法直接注入的,需要大家自己編寫(xiě)注入代碼。
最后附上效果圖
無(wú)法上傳視頻對(duì)效果圖簡(jiǎn)單說(shuō)明一下tab欄顯示的是tb實(shí)際上卻是bd,對(duì)于其他瀏覽器不一定直接使用InternetConnectW,但是大家也可以通過(guò)此方法調(diào)試瀏覽器后寫(xiě)出方法。
關(guān)于“Hook全版本IE并修改網(wǎng)址的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。