iOS非越獄逆向工程

這幾天一直在研究iOS的安全,也動手搞了一下iOS的逆向工程微信。有兩個成果吧。一個是攔截了信息;另外一個就是攔截了定位,這樣附近的人等需要用到經(jīng)緯度功能的地方都可以自定義自己想要的經(jīng)緯度。例如可以定位到日本,去看看日本的美眉。哈哈。。(大家可以關(guān)注我的博客,有的文章還沒來得及移過來的flyoceanfish博客傳送門)

由于之前的iOSOpenDev已經(jīng)不維護(hù),所有網(wǎng)上有個大神對此做了一個升級,最主要是可以傻瓜式使用了,dylib注入、打包等等一系列自動化。iOSOpenDev

雖然都是自動化了,不過本人還是嘗試了手工dylib注入、打包等功能。首先讓我們先看看這個<font color='red' size='4'>非越獄神器</font>的神奇之處,讓我先體驗一把。(安裝的話自己對照官網(wǎng)安裝即可,我這里就不啰嗦了!)

嘗試自動化工具

大家首先按照官網(wǎng)的教程新建一個MonkeyApp工程,我這里新建的是WeiXin,接下來我們需要一個已經(jīng)敲掉殼的ipa文件,如果你自己按照教程一步一步的搞也可以,不過還有更省事的方法,就是通過pp助手在越獄應(yīng)用中下載一個越獄版微信即可,放到指定路徑下。

編寫代碼

寫代碼的地方有好幾個文件其實都是可以寫的,只是不同的語法而已。比如.xm后綴的就是支持Logos語法,例如%hook%orig等語法。不過本人寫在WeiXinDylib.m這個文件里,這個文件其實最后會生成一個動態(tài)包名WeiXinDylib,這個包就是我們需要注入到APP中的。

  • 微信消息攔截

WeiXinDylib.m這個文件的最后加上以下代碼

@interface CMessageWrap
@property (nonatomic, strong) NSString* m_nsContent;
@property (nonatomic, assign) NSInteger m_uiMessageType;
@end
CHDeclareClass(CMessageMgr)
CHMethod2(void, CMessageMgr, AsyncOnAddMsg, NSString*, msg, MsgWrap, CMessageWrap*, msgWrap){
    NSString* content = [msgWrap m_nsContent];
    if([msgWrap m_uiMessageType] == 1){
        NSLog(@"收到消息: %@", content);
    }
    CHSuper2(CMessageMgr, AsyncOnAddMsg, msg, MsgWrap, msgWrap);
}
CHConstructor{
    CHLoadLateClass(CMessageMgr);
    CHClassHook2(CMessageMgr, AsyncOnAddMsg, MsgWrap);
}

這樣的話我們就攔截到了微信收發(fā)消息,在Xcode控制臺則會打印出我們所收發(fā)的消息。

  • 微信自定義定位(大家比較期待的功能,想撩哪里的美眉都可以喲!)

同樣找到WeiXinDylib.m這個文件然后在最后加如下代碼

CHDeclareClass(CLLocationManager)
CHMethod(0,void,CLLocationManager,startUpdatingLocation){
    NSLog(@"定位被攔截");
    CHSuper(0,CLLocationManager, startUpdatingLocation);

    CGFloat lat = 35.707013;
    CGFloat lng = 139.730562;
    CLLocation *tokyoLocation = [[CLLocation alloc] initWithLatitude:lat longitude:lng];
    CLLocation *cantonLocation = [[CLLocation alloc] initWithLatitude:30.231695 longitude:120.283835];
    [NSThread sleepForTimeInterval:4];
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self.delegate locationManager:self didUpdateToLocation:tokyoLocation fromLocation:cantonLocation];
    });
#pragma clang diagnostic pop
}
CHConstructor{
    CHLoadLateClass(CLLocationManager);
    CHClassHook(0,CLLocationManager, startUpdatingLocation);
}

我這里是寫死的經(jīng)緯度,其實大家也可以彈出一個框然后輸入也是可以的。代碼里攔截到了方法之后我將現(xiàn)場sleep了4秒。主要是如果不sleep我發(fā)現(xiàn)這時候回調(diào)不起作用的。

總結(jié):其實動態(tài)注入的本質(zhì)就是通過運(yùn)行時進(jìn)行method swizzling,進(jìn)行了方法的替換而已。

體驗各種手工工具

  • Hopper Disassembler是Mac上的一款二進(jìn)制反匯編器,跟IDA功能一樣
  • Cycript 是一款腳本語言,是混合了objective-c與javascript語法的一個工具,讓開發(fā)者在命令行下和應(yīng)用交互,在運(yùn)行時查看和修改應(yīng)用。與lldb有點類似
  • class-dump(http://stevenygard.com/projects/class-dump/) 能夠?qū)⒐こ汤镞吽械姆椒ㄌ崛〕鰜恚梢粋€.h文件
  • iReSign APP重簽名,我們也可以使用命令一步一步來簽名,這個工具幫我們把命令集成了寫了一個界面
  • yololib 將dylib動態(tài)包注入到APP中
  • ios-deploy 一個非越獄版遠(yuǎn)程lldb調(diào)試工具

這些工具的安裝我就不啰嗦了,大家要不就去官網(wǎng)看怎么安裝,要不就自行百度了。

我這里可以說一下有的工具下載下來之后,如果使用有時候我們的終端先cd到對應(yīng)的文件下,然后才能使用相應(yīng)的命令。其實這樣也是比較繁瑣的。這里我們可以把他們的路徑加到.bash_profile文件中,這樣在終端則可以直接使用了。

例如我將cycript加到這個文件里,我在終端就可以直接使用了。


1672149F-06C6-4A6A-82C7-8911DA07DB8D.png

工具使用

使用的話我也只是簡單給大家演示一樣,起個拋磚引玉的作用,其實每個工具都非常的強(qiáng)大的。

class-dump

class-dump -H 解壓完成的APP的文件路徑/weixin.app -o /Users/xxxx/Desktop/指定生成文件路徑

這樣就可以生成很多.h文件了。直接看起來比較費(fèi)事,大家可以新建一個Xcode工程,然后把文件復(fù)制進(jìn)去,這樣看起了就比較舒服了。

通過這個工具我們可以找到我們感興趣類的方法,這樣就可以做對應(yīng)的攔截修改了。

yololib

yololib 可執(zhí)行文件 要被注入的.dylib

例如

./yololib WeiXin.app libWeiXinDylib.dylib

注:這樣寫的話要保證yololib、WeChat、WeChat.app處于同一目錄下。

將我們注入的dylib文件放到WeChat.app目錄下。

cp hook.dylib WeChat.app/

iReSign

首先我們要對我們的dylib動態(tài)包進(jìn)行簽名

codesign -f -s "iPhone Developer:xxxx" WeiXin.app/libWeiXinDylib.dylib

然后點擊iReSign直接點擊運(yùn)行對ipa包簽名


7E58DAD9-8A11-4461-A9E4-E8C3179380E4.png

選一下對應(yīng)文件的路徑然后點擊重新簽名即可。那個entitlements.plist文件不選的話也可以成功。不過最好自己新建一個,內(nèi)容如下:

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0">
 <dict>
     <key>application-identifier</key>
     <string>com.aa.aa.weixin</string>
     <key>get-task-allow</key>
     <false/>
     <key>keychain-access-groups</key>
     <array>
         <string>com.aa.aa.weixin</string>
     </array>
 </dict>
 </plist>

大家把com.aa.aa.weixin改成自己的bundle id即可。然后復(fù)制新建一個文件就可以啦。

Cycript
  • 找到進(jìn)程ID

ps -e | grep WeChat

  • 鉤住進(jìn)程

cycript -p 12435

cycript -r ip:6666

接下來可以干我們想干的事情了,使用任何oc代碼。

cy# alertView = [[UIAlertView alloc] initWithTitle:@"注入" message:@"Cyript" delegate:nil cancelButtonTitle:@"確定" otherButtonTitles:nil]

cy# [alertView show]

其實我們在逆向工程的時候,大部分是用的內(nèi)存地址調(diào)用

cy# [#0x108840380 show]

調(diào)用方式就是#內(nèi)存地址,我們可以借助Xcode的Debug View Hierarchy這個工具獲取

1DDDB54A-8837-4BE0-8D2D-C1D91FED3E8F.png
效果圖.PNG
ios-deploy

這個工具與Cycript有點類似的。首先就是安裝ios-deploy

ios-deploy --debug --bundle WeiXin.app

運(yùn)行完之后就可以像Xcode控制器內(nèi)置的lldb一樣,可以在終端執(zhí)行任意lldb命令啦。比如斷點等等

Hopper disassembler

這個工具使用起來簡單,但是也是非常的強(qiáng)大的。我們打開這個工具,直接將.app拖到這個工具里就可以了。

接下來我們可以搜索全局的方法、類等。甚至可以直接修改指令的,然后再生成對應(yīng)的APP

結(jié)論

這一篇主要是理論,讓大家有個大體的了解。下一篇來個實戰(zhàn),教大家如果根據(jù)內(nèi)存地址動態(tài)打斷點,如何獲取微信當(dāng)前的視圖控制器的名字,這樣我們結(jié)合Hopper或者class-dump出來的.h文件進(jìn)行修改或攔截了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容