溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Hook全版本IE并修改網(wǎng)址的示例分析

發(fā)布時(shí)間:2021-11-19 17:06:57 來(lái)源:億速云 閱讀:125 作者:小新 欄目:數(shù)據(jù)安全

這篇文章將為大家詳細(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)

Hook全版本IE并修改網(wǎng)址的示例分析

Hook全版本IE并修改網(wǎng)址的示例分析

我們要對(duì)Url進(jìn)行攔截修改所以先要查找和Url有關(guān)的函數(shù),這邊的Delay驗(yàn)證了我之前說(shuō)的wininet.dll是延遲導(dǎo)入IAT HOOK是無(wú)效的。Hook全版本IE并修改網(wǎng)址的示例分析

這里我們找到了InternetCrackUrl這個(gè)函數(shù)同時(shí)上面一個(gè)InternetConnect看上去非常有用,調(diào)試IE在該函數(shù)加斷點(diǎn) 這里我使用的是開(kāi)源的x64_dbg 輸入指令bp InternetConnectW

Hook全版本IE并修改網(wǎng)址的示例分析這樣我們可以確定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)行注入的

Hook全版本IE并修改網(wǎng)址的示例分析

需要對(duì)ie的所有進(jìn)程進(jìn)行注入,如果自己編寫(xiě)注入器的話需要注意x86和x64的區(qū)分注入方法非常多這里我就不多做累述了,值得注意的是雖然Proccess Hacker是驅(qū)動(dòng)級(jí)任務(wù)管理器,但是部分進(jìn)程他還是無(wú)法直接注入的,需要大家自己編寫(xiě)注入代碼。

最后附上效果圖

Hook全版本IE并修改網(wǎng)址的示例分析無(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)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI