天天看點

使用CocoaPods給微信內建SDK列印收發消息

推薦序

本文介紹的是一套逆向工具,可以在非越獄手機上給任意應用增加插件。在文末的示例中,作者拿微信舉例,展示出在微信中列印收發消息的功能。

這套工具可以加快逆向開發的速度,其重簽名思想也可以用于二次分發别人的應用。

其實這也展示出蘋果在應用安全上的防護還需要加強,希望“董小姐”可以看到本文(偷笑)。

作者介紹:劉培慶,目前在網易資訊安全部門工作。個人部落格位址: http://www.alonemonkey.com/。感謝作者授權轉發。

背景

筆者本身是一個ios逆向的愛好者,曾在使用iosopendev在xcode開發越獄插件的時候,由于工具已經好幾年沒有更新,安裝和使用起來都會諸多問題,是以最初筆者隻是想改良iosopendev的相容問題,後面在開發中不斷冒出新的idea,并在工具中實作了這些想法,是以就有了本文将要給大家強烈推薦的工具monkeydev。

用途

在使用之前,大家關心的都是它的功能,可以做什麼。那麼monkeydev這個工具可以做什麼呢?總結來說可以做如下這些事情:

可以使用xcode開發captainhook tweak、logos tweak 和 command-line tool,在越獄機器開發插件,這是原來iosopendev功能的遷移和改進。

隻需拖入一個砸殼應用,自動內建reveal、cycript和注入的動态庫并重簽名安裝到非越獄機器。

支援調試自己編寫的動态庫和第三方app

支援通過cocoapods第三方應用內建sdk以及非越獄插件,簡單來說就是通過cocoapods搭建了一個非越獄插件商店。

大概了解了之後下面就通過具體的實際應用來體會它的強大之處吧。

環境準備

在使用之前首先是環境的配置,如果配置不對的話,可能會出一些奇怪的問題,你也可以結合wiki來操作。

安裝最新的theos 

git clone --recursive https://github.com/theos/theos.git /opt/theos 

安裝ldid

brew install ldid 

如果是用于越獄開發,需要配置免密碼登入越獄裝置,如果沒有越獄機器可以跳過這步。

ssh-keygen -t rsa -p '' 

ssh-copy-id -i /users/username/.ssh/id_rsa root@ip  

安裝

你可以通過如下指令選擇指定的xcode進行安裝,也可以預設安裝。

指定xcode安裝:

sudo xcode-select -s /applications/xcode-xxx.app 

預設安裝的xcode:

xcode-select -p 

執行安裝指令:

git clone https://github.com/alonemonkey/monkeydev.git 

cd monkeydev/bin 

sudo ./md-install  

如需解除安裝,執行解除安裝指令:

sudo ./md-uninstall 

如需更新,執行更新指令:

sudo ./md-update 

子產品介紹

安裝完成之後,打開xcode,點選file - new - project...,選擇ios滑動到最下方可以看到monkeydev提供的子產品:

使用CocoaPods給微信內建SDK列印收發消息

介紹下這幾個子產品的用途:

越獄子產品

captainhook tweak

使用captainhook提供的頭檔案進行oc函數的hook,以及屬性的擷取。

logos tweak

使用theos提供的logify.pl工具将.xm檔案轉成.mm檔案進行編譯,預設內建cydiasubstrate,可以使用mshookmessageex和mshookfunction來hook oc函數和指定位址。

command-line tool

可以直接建立運作于越獄裝置的指令行工具

非越獄子產品

monkeyapp

這是自動給第三方應用內建reveal、cycript和注入dylib的子產品,支援調試dylib和第三方應用,支援pod給第三放應用內建sdk,隻需要準備一個砸殼後的ipa或者app檔案即可。

功能介紹

關于captainhook tweak、logos tweak 和 command-line tool的使用這裡不再介紹,有問題可以檢視項目wiki

下面主要介紹monkeyapp的使用,開啟你的非越獄插件開發之旅~

準備

在開始使用前,需要準備一個砸殼後的應用,可以使用越獄手機砸殼,然後擷取ipa或app,沒有越獄手機直接從某助手下載下傳越獄應用即可。

建立項目

點選file - new - project...建立ios項目,選擇monkeyapp。

使用CocoaPods給微信內建SDK列印收發消息

建立完成之後,你會得到一個這樣的工程:

使用CocoaPods給微信內建SDK列印收發消息

這裡我建立的項目名字就是monkeyapp,是以下面對應的都是monkeyapp,你自己建立的由你的項目名字而定! 另外xcode 8需要另外在app裡面增加動态庫的依賴,如下:

使用CocoaPods給微信內建SDK列印收發消息

monkeyappdylib這個是将被注入目标app的動态庫,你自己要hook的代碼可以在monkeyappdylib.m檔案裡面寫,我在裡面寫了一些demo代碼,直接運作即可看到效果,支援oc runtime的hook,c函數的fishhook。

antiantidebug這個裡面是反反調試的代碼。

fishhook這個是自動內建的fishhook子產品。

下面framewroks已經自動內建了reveal.framework和cycript.framework。

拖入砸殼應用編譯

打開某助手選擇應用遊戲裡面的越獄應用,下載下傳一個應用就是已經砸殼了的。

然後打開targetapp目錄,拷貝ipa檔案到目前目錄下面,如下圖所示:

使用CocoaPods給微信內建SDK列印收發消息
使用CocoaPods給微信內建SDK列印收發消息

然後點選運作即可,運作後可以從控制台看到動态庫已經注入成功,reveal已經成功加載!當然手機上面也運作起來了!

使用CocoaPods給微信內建SDK列印收發消息

打開mac上的reveal即可檢視應用的界面結構啦!如下圖所示:

使用CocoaPods給微信內建SDK列印收發消息

預設還內建了cycript,從cycript官網下載下傳sdk,然後進去sdk目錄運作如下指令即可:

./cycript -r iphoneip:6666 

使用CocoaPods給微信內建SDK列印收發消息

擷取微信消息

下面以一個簡單擷取微信收到的消息為例,來進一步介紹它的使用,首先打開monkeyappdylib.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); 

}  

然後重新運作就能看到效果了:

使用CocoaPods給微信內建SDK列印收發消息

然後就可以愉快的開發非越獄插件了,還可以直接調試!

使用CocoaPods給微信內建SDK列印收發消息

使用cocoapods內建sdk

target 'monkeyappdylib' do 

     pod 'flex' 

end  

這裡的target要設定為動态庫而不是app,然後執行pod install。然後将如下選項改回yes。

使用CocoaPods給微信內建SDK列印收發消息

在monkeyappdylib.m檔案中加入sdk初始化代碼:

#import <flex/flexmanager.h> 

void initcycriptserver(){ 

    [[nsnotificationcenter defaultcenter] addobserverforname:uiapplicationdidfinishlaunchingnotification object:nil queue:[nsoperationqueue mainqueue] usingblock:^(nsnotification * _nonnull note) { 

        [[flexmanager sharedmanager] showexplorer]; 

        cylistenserver(6666); 

    }]; 

運作效果如下:

使用CocoaPods給微信內建SDK列印收發消息

非越獄插件商店

既然可以支援cocoapods了,那麼完全可以将自己寫的非越獄插件傳到cocoapods,然後通過pod一鍵安裝!

下面就将上面寫的擷取微信消息插件放到cocoapods,建立cocoa touch framework項目,然後增加頭檔案captainhook.h和自己的源檔案printwxmessage.m,并将上面的代碼拷貝過來,如下圖所示:

使用CocoaPods給微信內建SDK列印收發消息

然後生成framework弄成zip包(zip包需要包含模拟器和真機的架構才能通過本地驗證),編輯printwxmessage.podspec檔案内容如下:

pod::spec.new do |spec| 

  spec.name             = "printwxmessage" 

  spec.version          = "1.0.0" 

  spec.summary          = "print wx message for monkeydev" 

  spec.description      = <<-desc 

                          - print wx message for monkeydev 

                        desc 

  spec.homepage         = "https://github.com/alonemonkey/monkeydev" 

  spec.license          = { :type => "bsd", :file => "license" } 

  spec.author           = { "alonemonkey" => "[email protected]" } 

  spec.social_media_url = "http://weibo.com/xiaoqing28" 

  spec.platform         = :ios, "8.0" 

  spec.source           = { :http => "https://github.com/alonemonkey/monkeydevpod/raw/master/printwxmessage/latestbuild/printwxmessage.zip"} 

  spec.vendored_frameworks = "printwxmessage.framework" 

這裡source直接寫的是zip包的位址,裡面就是筆者生成的framework動态庫。

增加私有cocospods:

pod repo add monkeydevspecs https://github.com/alonemonkey/monkeydevspecs.git 

将printwxmessage包釋出到私有pod:

pod repo push monkeydevspecs printwxmessage.podspec 

修改podfile檔案内容如下,然後pod install安裝,并且把原來寫在monkeyappdylib.m的列印微信消息的代碼删除。

source 'https://github.com/alonemonkey/monkeydevspecs.git' 

     pod 'printwxmessage' 

end 

~ monkeyapp pod install 

cloning spec repo `alonemonkey` from `https://github.com/alonemonkey/monkeydevspecs.git` 

analyzing dependencies 

downloading dependencies 

installing printwxmessage (1.0.0) 

generating pods project 

integrating client project 

[!] please close any current xcode sessions and use `monkeypod.xcworkspace` for this project from now on. 

pod installation complete! there is 1 dependency from the podfile and 1 total pod installed.  

運作即可看到插件已經完美內建成功!!!

使用CocoaPods給微信內建SDK列印收發消息

monkeydev項目位址請點選閱讀原文檢視。

作者:alonemonkey

來源:51cto