1. 程式人生 > >教你如何動態除錯 iOS App(反編譯App)

教你如何動態除錯 iOS App(反編譯App)

開篇

通過本文你能瞭解 iOS 逆向的基本知識,對 iOS App 的安全有一定了解。然後能舉一反三,在自家 App 找到危險漏洞加以預防,保證使用者資料安全。

在安全領域,攻與防永遠存在。哪怕是 iPhone 有著強大的安全防護機制,也擋不住那些極客們一次又一次的好奇,開發了很多強大且便利的工具。本文就是在這些極客們提供的工具的基礎上完成的!

準備工具

HTTP(S) 抓包

HTTP 抓包

第一步:獲取 MAC IP

按下Option鍵,同時點選 Mac 選單欄上的無線網 Icon,能看到當前電腦的 IP 地址。 或在終端輸入 ifconfig en0 也可檢視。

第二步:設定代理

保證手機和電腦在同一 WIFI 下,在手機上,點選“設定->無線區域網->連線的WiFi”,設定HTTP代理:

伺服器:為 Mac 電腦 IP 地址(如192.168.1.122)

埠:8888

第三步:抓包

在電腦端,開啟 Charles。使手機發生網路請求,Charles 會彈出一個詢問的對話方塊

點選“Allow”允許,Charles 會出現手機的 HTTP 請求記錄列表。

HTTPS 抓包

第一步: 獲取證書安裝地址

安裝 SSL 證書到手機裝置。點選 Help -> SSL Proxying -> Install Charles Root Certificate on a Mobile Device

出現彈窗得到地址 chls.pro/ssl

第二步:iPhone 安裝證書

在手機 Safari 瀏覽器輸入地址 chls.pro/ssl,出現證書安裝頁面,點選安裝,手機設定有密碼的輸入密碼進行安裝

第三步:配置代理 host

Charles 設定 Proxy。選擇 Proxy -> SSL Proxying Settings...

勾選 Enable SSL Proxying,點選 Add

Host 設定要抓取的 HTTPS 介面,Port 填寫 443。

讓手機重新發送 HTTPS 請求,可看到抓包。

注意:不抓包請關閉手機 HTTP 代理,否則斷開與電腦連線後會連不上網! 

拿到 .h 標頭檔案

從 AppStore 直接下載的 ipa, 蘋果公司對其做了 FairPlay DRM 技術進行加密保護,無法直接使用 class-dump 工具獲取標頭檔案。但是如果是通過 development 打包出來的話的 App 的話,是可以直接使用 class-dump 檢視所有標頭檔案的,此部分介紹就是通過此情況來說明如何獲取 .h 檔案的。

此處不再介紹 class-dump 工具的安裝過程,具體步驟請直接百度。

進入到 appName.ipa 所在目錄,修改副檔名為 .zip,然後解壓檔案,得到 appName.app。

然後執行:

class-dump -H appName.app -o ./headers/

命令執行完成後,會在當前目錄下的 headers 目錄裡看到 app 所有標頭檔案。

如果新增引數 -A -S 會在標頭檔案裡標記處類方法和屬性的 IMP 地址(模組偏移前基地址)。

class-dump -H -A -S appName.app -o ./headers/

SSH 訪問手機檔案目錄

在你的越獄手機上使用 Cydia 應用市場安裝 OpenSSH,並保證 Mac 和 iPhone 處於同一個WIFI下,在 MAC 終端輸入:

ssh [email protected] ,IP 替換為 iPhone 的 IP 地址

輸入預設密碼:alpine

即可進入 iPhone 終端。

使用 Clutch 反編譯 App

第一步:重新簽名 debugserver

取得 debugserver 有兩種方式。

第一種是在 Mac 電腦中拿到

進入路徑 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/8.3/DeveloperDiskImage.dmg(其中路徑裡 8.3,代表 iOS 系統版本,需與準備的越獄手機系統版本保持一致)。雙擊 DeveloperDiskImage.dmg,將目錄裡的 usr/bin/debugserver 複製到指定資料夾中。

第二種是在越獄手機裡拿到

如果手機連線過手機並通過 XCode 除錯過 app,會在手機裡的 /Developer/usr/bin/ 目錄下生成一個 debugserver 檔案。通過 iFunbox 匯出至 Mac 桌面。或使用 scp 命令 cpoy 出來。

重簽名 debugserver

即給 debugserver 新增 task_for_pid 許可權

key 對應的 value 都設為設為 ture

將 entitlements.plist 和 debugserver 放在同一個目錄下,執行以下命令:

codesign -s - --entitlements entitlements.plist -f debugserver

此命令會重新簽名 debugserver,將簽名後的 debugserver 拷貝至手機系統的 /usr/bin/ 目錄下。

注意:不要將 debugserver 拷貝至 /Developer/usr/bin/ 路徑下

第二步: 通過 Clutch 拿到反編譯後的 App 可執行檔案

將下載好的 Clutch 放入手機的 /usr/bin/ 路徑下。然後,給 Clutch 賦予許可權,通過 SSH 登入到手機,進入 /usr/bin/ 執行 chmod a+x ./Clutch

通過命令 Clutch -i,列出所有的可被 Clutch 的應用。

對指定序號的應用進行脫殼,如企業微信,序號是1,命令是 Clutch -d 1。執行完成後,會得到脫殼後的 ipa。

第三步:使用 class-dump 拿到 .h 標頭檔案

使用上文 【拿到.h標頭檔案】 介紹的方法拿到脫殼後的 App 標頭檔案和並記下要打斷點的方法的 IMP 地址。

動態除錯 App

本文動態除錯用到的偵錯程式是 lldb。

第一步:使 iPhone 進入等待掛載狀態

SSH 登入到手機,執行 ps -e 命令得到 App PID 或專案名稱。

進入 /usr/bin/ 執行 ./debugserver IP:port -a PID|appProjectName。 其中第一個引數 IP 可以替換為 Mac 電腦 IP地址,或者使用 * 萬用字元,允許所有 IP 除錯;第二個引數 port 隨便寫一個就行。第四個引數 可以指定要除錯 App 的 PID 或專案名稱。比如要除錯的 PID 為 6019 的搜狗輸入法專案名稱為SogouInput,則命令即為:

./debugserver *:1234 -a 6019 或 ./debugserver *:1234 -a ‘SogouInput’

此命令執行完成後,app會進入等到掛載狀態,app會被卡住點選無反應。正常現象!

如果此命令報錯,如出現 Segmentation fault: 11 等情況,說明 App 做了反動態除錯保護。遇到此種情況,需先確定 App 採用了哪種保護方案,然後進一步找到對應措施,幹掉它的反動態除錯保護。

第二步:監聽程序,進入掛載狀態

重新開啟一個 Mac 終端執行 lldb 進入 lldb 除錯狀態。然後輸入

process connect connect://iPhoneIP:port

iPhoneIP 替換為 iPhone 的 IP 地址;port 改為剛才指定的埠,即 1234。

待命令執行完成後,App 即進入掛載狀態。

第三步:獲取 App 的 ASLR 偏移量

ASLR偏移量其實就是虛擬記憶體的地址相對於模組基地址的偏移量。有兩個概念需要熟悉一下:

  • 模組在記憶體中的起始地址 ---- 模組基地址
  • ASLR偏移 ---- 虛擬記憶體起始地址與模組基地址的偏移量

在 lldb 偵錯程式模式下,執行 imge list -o -f

模組偏移後的基地址 = ASLR 偏移量 + 模組偏移前基地址(方法的 IMP 地址)

上面這個公式是尤為重要的,因為 Class-dump 中顯示的都是“模組偏移前基地址”,而 lldb 要操作的都是“模組偏移後的基地址”。所以從 Class-dump 到 lldb 要做一個地址偏移量的轉換。

至此,已得到了 App 的 ASLR 偏移量和方法的 IMP 地址。

第四步:打斷點,除錯

在 lldb 模式下執行,br s -a 'ASLR 偏移量+ IMP',然後執行 c,使 App 跑起來,觸發一個方法呼叫,就會進入斷點模式。輸入 po $arg1 列印第一個引數。

然後,配合著抓包工具 Charles(比如分析網路請求加密邏輯) 和 Class-dump(比如修改某個類的方法返回值)等工具,你就可以隨意動態除錯 App 了,就像在 XCode 裡除錯一樣!

br 命令說明

br dis 1 -- 禁用(disable)編號為1的斷點

br en 1 -- 啟用(enable)編號為1的斷點

br dis -- 禁用所有斷點

br en -- 啟用所有斷點

br del 1 -- 刪除(delete)編號為1的斷點

br del -- 刪除所有斷點

br list -- 列出所有斷點

使用 dumpdecrypted 破殼 App

dumpdecrypted 脫殼工具的原理是:將應用程式執行起來(iOS 系統會先解密程式再啟動),然後將記憶體中的解密結果 dump 寫入檔案中,得到一個新的可執行程式。

第一步:生成 .dylib 檔案

在終端進入到下載後的目錄中,cd dumpdecrypted-master,然後執行 make,即可生成 dumpdecrypted.dylib

第二步:找到 App 的 Documents 資料夾路徑

通過 SSH 登入到 iPhone,然後執行 ps -e 檢視程序,獲取要破殼的程序 PID。然後執行 cycript -p PID 附加到 PID 程序上。最後執行 [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]得到 Documents 資料夾路徑。

第三步:開始破殼

將第一步生成的 dumpdecrypted.dylib 拷貝到第二步得到的 .../Documents/ 路徑下,命令如下:scp ~/dumpdecrypted.dylib [email protected]:/var/mobile/Containers/Data/Application/2B4C6281-C015-4FF3-A8EC-5E5C7554D447/Documents(將路徑裡的 UDID 替換為你的要破殼的 App 的 UDID)

進入 Documents 目錄下,執行DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/ Application/BFED82A3-3238-4F41-B797-C1CB584CBE05/appProjectName.app/appProjectName(將路徑裡的 UDID 替換為你的要破殼的 App 的 UDID;將 appProjectName 替換為要破殼 App 的專案名稱)

待命令執行完,會在當前目錄生成一個名為 appProject.decrypted 的檔案,這個就是破殼後的 App 可執行檔案,要的就是它!使用 Class-dump 即可得到標頭檔案。或使用 Hopper 或 IDA Pro 進行反編譯。

給你的 App 新增反動態除錯機制

ptrace

為了方便應用軟體的開發和除錯,從Unix的早期版本開始就提供了一種對執行中的程序進行跟蹤和控制的手段,那就是系統呼叫 ptrace()。 通過 ptrace 可以對另一個程序實現除錯跟蹤,同時 ptrace 還提供了一個非常有用的引數那就是 PTDENYATTACH,這個引數用來告訴系統,阻止偵錯程式依附。

所以最常用的反除錯方案就是通過呼叫ptrace來實現反除錯。

sysctl

當一個程序被除錯的時候,該程序會有一個標記來標記自己正在被除錯,所以可以通過 sysctl 去檢視當前程序的資訊,看有沒有這個標記位即可檢查當前除錯狀態。

檢測到偵錯程式就退出,或者製造崩潰,或者隱藏工程,當然也可以定時去檢視有沒有這個標記。

syscall

為從實現從使用者態切換到核心態,系統提供了一個系統呼叫函式 syscall,上面講到的 ptrace 也是通過系統呼叫去實現的。

在Kernel Syscalls27這裡可以找到 ptrace 對應的編號。

26. ptrace 801e812c T

所以如下的呼叫等同於呼叫 ptrace:

syscall(26,31,0,0,0);

arm 

syscall 是通過軟中斷來實現從使用者態到核心態,也可以通過彙編 svc 呼叫來實現。

覺得不錯的話,歡迎關注我的公眾號哦!

相關推薦

如何動態除錯 iOS App(編譯App)

開篇通過本文你能瞭解 iOS 逆向的基本知識,對 iOS App 的安全有一定了解。然後能舉一反三,在自家 App 找到危險漏洞加以預防,保證使用者資料安全。在安全領域,攻與防永遠存在。哪怕是 iPhone 有著強大的安全防護機制,也擋不住那些極客們一次又一次的好奇,開發了很

如何動態調試 iOS App(編譯App)

逆向工程 iOS 教你如何動態調試 iOS App(反編譯App) 開篇 通過本文你能了解 iOS 逆向的基本知識,對 iOS App 的安全有一定了解。然後能舉一反三,在自家 App 找到危險漏洞加以預防,保證用戶數據安全。 在安全領域,攻與防永遠存在。哪怕是 iPhone 有著強大的安全防護機制

JFreeChart的demo.jar。。。一步一步編譯並得到所有原始碼。。

最近在寫一個酒店管理系統,一個人做,接近崩潰邊緣。做到酒店報表統計的時候,有一些不懂,想檢視原始碼,google了N多blog。。千篇一律,無語。。。於是打算反編譯demo.jar 自己找原始碼研究。。。 1)首先,你必須安裝有JDK,並且配置好了環境變數。。。至於配置,

IOS APP編譯

使用 方便 dump 需要 臨時 bug -h 路徑 release 一、針對於debug或者release的包: 1、用class-dump可以鏡像出所有類的.h文件,鏡像出所有的.m文件中的方法列表。非常簡單方便。 安裝後使用的命令為:class-dump -H 需要導

一招:ios app內部直接呼叫系統設定頁面

   相信所有開發ios app 的開發者們都有過這樣的經歷,那就是當app 內有推送,訪問相簿,等等功能時,如果我們第一次選擇了拒絕 或者是不接受推送訊息,那麼我們app 內部的推送開關按鈕就會這樣

關於編譯APP問題

一.反編譯需要使用的輔助軟體   1. apktool:獲取資原始檔,提取圖片檔案,佈局檔案,還有一些XML的資原始檔   2.dex2jar:將APK反編譯成Java原始碼(將classes.dex轉化為jar檔案)   

記一次某App編譯分析

每次尋找漏洞的時候,我都喜歡從抓包開始 噢噢,這裡有點尷尬~~請求和返回的資料都進行了加密處理,這波操作我挺喜歡的,證明人家公司的開發人員還是有點安全意識的,不過沒有關係,他有張良計,我有過牆梯,先反編譯一波看看,使用的工具是 jadx 很明顯,app用了360加固

Android實用技能:應該掌握的APK編譯技巧以及重新打包釋出

需要的工具 1,apktool: 反編譯獲取資原始檔的工具,包括圖片資源和佈局檔案等的獲取 下載地址:https://bitbucket.org/iBotPeaches/apktool/downloads 2,dex2jar:反編譯獲取原始碼的工具,將classes.dex 轉化為jar

mac加固app編譯apk流程

1.多渠道包生成 工具:酷傳 下載地址: http://www.kuchuan.com/client 步驟:登入-工具箱-生成多渠道包 點選生成多渠道包 上傳apk, 然後上傳渠道包配置列表(列表支援txt和csv格式) Mac 儲存為txt,格式為

如何對ios崩潰(crash)日誌做符號化

一、場景         客戶端的開發流程都相似,如android,搞ios開發就要不停地發版本,隨之而來的就是各種版本的崩潰日誌(稱為crash log)。如果不能好好地管理,那麼開發人員很快就會在crash log和版本的海洋裡迷失方向。解決崩潰問題是移動應用開發者

如何在Mac系統下編譯Android系統的原始碼

今日科技快訊 “全國公廁雲平臺”11月19日上線試執行,彙總全國近33萬條公廁資訊,初步實現快速尋廁功能。11月19日是“世界廁所日”。據瞭解,該平臺由住房和城鄉建設部組織研發,群眾可隨時隨地

iOS 破殼 編譯 黑客技術大揭祕

原地址 分享內容簡介: 在黑客的世界裡,沒有堅不可破的防護系統,也沒有無往不勝、所向披靡的入侵利器,有時候看似簡單的問題,破解起來也許花上好幾天、好幾個月,有時候看似很 low 的工具往往能解決大問題;我們以實現微信自動搶紅包為引子,逐步展開 iOS 黑客入侵常用的幾

用Python爬取妹子圖APP

教你用Python爬美之圖APP(妹子圖) 爬取結果 程式只運行了2h,最後認為程式沒有問題了就關了(我可不是去殺生去了…… 執行環境 Python 3.5+ Windows 10 VSCode 如何使用 下載專案原始碼 https

防止的Java程式被編譯的方法

1〉針對windows平臺客戶 可以考慮使用商用軟體如 Excelsior Jet 將你的程式.jar檔案轉化為一個可執行檔案(.exe). This is foolproof: it is impossible to get the .java file back if you use Excelsior

編譯APP嵌入廣告賺錢經驗分享

app賺錢的方式很多,廣告、內購、聯盟等,而廣告是個人開發者最為熱衷的一種方式。因為在apk中嵌入廣告程式碼幾乎零門檻,不需要多麼高深的技術,只要推廣到位,收入也相對可觀。這個流程總的來說其實就是在apk包中加廣告,然後推廣這個包,安裝越多,廣告展示越多,而廣告

編譯app並加入引導頁面

反編譯別人app,我們需要用到一些反編譯工具,我們這裡用到三個工具:apktool.jar,apktool.bat 、jd-gui、dex2jar 工具可以再網上下載或者https://pan.baidu.com/s/1htWNrfA   密碼:7t2i 下載  反編譯ap

CloudIDE外掛開發實戰:如何除錯程式碼

摘要:今天我們來重點介紹下CloudIDE外掛的除錯技巧,在外掛開發過程中除錯作為重要的問題分析和定位手段能夠有效幫助開發者提升外掛質量。 今天文章中的樣例工程我們繼續以上一篇《實戰CloudIDE外掛開發-快速上手》中的專案為基礎,深入介紹外掛的除錯方法。可能有的開發者對於外掛的前後端相關概念會有所疑惑,大

手把手編譯別人的app

展示 總結 直接 HR RR 具體實現 導致 執行 pil 雖然iOS系統相比於其他手機操作系統相對安全,但是這個安全並不是絕對的,我一直相信,道高一尺魔高一丈。此文想以實際例子出發,告訴大家,如何去反編譯一個app,並且從某個角度來說,iO

快速高效接入SDK——打包工具的實現(編譯資源動態整合打渠道包)

1、打包工具的輸入,就是需要打包的apk包,也叫母包。遊戲裡面引入sdk抽象層的jar包,呼叫抽象層的介面。完成接入,然後打成apk。 2、打包工具會首先用apktool -d 對母包進行反編譯。反編譯到該渠道對應的臨時工作目錄中 3、重新命名包名。我們知道在AndroidManifet.xml中的pack

Android Cocos2dx引擎 prv.ccz/plist/so等優化緩存文件,手把手ida逆向project編譯apk庫等文件

反編譯 packer ng- ace yaffs2 ces spa 即將 放棄 前段時間在 Android play 上看到一個非常牛逼的 3D 動態天氣預報,效果真的非常炫。二話不說動手 dex2jar.bat/apktool 發現這並沒 有什麽卵用,在核心的地方看見