Windows逆向分析入門(九)——實戰篇(內存直接讀取通訊錄)


前言

  上一篇,聊到函數的調用關系是一條線的。這一篇,聊下函數的調用關系是分叉的,應該怎么分析。目的是內存直接讀取通訊錄。

 

分析

  通訊錄,是數據。

  全局數據直接讀取,局部數據間接攔截。

  通訊錄要經常用到,寫成全局數據,方便讀取。

  看着和個人信息一樣,是全局數據,內存里直接搜索。

  但用什么搜索呢?並沒有一個明確的數據可以代表通訊錄。

  一般說,通訊錄里面有很多好友信息,要獲取某個好友信息,在里面搜索。

  也就是說,通訊錄可以是一個數組,鏈表,或者一棵樹,而這個集合的開頭寫成全局數據。

 

切入點

  從獲取某個好友的信息入手。

  要獲取某個好友信息,得在通訊錄里面搜索。

  順藤摸瓜,知道獲取單個人的信息,就知道通訊錄的了。

  依然是從日志入手,看下有什么線索。

 

日志

  和上一篇一樣,注入打開日志模塊的插件,點擊通訊錄某個好友,看看日志有什么。

  有一個字符串:NetSceneBatchGetContact,表示通過網絡獲取聯系人的信息。

 

  對字符串進行下斷點:NetSceneBatchGetContact

 

  點擊通訊錄某個好友的頭像,觸發到斷點

 

  堆棧往下翻,發現這里已經有好友的多個信息

 

 

  已經有信息,還需要網絡獲取,意味着本地存儲了一些基本信息,然后還需要去網絡獲取。

 

  可以猜測,WX獲取好友信息的函數大概是

    獲取好友信息(參數:好友ID)

      調用函數:獲取好友本地信息

      如果消息不全

        調用函數:通過網絡獲取

 

  而我們現在斷點到的是:通過網絡獲取,要找的函數是:獲取好友本地信息。也就是遇到的是分叉情況,獲取好友本地信息這個函數不在堆棧里面。

  所以要回到分叉點,也就是已經有基本信息的函數里面,從函數頭開始分析。

 

分析

  1、返回分叉的地方(已經有好友的基本信息)

 

  2、往上翻翻代碼,到函數的頭部,定下斷點

 

  前兩個函數都沒有wxid,直到第三個才有

 

  但這個函數里面只是對數據處理,沒有調用別的函數,排除掉

 

  接下來的兩個函數和剛才的一樣,也排除掉

 

 

  接下來的函數還是沒有微信ID,到了第二個才有。

 

 

  3、F7進入函數,F8單步執行,到這個函數,才有微信ID

 

 

  函數里面是拿到一個寫死的全局變量 0x10995060

 

 

  執行結果eax,又給下一個函數使用:mov ecx,eax

 

 

  4、跟蹤進去下一個函數,里面有很多字符串和jnz,這里應該是對微信ID的過濾

  跳過字符串,到這個函數又有微信ID,但執行完這個函數,只是把微信ID傳入堆棧。

 

 

  5、繼續F7進入下一個的函數,到這里又有微信ID

 

 

  6、再進入這個函數,注意這里有個je是向上的,意味着是一個循環

 

 

  單步進行分析,確實是在對通訊錄進行遍歷,並且通訊錄是一個先序排列的二叉樹。

 

 

  在前面有一個全局變量,跟蹤這個數據的傳遞過程

  (中間重啟過,基址變了,全局變量不一樣)

  5A279D03    A1 6050615B     mov eax,dword ptr ds:[0x5B615060]

  5A279D08    83C0 28         add eax,0x28

  5A22E5FD    8BC8            mov ecx,eax

  5A4026AB    8BD9            mov ebx,ecx

  5A40276C    8BCB            mov ecx,ebx

  5A400E87    8BF1            mov esi,ecx

  5A400EAE    8D9E 84000000   lea ebx,dword ptr ds:[esi+0x84]

  5A400EB5    8BCB            mov ecx,ebx

  59FB2584    8B19            mov ebx,dword ptr ds:[ecx]               ; WeChatWi.5B3B4994

  59FB2587    8B73 04         mov esi,dword ptr ds:[ebx+0x4]

 

  通訊錄第一個節點 = [[[0x5B615060] + 0x28+0x84]+0x4]

  左節點:mov esi,dword ptr ds:[esi]

  右節點:mov esi,dword ptr ds:[esi+0x8]

  節點是否有效:cmp byte ptr ds:[esi+0xD],0x0

 

算偏移

  基址:59F60000

    Executable modules, 條目 7

    基址=59F60000

    大小=01946000 (26501120.)

    入口=5ACB4A63 WeChatWi.<ModuleEntryPoint>

    名稱=WeChatWi

    文件版本=2.9.0.123

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

 

  偏移 =  內存地址 - 基址

    通訊錄偏移:5B615060 - 59F60000 = 16B5060

代碼

 

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

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


免責聲明!

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



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