紅包外掛那點(diǎn)事

原文最早發(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

圖 1dump微信

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

圖 2解壓ipa

3.刪除原簽名文件目錄,見圖3步驟2

4.拷貝簽名描述文件,見圖3步驟3,是的,你首先得有自己的開發(fā)者證書(什么,你不知道啥是開發(fā)者證書?那無所謂了,你就當(dāng)看著玩吧)

5.簽名,見圖3步驟4

6.校驗(yàn)簽名,見圖3步驟5(沒有輸出即為正確)

7.打包為ipa文件,見圖3步驟6

圖 3重簽名

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

圖 4安裝運(yùn)行

其中,簽名時(shí)用到了一個(gè)entitlements.xml文件,其內(nèi)容如圖5;還有一個(gè)簽名描述文件embedded.mobileproversion為開發(fā)者證書文件,你得有自己得開發(fā)者證書才有的啦。

以上第3到第7步的重簽名過程,其實(shí)可以寫一個(gè)腳本來代替,對(duì),我說的就是iOSSecAudit的resign命令。

圖 5entitlements.xml

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)

圖 6nonfat操作

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

圖 7load command示例

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

圖 8radare2打開binary

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

圖 9插入一條load command

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

圖 10修改@號(hào)

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一起交流。

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

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

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