【原創】PC微信逆向分析の強制輸出微信調式信息

zmrbak(趙慶明老師)

前言

2019年4月份 JieKeH的一篇文章《PC微信逆向—分析獲取登錄二維碼的數據》一文,讓不少的朋友對微信這個軟件產生了濃厚的興趣,當然也包括我。令我印象最深刻的莫過於“打開微信的Xlog日誌輸出”這部分內容。

雖然騰訊公司在微信的發佈版本中對調試信息進行了屏蔽,但JieKeH通過IDA反彙編的僞代碼與Xlog源碼對比的方式找到了輸出調試信息的關鍵點,並提供了突破屏蔽的方法。在學習了這篇文章後,本人也通過OD中的反彙編代碼與Xlog源碼對比的方式,同樣找到了相應的關鍵點,之後將其錄製成一個視頻分享給了身邊一起研究的朋友們。

新問題新對策

很不幸,該文章出現後不久,新版本的微信進行了相應的調整,JieKeH文章中所講述的方法完全失效。身邊的朋友不時告訴我,這個方法失效了,同時請教我還有什麼辦法可以輸出這些調試信息。其實,玩過HOOK的朋友,會馬上想到另一個辦法,就是寫一個dll注入,在dll中編寫相應的邏輯實現需要的功能。我用這種方法錄製了一個小視頻分享之後,再也沒有人問過這個問題。看來這個辦法還是不錯的!

更簡單的方式

編寫DLL,所涉及到的知識較多,涉及到編碼、編譯、注入等一系列操作,不但操作複雜而且修改也不容易。近日,最新正式版的微信2.8.0.106推出,我在此新版本上進程了相關的嘗試,其實只是在CE中進行簡單的一些設置,即可滿足需求,就算是新手也不難掌握。由於剪輯視頻太耗時間,而且相比於上一個視頻也沒多少新意,因此僅整理成文檔分享給大家。部分內容,之前的視頻中有講解,這裏就不再贅述,直接進入本文主題。

定位“是否啓用調試”的地址

在OD中附加微信後,查詢二進制代碼“74 14 FF B5 EC FE FF”(爲何是這個二進制代碼,請參考之前的視頻講解),定位到如下代碼片段,並在接下來的CALL(WeChatWi.79164604)上下一個斷點:
在這裏插入圖片描述
ds:[0x79A6CA01],這個地址,就是是否啓動調試的開關。計算出偏移地址:0x160CA01。在微信中,這個地址中的數據被設置成0,因此調試信息將不會輸出。只要將這個地址中的數據更改爲1,那麼輸出調試信息的開關就被打開了。但是,調試信息還有其他開關,那就是調試級別。

定位“調試級別”的地址

查詢二進制代碼“56 89 9D F0 FB FF FF”(爲何是這個二進制代碼,請參考之前的視頻講解),定位到如下代碼片段:
在這裏插入圖片描述
進入 WeChatWi.79154DB0這個CALL後,到達如下代碼片段:
在這裏插入圖片描述
ds:[0x79A1CD54],這個地址,就是調試級別的設置。計算出偏移地址:0x15BCD54。在微信中,這個地址中的數據被設置成2,也就是高於“kLevelDebug”的信息纔會被輸出。只要將這個地址中的數據更改爲0,也就是“kLevelAll”或“kLevelVerbose”,也就是輸出全部調試信息。

定位調試數據的代碼段

在JieKeH的文章中,完成這兩步設置後,調試信息即可輸出,在DebugView中課捕獲微信自身的調試信息。正如前文所述,隨着微信版本的升級,此方法很快失效。於是,基於此設置,我再用HOOK的方式,重新讓微信具備了調試信息的輸出的功能。到目前最新的2.8.0.106版本,HOOK方法依然有效。當然,無論怎麼做,定位調試數據這個步驟還是不能少的。

用鼠標動一動微信,OD中程序將暫停在調用“WeChatWi.79164604”處(之前下的斷點處),按F7進入該函數。注意觀察堆棧窗口,持續按F8,單步執行,直到堆棧頂部出現如下類似的信息。這些信息,就是原本要輸出的調試信息。接下來,在HOOK中,同樣把這個數據提取出來,從調試信息中輸出,然後在DebugView中捕獲。
在這裏插入圖片描述
這時候,觀察程序運行的代碼部分,計算出該代碼片段中“add esp,0x4c“所在彙編代碼的偏移地址:0x‭CE7853‬。其代碼片段如下:‬
在這裏插入圖片描述
在上一個HOOK的視頻中,我在這裏進行了HOOK。在本文中,我使用CE來進行一小段“代碼注入”即可代替編寫DLL這種難度高、而且手續繁雜的工作。

定位堆棧中數據的地址

雖然數據在堆棧頂部,但是由於下來要對堆棧進行操作,如果使用ESP來取數據,還需一些手動的計算,稍顯麻煩。由於EBP在堆棧操作過程中會保持不變,因此我們使用EBP加上一定的偏移量來取數據,這樣就不需要額外的手動計算。

在OD堆棧窗口中,點右鍵選擇“轉到EBP“,在該行的地址上雙擊,變成”$==>“

在這裏插入圖片描述

然後,在OD堆棧窗口中,點右鍵選擇“轉到ESP“,記錄該行相對於EBP的偏移:$-40E0。也就是說,當前的數據位於[ebp-0x40E0]這個地方,也就是ESP所指向的地方。因此,我們取到了數據存儲的地址:ebp-0x40E0。

在這裏插入圖片描述

使用CE編寫代碼注入腳本

啓動CE,附加微信。點擊“手動添加地址”,分別添加“WeChatWin.dll+0x160CA01”與“WeChatWin.dll+0x15BCD54”,再分別命名爲“輸出調試信息”和“設置調試級別”,再將其值分別更改爲1與0,如下圖所示:
在這裏插入圖片描述
點擊“查看內存”,定位到“WeChatWin.dll+CE7853”,並選中此行。

在這裏插入圖片描述
接下來,在“內存瀏覽器”窗口中依次點擊“工具\自動彙編”,在彈出的新窗口中,依次點擊“模板\CT表框架代碼”,再依次點擊“模板\代碼注入”,確保彈出對話框中內容爲““WeChatWin.dll”+CE7853”(代碼選中的位置),點擊“OK”。
在這裏插入圖片描述
接下來,依次點擊“文件\分配到當前的CT表”,然後點擊關閉。CE的主窗口中將多出一行內容。將其改名爲“OutPutDebug”。記得隨時按Ctrl+s(保存)。

在這裏插入圖片描述
雙擊OutPutDebug中的數值欄中的“腳本”,在打開的新窗口中對該腳本進行編輯。在newmem與originalcode之間添加如下代碼(備註:0x7747efd0,就是OutputDebugStringA函數地址。相關理論,不贅述):

pushad
push [ebp-0x40E0]
call 0x7747efd0
popad

在這裏插入圖片描述

點擊“確定”。記得再按Ctrl+s保存。

開始測試

  • 輸出調試信息:1
  • 設置調試級別:0
  • OutPutDebug:啓用(那個方框中間畫一個叉)

在這裏插入圖片描述

以管理管身份啓動“DebugView”軟件,用鼠標動一動微信,即可觀察到微信輸出的調試信息。
在這裏插入圖片描述

源碼及工具

https://github.com/zmrbak/PcWeChatHooK

交流QQ羣:

456197310 點擊鏈接加入羣聊【軟件逆向分析入門】

發佈了30 篇原創文章 · 獲贊 11 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章