注:本文最初發布在 念茜的部落格
你的應用正在被其他對手反向工程、跟蹤和操作?你的應用是否依舊裸奔毫不防禦?
鄭重宣告一下,懂得如何攻擊才會懂得如何防禦,一切都是為了之後的防禦作準備。廢話少說,進入正題。
今天總結一下為hack而做的準備工作。
常用的命令和工具
ps ——顯示程式狀態,CPU使用率,記憶體使用情況等
sysctl ——檢查設定Kernel配置
netstat ——顯示網路連線,路由表,介面狀態等
route ——路由修改
renice ——調整程式執行的優先順序
ifconfig ——檢視網路配置
tcpdump ——截獲分析網路資料包
lsof ——列出當前系統開啟的檔案列表,別忘記一切皆檔案,包括網路連線、硬體等
otool ① ——檢視程式依賴哪些動態庫資訊,反編程式碼段……等等等等
nm ② ——顯示符號表
ldid ③ ——簽名工具
gdb ——除錯工具
patch ——補丁工具
SSH ——遠端控制
備註:
① otool,可檢視可執行程式都連結了那些庫:
1 |
otool -L WQAlbum |
可以得到:
1 2 3 4 5 6 7 8 |
WQAlbum: /System/Library/Frameworks/StoreKit.framework/StoreKit (compatibility version 1.0.0, current version 1.0.0) /System/Library/Frameworks/AdSupport.framework/AdSupport (compatibility version 1.0.0, current version 1.0.0) /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5) /System/Library/Frameworks//MediaPlayer.framework/MediaPlayer (compatibility version 1.0.0, current version 1.0.0) /System/Library/Frameworks/MobileCoreServices.framework/MobileCoreServices (compatibility version 1.0.0, current version 40.0.0) /System/Library/Frameworks/CoreMedia.framework/CoreMedia (compatibility version 1.0.0, current version 1.0.0) …… |
可以反編譯WQAlbum的__TEXT__段內容, 截前10行:
1 |
otool -tV WQAlbum |head -n 10 |
可以得到:
1 2 3 4 5 6 7 8 9 |
WQAlbum: (__TEXT,__text) section start: 00002de0 pushl $0x00 00002de2 movl %esp,%ebp 00002de4 andl $0xf0,%esp 00002de7 subl $0x10,%esp 00002dea movl 0x04(%ebp),%ebx …… |
② nm,顯示程式符號表,用我自己的應用程式私人相簿現身說法一下:
1 |
nm -g WQAlbum ( -g 代表 global) |
可以得到:
1 2 3 |
001e5eec S _OBJC_IVAR_$_WQPhotoViewController.albumObject 001e5efc S _OBJC_IVAR_$_WQPhotoViewController.int_current 001e5f00 S _OBJC_IVAR_$_WQPhotoViewController.int_total |
其中,WQPhotoViewController為類名,albumObject為該類的成員
③ ldid,是iPhoneOS.platform提供的簽名工具,我們自己編譯的程式需要簽上名才能跑在iPhone/iPad上,使用方法
1 2 |
export CODESIGN_ALLOCATE=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate ldid -S helloworld |
編譯Hello world
1.首先找到編譯器:
arm-apple-darwin10-llvm-gcc-4.2 就是了。
為了方便起見,可以在.bashrc或者profile 配置下環境變數,方便編譯。
2.找到SDK
編譯我們自己的程式的時候需要指定該目錄下的SDK。
3.來個經典Hello world :
1 2 3 4 5 |
#include <stdio.h> int main(){ printf("Hello world !!!\n"); return 0; } |
4.編譯
其中 -isysroot用來指定build時的SDK
5.校驗
file檢視一下型別,沒問題。
6.SCP給iPhone、iPad
前提是,裝置已經越獄並且安裝了SSH,且必須在同一網段。
$scp helloworld root@x.x.x.x:hello world
7.登入裝置簽名
$ssh -l root x.x.x.x
#ldid -S helloworld
8.執行程式
#./helloworld
Hello world !!!
執行成功,這就完成了最簡單的手動執行自己的應用程式。