推薦序
本文介紹的是一套逆向工具,可以在非越獄手機上給任意應用增加插件。在文末的示例中,作者拿微信舉例,展示出在微信中列印收發消息的功能。
這套工具可以加快逆向開發的速度,其重簽名思想也可以用于二次分發别人的應用。
其實這也展示出蘋果在應用安全上的防護還需要加強,希望“董小姐”可以看到本文(偷笑)。
作者介紹:劉培慶,目前在網易資訊安全部門工作。個人部落格位址: 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提供的子產品:
介紹下這幾個子產品的用途:
越獄子產品
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。
建立完成之後,你會得到一個這樣的工程:
這裡我建立的項目名字就是monkeyapp,是以下面對應的都是monkeyapp,你自己建立的由你的項目名字而定! 另外xcode 8需要另外在app裡面增加動态庫的依賴,如下:
monkeyappdylib這個是将被注入目标app的動态庫,你自己要hook的代碼可以在monkeyappdylib.m檔案裡面寫,我在裡面寫了一些demo代碼,直接運作即可看到效果,支援oc runtime的hook,c函數的fishhook。
antiantidebug這個裡面是反反調試的代碼。
fishhook這個是自動內建的fishhook子產品。
下面framewroks已經自動內建了reveal.framework和cycript.framework。
拖入砸殼應用編譯
打開某助手選擇應用遊戲裡面的越獄應用,下載下傳一個應用就是已經砸殼了的。
然後打開targetapp目錄,拷貝ipa檔案到目前目錄下面,如下圖所示:
然後點選運作即可,運作後可以從控制台看到動态庫已經注入成功,reveal已經成功加載!當然手機上面也運作起來了!
打開mac上的reveal即可檢視應用的界面結構啦!如下圖所示:
預設還內建了cycript,從cycript官網下載下傳sdk,然後進去sdk目錄運作如下指令即可:
./cycript -r iphoneip:6666
擷取微信消息
下面以一個簡單擷取微信收到的消息為例,來進一步介紹它的使用,首先打開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
target 'monkeyappdylib' do
pod 'flex'
end
這裡的target要設定為動态庫而不是app,然後執行pod install。然後将如下選項改回yes。
在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了,那麼完全可以将自己寫的非越獄插件傳到cocoapods,然後通過pod一鍵安裝!
下面就将上面寫的擷取微信消息插件放到cocoapods,建立cocoa touch framework項目,然後增加頭檔案captainhook.h和自己的源檔案printwxmessage.m,并将上面的代碼拷貝過來,如下圖所示:
然後生成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.
運作即可看到插件已經完美內建成功!!!
monkeydev項目位址請點選閱讀原文檢視。
作者:alonemonkey
來源:51cto