二,分析
2.25 打印log
重新啟動微信進入新的朋友界面,在ssh中使用ondeviceconsole打印設備的log
ondeviceconsole
這時用另一個微信號添加自己好友,觸發(fā)好友請求的方法,可以看到以下的 log

表明有好友添加請求的時候,會調(diào)用
-[SayHelloViewController OnSayHelloDataChange]
2.3 動態(tài)分析 lldb + hopper disassembler
hopper disassembler打開前面砸殼后的二進制文件
有個小插曲,我的i7 mba分析用了58min 期間cpu利用率保持25%
搜索-[SayHelloViewController OnSayHelloDataChange]方法,可以看到當前方法在微信中的偏移地址,開始動態(tài)分析
pythontcprelay.py-t1234:1234? ? //再使用 usbmuxd 轉(zhuǎn)換端口
debugserver*:1234-a"WeChat"? ? //設備開啟 debugserver
打開 lldb
/Applications/Xcode.app/Contents/Developer/usr/bin/lldb ? //lldb位置
(lldb) process connect connect://localhost:1234 ? ?//連接1234端口
(lldb) imagelist-o -f? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 打印所有進程
可找到微信在當前手機上的進程內(nèi)存基地址
內(nèi)存地址 = 進程內(nèi)存基地址 + 方法偏移地址
下斷
(lldb) br s -a “0x十六進制地址”? ? ? ?
輸入 c 繼續(xù),使用另一微信賬號添加好友,會觸發(fā)該斷點
(lldb) c
使用bt查看調(diào)用棧信息,即哪些方法調(diào)用了當前的方法,找到方法的上游
(lldb) bt
異步調(diào)用沒辦法查看
第一個表示當前的方法,可以看到在調(diào)用此方法前,該進程總共調(diào)用了3個方法。分別計算出這三個方法在微信中的偏移量
(lldb) p/x -0x基地址 + ?0x方法地址 ? ? ? ? ? ?
這三個地址在 hopper disassembler 中查看,找到了對應的方法為
[SayHelloViewController OnSayHelloDataChange]
[SayHelloDataLogic onFriendAssistAddMsg:]
[FriendAsistSessionMgr OnAddMsgForSpecialSession:MsgList:] ? ? ?//猜測這個
[CMessageMgr MainThreadNotifyToExt:]
MsgList:后面的參數(shù)可能為消息的數(shù)組,可下斷測試
(lldb) br s -a "0x地址"
(lldb) c
(lldb) register read
(lldb) po $2
(lldb) po $r3
(lldb) po [[$r3 firstObject] class]
看出r3確實是個數(shù)組,同時也得到了消息的對象為CMessageWrap證明猜測正確
然而FriendAsistSessionMgr這個類可能需要一些初始化,且放在SayHelloViewController中,而想要的是不管在哪個控制器里都可以 hook 住上面的消息數(shù)組對象。往上找,[CMessageMgr MainThreadNotifyToExt:],里面并沒有需要的信息。根據(jù)類名推測CMessageMgr是用來管理消息的,可能是在異步執(zhí)行了消息數(shù)組的獲取。
因此,重復以上步驟,使用 logify 對CMessageMgr進行 Log 分析。最終鎖定了
CMessageMgr MessageReturn: MessageInfo:Event:
定位通過好友請求方法
2.4 UI動態(tài)分析
通過好友請求的方法,是在新的朋友界面,點擊接受的時候觸發(fā)的,所以找到“接受”對象
打印所有UI層級
cy# [[UIApp keyWindow] _autolayoutTrace].toString() ? ?//簡化顯示
可發(fā)現(xiàn) FixTitleColorButton:0x17af1e90'\u63a5\u53d7'
? ? ? ? ? ? ? ? ? ? ? ? ? ?UIButtonLabel:0x17a28a40'\u63a5\u53d7'

把該對象的 hidden = 1,看是否隱藏
cy# #0x17af1e90.hidden = 1 ? ? ? ? ?
可以看到已經(jīng)隱藏
UIButton 是繼承 UIControl 的,而 UIControl 可以通過allTargets與allControlEvents查看所有的對象與事件,再使用actionsForTarget:forControlEvent: 找到觸發(fā)的方法

我在UI調(diào)試中出了一些問題,重啟調(diào)試后內(nèi)存地址有所變化
最終找到了觸發(fā)的方法為[ContactsItemView onRightBtnAction]
2.5 hopper ?disassembler靜態(tài)分析
用 hopper 打開微信的二進制文件,進行匯編與偽代碼的轉(zhuǎn)換
我的測試設備架構(gòu)armv7
void -[ContactsItemView onRightBtnAction](void * self, void * _cmd) {
r10 = self;
r5 = r10 + *0x32be440;
r6 = objc_loadWeakRetained(r5);
if (r6 != 0x0) {
? ? ? ?r4 = objc_loadWeakRetained(r5);
? ? ? ?r8 = @selector(onContactsItemViewRightButtonClick:);
? ? ? ?r11 = [r4 respondsToSelector:r8];
? ? ? ?[r4 release];
? ? ? ?[r6 release];
? ? ? ?if (r11 != 0x0) {
? ? ? ? ? ? ? ?r0 = objc_loadWeakRetained(r5);?
? ? ? ? ? ? ? ?r4 = r0;
? ? ? ? ? ? ? objc_msgSend(r0, r8);
? ? ? ? ? ? ? loc_27593d8(r4, r8, r10);
? ? ? ? ? ? ?}?
? ? ? ?}
? ? ? return;
}
可以得出,r11 = [r5 onContactsItemViewRightButtonClick:btn],而 r5 判斷為 self 的*代*理*,也可以通過在之前用 class-dump 的頭文件里面搜索onContactsItemViewRightButtonClick,會發(fā)現(xiàn)在ContactsItemViewDelegate中
也就是[ContactsItemView onRightBtnAction]內(nèi)部調(diào)用了[self.delegate onContactsItemViewRightButtonClick:]
而ContactsItemView的delegate為SayHelloViewController
定位方法 onContactsItemViewRightButtonClick


其實是執(zhí)行了if([r4 isKindOfClass:[CPushContact class]]);
而r4是CPushContact 對象,不然下面的代碼都不執(zhí)行了。通過lldb打斷點,并查看r3寄存器的對象類型,可以看到該對象為 CPushContact 對象。因此r4就是 CPushContact 對象,字面意思得到聯(lián)系人對象。
可以看到也進行了一次判斷if (((loc_1c099bc(r6, @selector(m_bSuspiciousUser)) & 0xff) != 0x0) && ((loc_1c099bc(r6, @selector(isMMContact)) & 0xff) == 0x0)),看到了MMUIAlertView ? 推測是彈窗的 view ,推測如果是當前申請的好友已經(jīng)是自己的好友,那就進行彈窗。另一部分為verifyContactWithOpCode:opcode:,推測該部分為添加好友的方法。
可以通過Log 分析或者通過 lldb 打斷點,會看到都會進入該方法。且參數(shù)分別為 CPushContact 對象與 3。
接著繼續(xù)分析verifyContactWithOpCode:opcode:方法

可以得到,確認好友申請,顯示構(gòu)造了CContactVerifyLogic對象。再構(gòu)造了一個CVerifyContactWrap對象,并設置了相關屬性,比如m_nsUsrNamem_uiScenem_nsTicket.然后通過添加到數(shù)組中,通過CContactVerifyLogic對象的startWithVerifyContactWrap:opCode:parentView:fromChatRoom:方法發(fā)送

添加好友的對象是CPushContact,而獲得好友請求的對象的CMessageWrap。這里需要進行轉(zhuǎn)換,而轉(zhuǎn)換的方法也在SayHelloViewController中,可以重復上面的分析方法獲得
分析完成
四,Tweak
此處引用tkkk大大的成品
至此iOS逆向復現(xiàn)全部完成