逆向工程的目的
1)分析競品的最新研究或者產品原型(包括所用的技術,所使用的框架)
2)學術/學習目的。
3)破解應用的使用權限
4)識別競品潛在的侵權行為
逆向工程的分析工具
進行iOS逆向工程的一個關鍵就是工具的使用,工欲善其事,必先利其器。
工具分類 工具名稱
越獄工具 盤古越獄
查看文件工具 PP助手, iExplorer, iFunbox, iTool
砸殼工具 dumpdecrypted, Clutch
查看頭文件工具 class-dump
反匯編工具 Hopper, IDA Pro
調試器 Cycript, gdb
UI分析工具 Reveal
網絡分析工具 Charles
第一部分 砸殼查看APP頭文件
工具
一.App Store上的應用都使用了FairPlay DRM數字版權加密保護技術。我們要對文件進行反匯編,而IPA都是加密的,哪怎么辦呢?所以在逆向之前我們需要先對應用進行砸殼。這里我們使用的是 dumpdecrypted。(還可以使用Clutch,這里我們就不講Clutch了)
dumpdecrypted 代碼
Dumps decrypted mach-o files from encrypted iPhone applications from memory to disk.
This tool is necessary for security researchers to be able to look under the hood of encryption.
二.class-dump是用于解析Mach-O文件中存儲的OC運行時信息的。他能生成類的聲明、分類、協議。和otool -ov類似,但是由于class-dump的結果是以OC代碼展示的,所以有很強的可讀性。
class-dump 代碼
This is a command-line utility for examining the Objective-C runtime information stored in Mach-O files.
It generates declarations for the classes, categories and protocols. This is the same information provided by using ‘otool -ov’,
but presented as normal Objective-C declarations, so it is much more compact and readable.
三.一臺越獄手機
iOS為了保證安全性,所有的應用都是在沙盒中運行。所以要想完成逆向操作,我們需要更高級的權限。沒有越獄設備那就無法展開學習和研究工作。
步驟
一.安裝好 dumpdecrypted和 class-dump 以后,在越獄機上Cydia上安裝 openSSH,通過MAC終端控制手機,openSSH密碼是alpine(手機和電腦需要在同一網段,然后點開設置查看當前手機分配的ip地址)
Mac-mini-Damon:~ damon$ ssh root@192.168.2.108
root@192.168.2.108's password:
iPhone4:~ root#
二.在越獄機上Cydia上安裝 Cycript
Cycript是一個理解Objective-C語法的javascript解釋器,這意味著我們能夠在一個命令中用Objective-C或者javascript,
甚至2者兼用。它能夠掛鉤正在運行的進程,能夠在運行時修改應用的很多東西。使用Cycript有如下好處:
1.我們能夠掛鉤正在運行的進程,并且找出正被使用的類信息,例如view controllers,內部和第3方庫,甚至程序的delegate的名稱。
2.對于一個特定的類,例如View Controller, App delegate或者任何其他的類,我們能夠得到所有被使用的方法名稱。
3.我們能夠得到所有實例變量的名稱和在程序運行的任意時刻實例變量的值。
4.我們能夠在運行時修改實例變量的值。
5.我們能夠執行Method Swizzling,例如替換一個特定方法的實現。
6.我們可以在運行時調用任意方法,即使這個方法目前并不在應用的實際代碼當中。
Mac-mini-Damon:dumpdecrypted-master damon$ cd /Users/damon/Desktop/dumpdecrypted-master
Mac-mini-Damon:dumpdecrypted-master damon$ make
`xcrun --sdk iphoneos --find gcc` -Os? -Wimplicit -isysroot `xcrun --sdk iphoneos --show-sdk-path` -F`xcrun --sdk iphoneos --show-sdk-path`/System/Library/Frameworks -F`xcrun --sdk iphoneos --show-sdk-path`/System/Library/PrivateFrameworks -arch armv7 -arch armv7s -arch arm64 -c -o dumpdecrypted.o dumpdecrypted.c
Mac-mini-Damon:dumpdecrypted-master damon$ ls
Makefile? ? ? ? dumpdecrypted.c? ? dumpdecrypted.o
README? ? ? ? ? dumpdecrypted.dylib
Mac-mini-Damon:dumpdecrypted-master damon$
三.找出要反編譯APP的執行文件目錄,為了避免干擾,最好殺掉其他進程,只打開反編譯APP,使用ps -e命令得到路徑
iPhone4:~ root# ps -e
PID TTY? ? ? ? ? TIME CMD
1556 ??? ? ? ? 0:00.10 /usr/libexec/afc2d -S -L -d /
1564 ??? ? ? ? 0:03.07 /usr/libexec/deleted --idleExit
1566 ??? ? ? ? 0:00.15 /System/Library/PrivateFrameworks/GeoServices.framework/geod
1568 ??? ? ? ? 0:00.36 /usr/libexec/mobileassetd
1570 ??? ? ? ? 0:00.63 /System/Library/Frameworks/AssetsLibrary.framework/Support/assetsd
1612 ??? ? ? ? 0:00.37 sshd: root@ttys000
1622 ??? ? ? ? 0:06.20 /var/mobile/Applications/B1215D4A-24B7-480F-B91D-8F5386B0211A/QQ.app/QQ
1623 ??? ? ? ? 0:00.10 /System/Library/Frameworks/UIKit.framework/Support/pasteboardd
1613 ttys000? ? 0:00.05 -sh
1628 ttys000? ? 0:00.01 ps -e
iPhone4:~ root#
其中的 /var/mobile/Applications/B1215D4A-24B7-480F-B91D-8F5386B0211A/QQ.app/QQ 就是我們要找的
四.使用Cycript找出反編譯APP的Documents目錄路徑
iPhone4:~ root# cycript -p QQ
cy# [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]
#"file:///var/mobile/Applications/B1215D4A-24B7-480F-B91D-8F5386B0211A/Documents/"
cy#
其中的 /var/mobile/Applications/B1215D4A-24B7-480F-B91D-8F5386B0211A/Documents/ 就是我們要找的Documents目錄路徑
五.將dumpdecrypted_7.dylib拷貝到Documents目錄下,此處是使用scp方式,也可以使用iFunBox或者PP助手進行文件操作(這里的dumpdecrypted_7.dylib是別人已經生成好的)地址
Mac-mini-Damon:~ damon$ scp /Users/damon/Desktop/dumpde/dumpdecrypted_7.dylib root@192.168.2.108:/var/mobile/Applications/B1215D4A-24B7-480F-B91D-8F5386B0211A/Documents/
root@192.168.2.108's password:
dumpdecrypted_7.dylib? ? ? ? ? ? ? ? ? ? ? ? 100%? 81KB? 81.0KB/s? 00:00
Mac-mini-Damon:~ damon$
六.然后就是使用dumpdecrypted砸殼
iPhone4:~ root# cd /var/mobile/Applications/B1215D4A-24B7-480F-B91D-8F5386B0211A/Documents/
iPhone4:/var/mobile/Applications/B1215D4A-24B7-480F-B91D-8F5386B0211A/Documents root# DYLD_INSERT_LIBRARIES=dumpdecrypted_7.dylib /var/mobile/Applications/B1215D4A-24B7-480F-B91D-8F5386B0211A/QQ.app/QQ
mach-o decryption dumper
DISCLAIMER: This tool is only meant for security research purposes, not for application crackers.
[+] detected 32bit ARM binary in memory.
[+] offset to cryptid found: @0x4a4c(from 0x4000) = a4c
[+] Found encrypted data at address 00004000 of length 46284800 bytes - type 1.
[+] Opening /private/var/mobile/Applications/B1215D4A-24B7-480F-B91D-8F5386B0211A/QQ.app/QQ for reading.
[+] Reading header
[+] Detecting header type
[+] Executable is a FAT image - searching for right architecture
[+] Correct arch is at offset 16384 in the file
[+] Opening QQ.decrypted for writing.
[+] Copying the not encrypted start of the file
[+] Dumping the decrypted data into the file
[+] Copying the not encrypted remainder of the file
[+] Setting the LC_ENCRYPTION_INFO->cryptid to 0 at offset 4a4c
[+] Closing original file
[+] Closing dump file
iPhone4:~ root# ls
(null)/? ? ? ? CustomFace/? ? ? ? Image/? ? ? ? Other/? ? ? ? QQAppSetting.plist? TRctBundle/? app.m? ? ? ? ? ? ? ? dumpdecrypted_7.dylib? wallet/
AVEngine.log? ? Doc/? ? ? ? ? ? ? LuaPluginDir/? QMusicSdk/? ? QQFlow.ini? ? ? ? ? Theme/? ? ? client_wording.json? giftInfo/? ? ? ? ? ? ? webappCache2/
Audio/? ? ? ? ? FileRecv/? ? ? ? ? MQZONEv1/? ? ? QQ.decrypted? QQHeadThumb/? ? ? ? ThemeInfo/? content/? ? ? ? ? ? patchScripts/? ? ? ? ? wupseq.dat
ConfigStorage/? FileTransferTemp/? MyFolder/? ? ? QQ.ini? ? ? ? QZoneImageThumb/? ? Video/? ? ? contents/? ? ? ? ? ? tbmg.data
root#
其中的 QQ.decrypted 就是我們要的破解文件
七.使用class-dump將文件解析
將QQ.decrypted拷貝到Mac桌面文件夾,使用class-dump進行解析
Mac-mini-Damon:~ damon$ cd /Users/damon/Desktop/test
Mac-mini-Damon:test damon$ class-dump --arch armv7 QQ.decrypted > QQ.m
Mac-mini-Damon:test damon$
得到的QQ.m文件就是我們需要的頭文件,class-dump --arch armv7 QQ.decrypted > QQ.m,因為我是用的手機是iPhone4做的(沒辦法,只能用公司不用的4進行越獄),所以使用 armv7,其他型號使用相對應的 4(armv7),4s(armv7),5(armv7),5s(arm64),6(arm64),6s(arm64)
1)分析從AppStore下載的IPA包
class-dump --arch armv7 QQ.decrypted > QQ.m
2)分析從越獄平臺下載的越獄IPA包
class-dump -H MYXJ.app -o /Users/damon/Desktop/test/headMYXJ
第二部分 分析APP UI
Reveal簡介
Reveal能夠在運行時調試和修改iOS應用程序。它能連接到應用程序,并允許開發者編輯各種用戶界面參數,
這反過來會立即反應在程序的UI上。就像用FireBug調試HTML頁面一樣,在不需要重寫代碼、
重新構建和重新部署應用程序的情況下就能夠調試和修改iOS用戶界面。
Reveal查看任意app的高級技巧介紹了如何在越獄設備上查看任意app的技巧:
1)iOS設備需要越獄,iOS6以上
2)安裝Reveal,越獄設備與安裝Reveal的Mac在同一wifi內。
3)點擊菜單Help / Show Reveal Library in Finder,獲取libReveal.dylib
4)將libReveal.dylib上傳到設備的/Library/MobileSubstrate/DynamicLibraries
5)編輯并上傳一個libReveal.plist,格式和/Library/MobileSubstrate/DynamicLibraries下面的其他plist類似,其中的filter的bundle寫要查看的iOS App的bundle Id。
格式如下:
{ Filter = { Bundles = ( "你要查看的app的bundle Id" ); }; }
6)重啟iOS設備
第三部分 反編譯
一:Hopper簡介
Hopper是一款運行在Mac、Windows和Linux下的調試(os x only)、反匯編和反編譯的交互式工具。
可以對32、64位的MAC程序、Windows程序和IOS程序(arm)進行調試、反編譯等。
功能
1)能夠分析出函數的代碼塊、變量等
2)可以生成代碼塊的控制流圖CFG
3)可以通過Python腳本來調用Hopper的其他一些功能,使用更加靈活
4)在MAC上還可以通過GDP動態調試分析
5)對Objective C的極佳的支持——能夠解析出Selector、字符串和發送的消息
6)反編譯,生成偽代碼
7)分析快速,且占用資源少
二:IDA Pro簡介
IDA Pro是一個非常強大的反匯編和調試工具,支持Windows,Linux, Mac OS X平臺
IDA Pro權威指南(第2版)
第四部分 網絡接口分析
Charles簡介
Charles是Mac下常用的對網絡流量進行分析的工具,類似于Windows下的Fiddler。
在開發iOS程序的時候,往往需要調試客戶端和服務器的API接口,這個時候就可以用Charles,Charles能夠攔截SSL請求、模擬慢速網絡、
支持修改網絡請求包并多次發送、能夠篡改Request和Response等強大的功能。下面介紹安裝和使用方法。
功能
1)攔截SSL請求
2)模擬慢速網絡
菜單Proxy中的Throttle Setting可以對此進行設置
3)支持修改網絡請求包并多次發送
4)斷點功能
Charles能夠斷到發送請求前(篡改Request)和請求后(篡改Response)
5)捕獲記錄控制 可以過濾出關注的請求。菜單Proxy中的Record Setting可以對此進行設置
第五部分 使用調試器hook
gdb調試命令
已經集成在Xcode中去了用于調試App程序
但是直接在硬件設備上執行時,可以獲得更多的功能
可以調試設備上所有的進程
快速分離和重新附著到某個進程上
沒有桌面形式的操作系統上進行開發程序時的調試
攻擊者可以修改gdb命令的腳本文件,來達到操作設備上任何程序的
運行、修改、監控設備上的所有的程序
iOS應用程序安全(22)-使用GDB進行運行時分析和操作
iOS安全攻防(二十)動態調試利器---gdb基礎篇
iOS逆向工程讀書筆記
第六部分 如何防止被反編譯
代碼混淆的必要性以及方法:
1) 使用c語言實現關鍵的代碼邏輯
2)使用宏替換