原文最早發(fā)表于freebuf,我是原作者本人,原文鏈接。
0×00很急很關(guān)鍵
鄭重申明:外掛這東西,用來搶紅包還是不太好,僅作技術(shù)研究用噢~
眼看又到年關(guān)了,搶紅包神器的需求很強(qiáng)烈!很急!很關(guān)鍵!
這里只討論iOS平臺(tái)下的紅包外掛,總的來說分兩種:需越獄和無需越獄。需越獄的就簡單了,參見github開源項(xiàng)目WeChatRedEnvelop,把代碼clone下來,一個(gè)make package install就全部搞定了(當(dāng)然啦,首先你得配置theos環(huán)境,這東西真的挺好用的)。
無需越獄的稍微復(fù)雜一點(diǎn),涉及到的主要技術(shù)點(diǎn)包括逆向微信接收消息接口、一丟丟的協(xié)議逆向、dylib注入、ipa重簽名。逆向微信接口其實(shí)沒什么好說的,WeChatRedEnvelop項(xiàng)目創(chuàng)建者buginux已經(jīng)幫我們搞定了,代碼都寫好了,就算沒有這份代碼,稍微耐心一點(diǎn)也應(yīng)該沒什么大問題,因?yàn)槲⑿胚@種體量的App基本都不會(huì)做什么亂七八糟的保護(hù)的,手Q、淘寶、支付寶易燃,所以這里就不討論怎么逆向了。相對(duì)而言,dylib注入和重簽名才是最有討論價(jià)值的。
0×01 ipa重簽名
關(guān)于iOS下的簽名機(jī)制,我覺得這篇文章已經(jīng)講的相當(dāng)清晰了:《代碼簽名探析》,我這里就不拾人牙慧了(最重要的是我也說不清楚)。
此處以微信iOS版為例,講講重簽名的操作過程:
1.使用iOSSecAudit工具dump微信ipa到本地(就是小生上一篇文章《iOSSecAudit:一個(gè)iOSAPP安全審計(jì)工具》中介紹的iOSSecAudit)

2.解壓ipa文件,ipa文件跟apk一樣都是zip格式文件,Mac下直接雙擊就能解壓,如果你喜歡用命令或者什么奇奇怪怪的工具都無所謂啦

3.刪除原簽名文件目錄,見圖3步驟2
4.拷貝簽名描述文件,見圖3步驟3,是的,你首先得有自己的開發(fā)者證書(什么,你不知道啥是開發(fā)者證書?那無所謂了,你就當(dāng)看著玩吧)
5.簽名,見圖3步驟4
6.校驗(yàn)簽名,見圖3步驟5(沒有輸出即為正確)
7.打包為ipa文件,見圖3步驟6

8.iOSSecAudit安裝運(yùn)行,測試是否成功,見圖4

其中,簽名時(shí)用到了一個(gè)entitlements.xml文件,其內(nèi)容如圖5;還有一個(gè)簽名描述文件embedded.mobileproversion為開發(fā)者證書文件,你得有自己得開發(fā)者證書才有的啦。
以上第3到第7步的重簽名過程,其實(shí)可以寫一個(gè)腳本來代替,對(duì),我說的就是iOSSecAudit的resign命令。

ipa重打包,重簽名基本就這些,搞定以后,這個(gè)重打包的ipa就能安裝到一個(gè)未越獄的iPhone上了。
0×02 dylib注入
關(guān)于OS X平臺(tái)下的注入,一年半以前國外就有一篇文章講的非常透徹了,原文鏈接:dylibhijacking on OS X,去年十一期間我在公司看到過翻譯文章:譯文鏈接(不過這個(gè)鏈接現(xiàn)在應(yīng)該打不開了……吧,英文湊合著看吧,看不懂就硬著頭皮看)。
iOS下的注入,簡單來說,大致思路是給binary添加一個(gè)Load Commands,每次啟動(dòng)的時(shí)候,這個(gè)Load Commands告訴系統(tǒng)在啟動(dòng)binary的時(shí)候要加載指定路徑的dylib,然后你的那點(diǎn)小而臟的代碼就可以執(zhí)行了哈。嗯,這里需要對(duì)macho header格式非常熟悉。下面說下具體操作步驟:
1.用iOSSecAudit將dump回來的微信binary進(jìn)行nonfat處理,否則會(huì)看到好幾個(gè)macho頭,不方便改動(dòng)

2.用MachoView打開nonfat后的binary文件,現(xiàn)在要添加一條如圖7所示的LoadCommand

3.我使用的是radare2對(duì)binary進(jìn)行修改,使用radare2打開binary,如圖8

4.原binary中最后一個(gè)load command的偏移為0x1bd0,command size為16,所以需在偏移0x1bd0+16處開始添加新的load command,然后按順序?qū)懭隒ommand、Command Size、Str Offset、Time Stamp、Current Version、Compatibility Version和Name字段,如圖9

5.最后修改Mach header中的Number of Load Commands(這個(gè)字段用于記錄該macho文件中的LoadCommands總數(shù))和Size of Load Commands字段(這個(gè)字段用于記錄該macho文件中的Load Commands總大?。?,本例中這兩個(gè)字段原來的值為73和7108,則新的Number? ? ? ? of Load Commands為73+1=74,新的Size ofLoad Commands為7108+48=7156
6.另外,由于radare2寫入符號(hào)“@”時(shí),會(huì)出錯(cuò)(不知道是不是我不會(huì)用,誰會(huì)用的請(qǐng)通過各種渠道告訴我下),在第四步中我使用字母“a”來代替“@”,所以,最后還需要將“a”改成“@”,本例中使用UltraEdit進(jìn)行編輯,如圖10

7.最后,還有一點(diǎn)需要注意的是,Current Version和Compatibility Version字段,最好直接給為0×0,因?yàn)橄到y(tǒng)在load dylib的時(shí)候,會(huì)檢查dylib的版本號(hào),如果此處的版本號(hào)大于dylib實(shí)際的版本號(hào),則會(huì)導(dǎo)致crash(我是不會(huì)告訴你們這個(gè)版本號(hào)的問題坑了我一整晚的,還有那個(gè)“@”號(hào)坑了我一個(gè)小時(shí),手動(dòng)再見)。呵呵,因?yàn)閠heos編譯出的dylib,其版本號(hào)為0×0。
那么重點(diǎn)來了,如果一個(gè)命令就能將一個(gè)dylib注入到一個(gè)binary中,豈不快哉~對(duì),我說的就是iOSSecAudit的 dlinj命令;再如果一個(gè)命令就能將一個(gè)dylib注入到binary,并將ipa進(jìn)行重簽名,豈不更快哉,嗯,我說的就是iOSSecAudit的 dlini命令。
0×03非越獄外掛上線
只需要把buginux的代碼clone下來,make出一個(gè)dylib文件,文件名改成啥您隨意就好,然后把dylib文件copy到微信binary的同目錄下,一起簽名,然后用0×02章節(jié)中的方法進(jìn)行代碼注入,再用0×01章節(jié)中的方法對(duì)ipa進(jìn)行重簽名,最后用iOSSecAudit安裝,登陸進(jìn)去就能展示紅包外掛的威力了。
最最最重要的是,如果一個(gè)命令就能將本文提到的dylib注入、重簽名和安裝,整個(gè)過程一鍵搞定,豈不……,您猜對(duì)了,就是iOSSecAudit的 dlinji命令!
關(guān)于搶紅包神器,只能說這么多了……如果直接就做個(gè)工具丟出來,只會(huì)讓搶紅包這件事情失去樂趣,更慘的是你會(huì)沒朋友的,不要問我怎么知道的,捂屁股,哦不,捂臉。有興趣的同學(xué)可以聯(lián)系我的微博和Twitter一起交流。