前言
這一篇,用到找偏移的第二個方法:界面;第四個方法:字符串;第六個方法:第三方庫。目標是刷新二維碼。
Duilib
WX的界面模塊是第三方庫:Duilib。
關於Duilib的介紹和分析,已經分享了《Dump微信PC端的界面Duilib文件》。
這里梳理一下Duilib的主要流程:
1、Duilib加載配置文件,生成界面。
2、用戶點擊界面的的按鈕,會產生click事件。
3、Duilib接收到事件,會判斷是點個哪個按鈕,然后觸發對應的函數。
4、比如發送按鈕,配置文件里面是"send_btn",判斷代碼就是 if(xxx== "send_btn")。
5、通過攔截按鈕的名字"send_btn",就可以定位到按鈕的對應的函數是哪一個。
分析思路
1、找到登陸界面的配置文件
2、確定刷新二維碼的按鈕名字
3、在軟件中對按鈕的名字進行下斷點
4、看是否觸發斷點,如果觸發,進一步確認對應函數
找偏移
1、看下登陸界面
2、對應的登陸界面的配置文件
3、刷新二維碼的按鈕的名字
qrcodeBackBtn
4、用OD下斷點
1、雙擊WeChatWin.dll模塊
2、查看所有字符串
3、右鍵搜索字符串
4、得到搜索結果
5、雙擊,然后右鍵看下用到這個字符串的地方
6、對用到這個字符串的地方下斷點
5、重新打開微信
第一個斷點斷下來,這里是生成界面,不是我們想要的,跳過。
6、點擊登陸界面的切換賬號,觸發刷新二維碼
這里可以看到,會有各個按鈕的名字,也有je的匯編
對應的就是C++的if(xxx== "xxxBtn")
OD看比較清晰
這樣就可以定位到,刷新二維碼的函數,是je之后這一塊
具體是哪一個,可以用排除法,把函數注釋掉,如果沒有刷新,那個這個函數就是目標函數。
7、繼續執行,確實沒有刷新二維碼,這個函數是目標函數,看下參數
傳遞的參數ecx,ecx是個指針,並且指向的是一個虛表,意味着這是一個類的對象,構造對象麻煩。F7進入函數跟蹤進行,看下有沒有不需要自己構建參數的函數。
這里把ecx傳給esi,然后有很多[esi+ 0xxxx],意味着還是在用這個對象,跳過。
8、往下翻,到了這里,就沒用到esi的數據了。
參數ecx沒指向虛表,不是上面的對象。試試注釋掉,結果還是有刷新二維碼,排除掉。
5C00FA79 8D4D E0 lea ecx,dword ptr ss:[ebp-0x20]
5C00FA7C C745 FC FFFFFFF>mov dword ptr ss:[ebp-0x4],-0x1
5C00FA83 E8 F8DEE1FF call WeChatWi.5BE2D980
9、而接下來,是兩個函數,第一個函數運算,結果返回到eax,接下來又傳給ecx,給第二個函數用,可以看出這兩個函數是一起的,兩個都注釋掉之后,沒刷新二維碼,因此這兩個函數就是我們要的刷新二維碼的函數。
5C00FA88 E8 83C5FFFF call WeChatWi.5C00C010
5C00FA8D 8BC8 mov ecx,eax
5C00FA8F E8 DC461100 call WeChatWi.5C124170
算偏移
基址:5BDE0000
Executable modules, 條目 7
基址=5BDE0000
大小=01946000 (26501120.)
入口=5CB34A63 WeChatWi.<ModuleEntryPoint>
名稱=WeChatWi
文件版本=2.9.0.123
路徑=C:\Program Files (x86)\Tencent\WeChat\WeChatWin.dll
偏移 = 內存地址 - 基址
第一個call 5C00C010 - 5BDE0000 = 22C010
第二個call 5C124170 - 5BDE0000 = 344170
寫代碼