Windows逆向分析入門(八)——實戰篇(收發文本消息)


前言

  這一篇,用到找偏移的第三個方法:日志;第四個方法:字符串;第五個方法:系統函數;第六個方法:第三方庫。目標是收發文本消息。

 

一、發送消息
  分析

  1、發送信息的一般流程

    1、界面上編輯消息

    2、點擊發送按鈕

    3、消息存入數據庫

    4、通過網絡發送出去

 

  2、可以切入的點

    1、界面

    2、數據庫

    3、網絡發送函數

 

  3、入手方式

    界面入手,得跟蹤Duilib的響應過程

    數據庫入手,得監聽數據庫Sqlite的函數

    網絡函數入手,數據依據加密了,難識別出來

 

    數據從產生到發送,中間會有比較長的過程。

    看下日志有沒有可以參考的信息。

 

  Xlog

    WX的日志模塊是第三方庫:Xlog。

    關於Xlog的介紹和分析,后續會分享了《微信日志Xlog分析——帶源碼》。

 

    注入打開日志的dll

 

    隨便操作界面,就有日志輸出

 

發送一個文本信息

  日志看到了關鍵詞On MsgAdd PrefixId,和 sendTextMsg。

 

  用OD搜索字符串,發現沒有sendTextMsg,但是有On MsgAdd PrefixId,進行斷點。

 

觸發斷點

  函數調用的關系有兩種

    1、函數A調用函數B,函數B調用函數C(一條線)

    2、函數A調用函數B,函數A調用函數C(分叉開)

  點擊發送按鈕,WX會收到操作信息,部分信息給Duilib處理,部分信息給系統自帶的函數處理:ntdll.NtdllDefWindowProc_W。

  堆棧里面往下翻,發現有這個函數。意味着這個斷點的位置,和發送消息函數的調用的關系是一條線的。也就是說,在堆棧就能找到發送消息的函數。

  

 

找函數

  問題來了,堆棧這么多函數,到底哪一個呢?

  一般發送消息函數的格式是:發送消息函數(參數:接收人,參數:發送的消息)

  函數的調用約定有多種情況 __fastcall __stdcall __cdecl __thiscall。

  這就意味這發送消息函數至少需要兩個參數.

  但不一定都在堆棧,可能在ecx或者edx。

  從斷點往回找,看有沒有滿足條件的。

 

1、第一個函數,堆棧沒有關鍵的參數,函數也沒用到ecx和edx,排除。

 

2、第二個函數,堆棧有發送的消息;兩個參數,其中一個是0,函數也沒用到ecx和edx,排除

 

3、第三個函數,堆棧有接收人;三個參數,沒有發送的消息,函數也沒用到ecx和edx,排除

 

4、第四個函數,堆棧有發送的消息;用到ecx和edx,加上3個push,總共五個參數,斷點看下

 

  可以看到這里的參數是齊全的。

 

  但是參數1未知,[ebp-0x738]是函數內一個變量,清空后發現能發送信息,可以直接偽造

 

修改發送的內容,驗證下

  1、發送老的信息 oldmsg

  2、od里看下攔截的數據也是oldmsg

  3、修改成newmsg

  4、最終發送的是newmsg,這里就是我們要找的發送信息函數

 

算偏移

  基址 :5A090000

    Executable modules, 條目 8

    基址=5A090000

    大小=01946000 (26501120.)

    入口=5ADE4A63 WeChatWi.<ModuleEntryPoint>

    名稱=WeChatWi

    文件版本=2.9.0.123

    路徑=C:\Program Files (x86)\Tencent\WeChat\WeChatWin.dll

 

源碼

  5A17CA91    6A 01        push 0x1                                 ; 參數5:1

  5A17CA93    8D43 34    lea eax,dword ptr ds:[ebx+0x34]

  5A17CA96    50              push eax                                 ; 參數4:空結構

  5A17CA97    53              push ebx                                 ; 參數3:發送的消息

  5A17CA98    8D55 9C         lea edx,dword ptr ss:[ebp-0x64]          ; 參數2:接收人

  5A17CA9B    8D8D C8F8FFFF   lea ecx,dword ptr ss:[ebp-0x738]    ; 參數1:未知 可置空

  5A17CAA1    E8 AAFF2500     call WeChatWi.5A3DCA50                 ; 發送文本消息函數

  5A17CAA6    83C4 0C         add esp,0xC ;平衡堆棧用

 

參數

  eax

    13EF5AA8  00000000

    13EF5AAC  00000000

    13EF5AB0  00000000

    13EF5AB4  00000000

 

  ebx

    13EF5A74  13FB51E0  UNICODE "發送文本消息"

    13EF5A78  00000006

    13EF5A7C  00000008

    13EF5A80  00000000

    13EF5A84  00000000

 

  ecx

    空buffer:char buffer[0x738] = {0};

 

  edx

    0096EF00  13CA0610  UNICODE "filehelper"

    0096EF04  0000000A

    0096EF08  00000010

    0096EF0C  00000000

    0096EF10  00000000

 

偏移 = 內存地址 - 基址

  發送文本消息函數 5A3DCA50 - 5A090000 = 34CA50

 

寫代碼

  參數結構

  

  構造參數

  

  調用函數

  

 

二、接收消息

當WX收到消息時,也會在On MsgAdd PrefixId處觸發斷點。

 

跳轉到ebp(ebp相對比較穩定)

雙擊ebp所在的行,地址這一列顯示的是相對地址。

  發送者 : ebp-0x220

    $-220    > 13BD3EC0  UNICODE "filehelper"

  發送的消息:ebp -0x1F8

    $-1F8    > 13C0C380  UNICODE "手機發送的消息"

 

攔截需要至少五個字節,這里剛好五個(68 C0 03 49 5B)

  5A3B9743    68 C003495B     push WeChatWi.5B4903C0                   ; UNICODE "On MsgAdd PrefixId : %I64d RealId : %I64d, SvrId :"

 

算偏移

  基址:5A090000

    Executable modules, 條目 8

    基址=5A090000

    大小=01946000 (26501120.)

    入口=5ADE4A63 WeChatWi.<ModuleEntryPoint>

    名稱=WeChatWi

    文件版本=2.9.0.123

    路徑=C:\Program Files (x86)\Tencent\WeChat\WeChatWin.dll

 

偏移 = 內存地址 - 基址

  接收消息hook位置 5A3B9743  - 5A090000 = 329743

  被覆蓋的數據偏移 5B4903C0 - 5A090000 = 14003C0

 
寫代碼
 
 

工具和教程,放群里(163419350),方便交流。

實戰代碼也會放在github:https://github.com/KongKong20/WeChatPCHook


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM