一、目標(biāo)
Android越來(lái)越不好玩了,年輕人,該搞搞IOS了。套路其實(shí)都是差不多的,不要被Arm匯編攔住了。
反正Android早就不講武德了,重要算法都在so里面,和ios差不多了。
先按照之前的 [Ios逆向環(huán)境搭建 (一)] 把抓包和frida環(huán)境搞好。
我們今天的目標(biāo)還是它, sign
二、步驟
觀察一下
從 sign的長(zhǎng)度和參數(shù)類(lèi)型上看, sign sv st 可以看出,IOS版本的簽名算法大概率和Android差不多。這能節(jié)省我們很多分析時(shí)間,直接進(jìn)入主題吧。
第一步 砸殼
在 frida-ios-dump 目錄下面, 輸入命令 **python dump.py -l ** 列出手機(jī)里面的App列表, 找到我們要搞的包名
然后開(kāi)始運(yùn)行砸殼命令,砸殼后的文件會(huì)通過(guò) ssh拷貝到電腦上。
python dump.py com.3xxbuy.xxmobile
TIP: 注意,砸殼之前請(qǐng)保障 SSH是通的,使用 usbmuxd 把本地的2222端口轉(zhuǎn)發(fā)到iOS上的22端口,配置好 ssh免密登錄
iproxy 2222 22
ssh -p 2222 root@127.0.0.1
第二步 IDA
砸殼成功后,會(huì)在當(dāng)前目錄生成對(duì)應(yīng)的 ipa文件,ipa和apk類(lèi)似,也是個(gè)壓縮包,我們解壓先。
在 Payload/xx4iPhone 下面找到它的可執(zhí)行文件,xx4iPhone 100多mb的這個(gè)就是了。 拖進(jìn) IDA吧
IDA細(xì)嚼慢咽得很長(zhǎng)時(shí)間(很長(zhǎng)是指好幾個(gè)小時(shí).....),可以倒杯水,休息一把。刷刷 小視頻,帶薪摸魚(yú)。
IDA嚼完之后, Shift + F12 ,進(jìn)入 字符串窗口,我們繼續(xù)查找字符串 sign=
雙擊一個(gè)結(jié)果,進(jìn)去,在變量名稱(chēng)上面按 X 鍵 (交叉參考),就是查看哪些地方調(diào)用這個(gè)變量。
來(lái)到 cfstr_Sign_4, 繼續(xù) X
看這個(gè)比較像 JDCTCCHelper requestParamsWithUrl:dict: ,進(jìn)去看看, 喚起 F5大法 (進(jìn)入Arm匯編代碼窗口之后按F5,IDA會(huì)翻譯出C的偽代碼)
不對(duì),沒(méi)有計(jì)算過(guò)程, 把結(jié)果都翻了一遍,還沒(méi)有收獲。
試試 sv= ,因?yàn)閟v這個(gè)字段比較少見(jiàn),和它在一起的大概率是 sign計(jì)算過(guò)程。
又是一番 X , 被我們定位到了 +[XXSignService getSignWithDic:keys:]
F5一下,仔細(xì)看看這個(gè)函數(shù)。怎么看都像是sign的計(jì)算過(guò)程
第三步 Frida
掛上我們心愛(ài)的Frida了
id __cdecl +[XXSignService getSignWithDic:keys:](XXSignService_meta *self, SEL a2, id a3, id a4)
一個(gè)典型的ObjectC的函數(shù)就是這樣, + 表示這是個(gè)類(lèi)靜態(tài)函數(shù), 第一個(gè)參數(shù)指向接收Objective-C消息對(duì)象的指針。第二個(gè)參數(shù)是指向傳遞給對(duì)象的selector或消息的指針。 這兩個(gè)參數(shù)我們暫時(shí)不用管。 第三 第四個(gè)參數(shù)才是我們要關(guān)心的真正的入?yún)ⅰ?/p>
if (ObjC.available)
{
try
{
console.log('I am Comming in!');
var className = "XXSignService";
var funcName = "+ getSignWithDic:keys:";
var hook = eval('ObjC.classes.' + className + '["' + funcName + '"]');
console.log("[*] Class Name: " + className);
console.log("[*] Method Name: " + funcName);
console.log(hook);
// /*
Interceptor.attach(hook.implementation, {
onEnter: function(args) {
var receiver = new ObjC.Object(args[0]);
console.log("Target class : " + receiver);
var message1 = ObjC.Object(args[2]);
var message2 = ObjC.Object(args[3]);
console.log('msg1=' + message1.toString());
console.log('msg2=' + message2.toString());
},
onLeave: function(retval) {
var message = ObjC.Object(retval);
console.log('getSignWithDic rc is:' + message.toString());
}
});
// */
}
catch(err)
{
console.log("[!] Exception2: " + err.message);
}
}
我們把2個(gè)入?yún)⒑徒Y(jié)果都打印出來(lái)
沒(méi)毛病,就是我們想要的結(jié)果。下一次我們?cè)僬f(shuō)說(shuō)如何RPC調(diào)用吧。
三、總結(jié)
可執(zhí)行文件100MB,IDA搞起來(lái)真的很慢。
IOS的玩法和Android差不多,特征串定位,然后掛上Frida。
F5大法好。
你一定要學(xué)套路,這樣才能有效的縮短學(xué)習(xí)的時(shí)間;但當(dāng)你學(xué)會(huì)套路,并且開(kāi)始使用套路的時(shí)候,一定要找到跟別人不一樣得使用方法,這樣才能讓你從一堆不會(huì)飛得雞里面,揮動(dòng)翅膀,凌空飛起來(lái),變成翱翔的鷹。
TIP: 本文的目的只有一個(gè)就是學(xué)習(xí)更多的逆向技巧和思路,如果有人利用本文技術(shù)去進(jìn)行非法商業(yè)獲取利益帶來(lái)的法律責(zé)任都是操作者自己承擔(dān),和本文以及作者沒(méi)關(guān)系。
關(guān)注微信公眾號(hào): 奮飛安全,最新技術(shù)干貨實(shí)時(shí)推送
本文摘自 :https://blog.51cto.com/u