每天掃單車的時候都要在眾多APP中路那個找到摩拜铁蹈,然后打開掃一掃卓鹿。作為一名開發(fā)者我不得不面臨這一個嚴(yán)峻的問題我需要把兩步操作合并房揭,并且越快達(dá)到目的越好箭阶。我第一個想到的就是IOS 10 以后的負(fù)一屏,就想使用支付寶二維碼付款了一樣谚殊,不打開APP最好了丧鸯。
看到摩拜也內(nèi)置了TodayWidget,我就試著加到了負(fù)一屏嫩絮,但是負(fù)一屏的空間有限丛肢,摩拜提供的4個功能對我來說只有掃碼有用,于是我想了不能只要這一個功能呢剿干,提起單一掃一掃功能蜂怎,我就想到了
思路有了幽歼,那我們開始動手。(ps偷懶百度一下差导,萬一有現(xiàn)成的呢试躏?醒醒吧!如果有你也就看不到這篇文章了)
第一步 :去某P助手下載砸殼后的IPA文件设褐,解壓之后打開找到info.plist文件直接接從里面找看看有沒有完整的颠蕴。
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>com.mobike.firstBike</string>
<key>CFBundleURLSchemes</key>
<array>
<string>mobike</string>
</array>
</dict>
很遺憾我們只找到了前綴是mobike
高帖。
第二部 : 既然簡單的找不到摊腋,那就暴力點直接HOOK APP了装悲,最先想到的的HOOK APP處理URL的方法,于是我們利用MonkeyDev創(chuàng)建APP hook 項目贱除,然后
%hook AppDelegate
- (_Bool)handleOpenUrl:(id)arg1{
NSLog(@"==================\n%@\n==================\n",arg1);
return %orig();
}
- (_Bool)application:(id)arg1 openURL:(id)arg2 options:(id)arg3{
NSLog(@"==================\n%@\n==================\n",arg2);
return %orig();
}
- (_Bool)application:(id)arg1 openURL:(id)arg2 sourceApplication:(id)arg3 annotation:(id)arg4{
NSLog(@"==================\n%@\n==================\n",arg2);
return %orig();
}
- (_Bool)application:(id)arg1 handleOpenURL:(id)arg2{
NSLog(@"==================\n%@\n==================\n",arg2);
return %orig();
}
%end
如果處理了跳轉(zhuǎn)的URL應(yīng)該可以直接打印出URL的內(nèi)容。但是問題來了寡键,我們沒辦法調(diào)用URL跳轉(zhuǎn)到APP掀泳,因為MonkeyDev并不會把todaywidge一起重簽名,安裝到手機(jī)西轩,好在摩拜還提供了3D touch打開4個功能的入口和todaywidge功能一樣如圖
TodayWidget | 3D Touch |
---|---|
那試一下吧员舵,咦并沒有打印URL,什么地方錯了藕畔?好吧3D touch處理是在應(yīng)用內(nèi)部不必須調(diào)用URL马僻,可以直接打開對應(yīng)的頁面。
第三步 :SO 注服,這個方法貌似行不通韭邓,下載原版的APP是可以通過TodayWidget調(diào)用URL的但是你不確定是hook了的APP先響應(yīng)還是原APP先響應(yīng)URL,所以我們換一種更為直接的方式溶弟。
第四步 : 直接上Hopper女淑,把IPA解包后的文件夾中的TodayWidget二進(jìn)制文件扔進(jìn)hopper (文件名MBKTodayWidget
),插件只有一個viewController代碼也比較少明早起來還是很方便的辜御,
觀察得知頁面用了一個collectionView鸭你,在其代理里找到處理方法,
其方法具體內(nèi)容如下
void -[MBKTodayViewController setupItemDataWithIndex:](void * self, void * _cmd, int arg2) {
r7 = (sp - 0x14) + 0xc;
r5 = self;
r4 = @"";
r0 = [r4 retain];
if (arg2 > 0x3) goto loc_ab1a;
loc_aad0:
switch (r0) {
case 0:
r4 = @"mobike://home/scanqr/todayWidget";
break;
case 1:
r4 = @"mobike://home/reportfault/todayWidget";
break;
case 2:
r4 = @"mobike://home/parkviolationreport/todayWidget";
break;
case 3:
r4 = @"mobike://home/mobeans/todayWidget";
break;
}
[r4 retain];
goto loc_ab1a;
loc_ab1a:
r5 = [[r5 extensionContext] retain];
r6 = [[NSURL URLWithString:r4] retain];
[r5 openURL:r6 completionHandler:0x10148];
r0 = r4;
return;
}
不出意外我們找到了我們想要的URL我抠,通過URL我做了一個workflow苇本,在手機(jī)自帶瀏覽器打開下載摩拜掃碼,一鍵直達(dá)摩拜APP掃碼頁面袜茧。
本文設(shè)計最基礎(chǔ)的IOS逆向知識菜拓,有興趣的同學(xué)歡迎交流。(似乎在越獄手機(jī)上使用cycript有更好的方式笛厦,歡迎交流你的想法)