零、有啥用
網上大多數的微信逆向思路,是CE搜索數據得到地址,OD下訪問斷點,然后在堆棧里面大海撈針的找Call,效率太低了。
其實微信的界面是用Duilib做的,Duilib的界面布局寫在XML文件。然后界面的消息處理,是通過控件名處理的。比如發送按鈕,XML文件里面是"send_btn",代碼里面是 if(xxx== “send_btn”)。利用這個特性,可以直接用字符串定位,省事很多。
原版Duiib源碼地址:https://github.com/duilib/duilib
微信Duilib源碼地址:https://github.com/tencentyun/TIMSDK/tree/master/cross-platform/Windows/IMApp/Basic/duilib
創建界面流程
窗口過程:CWindowWnd::__WndProc
消息處理函數:WindowImplBase::HandleMessage
處理創建窗口消息:WM_CREATE: WindowImplBase::OnCreate
創建界面:CDialogBuilder::Create(加載界面) CDialogBuilder::Create(處理控件)
加載界面資源:CMarkup::Load CMarkup::LoadFromFile CMarkup::LoadFromMem
WindowImplBase::OnCreate
MessageBox(NULL, _T(“加載資源文件失敗”), _T(“Duilib”), MB_OK | MB_ICONERROR);
IDA打開 WeChatWin.dll
搜索字符串 Duilib
參考源碼備注
調用偏移 080D8C0
builder.Create 偏移 0x08199EA
F7進入,F8單步調試,發現亂碼XML
再F7進入,F8單步調試,兩次MultiByteToWideChar就得到xml
對應源碼 這里是bool CMarkup::LoadFromMem
0FD7DC62 53 push ebx
0FD7DC63 6A 00 push 0x0
0FD7DC65 68 E9FD0000 push 0xFDE9
0FD7DC6A FF15 B4A47510 call dword ptr ds:[<&KERNEL32.MultiByteT>; kernel32.MultiByteToWideChar
0FD7DC70 8B5D FC mov ebx,dword ptr ss:[ebp-0x4]
0FD7DC73 33C9 xor ecx,ecx
Executable modules, item 6
Base=0F560000
Size=018A2000 (25829376.)
Entry=1023AA01 WeChatWi.
Name=WeChatWi
File version=2.8.0.121
Path=C:\Program Files (x86)\Tencent\WeChat\WeChatWin.dll
偏移 0FD7DC70 - 0F560000 = 81DC70