iOS逆向入門筆記-分析WeChat添加好友(二)

二,分析

前篇文章

2.25 打印log

重新啟動微信進入新的朋友界面,在ssh中使用ondeviceconsole打印設備的log

ondeviceconsole

這時用另一個微信號添加自己好友,觸發(fā)好友請求的方法,可以看到以下的 log

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'

UI


把該對象的 hidden = 1,看是否隱藏

cy# #0x17af1e90.hidden = 1 ? ? ? ? ?

效果圖


可以看到已經(jīng)隱藏

UIButton 是繼承 UIControl 的,而 UIControl 可以通過allTargets與allControlEvents查看所有的對象與事件,再使用actionsForTarget:forControlEvent: 找到觸發(fā)的方法


再次UI調(diào)試


我在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


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:方法


verifyContactWithOpCode:opcode主要內(nèi)容

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


startWithVerifyContactWrap:opCode:parentView:fromChatRoom

添加好友的對象是CPushContact,而獲得好友請求的對象的CMessageWrap。這里需要進行轉(zhuǎn)換,而轉(zhuǎn)換的方法也在SayHelloViewController中,可以重復上面的分析方法獲得

分析完成

四,Tweak

此處引用tkkk大大的成品

至此iOS逆向復現(xiàn)全部完成

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容