Cycript
- 找到當前界面上的所有對象
cy# UIApp.keyWindow.recursiveDescription.toString
通過控件的 nextResponder 查找視圖控制器
- 打印當前控制器下的所有控制器
cy# [UIApp.keyWindow.rootViewController _printHierarchy].toString()
hook 腳本根據頭文件生一個 xm 文件,hook 所有頭文件的方法
- 第一種方法
路徑:opt/theos/bin/logify.pl
logify.pl 頭文件路徑 > ./hookHeader.xm
生成之后拖入工程編譯之后生成mm 文件,在拖入動態庫中
- 第二種方法
在工程 Config/MethodTraceConfig.plist 文件下修改
ENABLE_METHODTRACE --》 YES
TARGET_CLASS_LIST 下添加要 hook 的文件頭名稱
- 配置環境變量
配置環境變量是使用如下命令:
vim ~./bash_profile
在OSX下,我們用如下命令打開環境變量配置文件:
open ~/.bash_profile
最后,別忘了編譯下
source .bash_profile
- 查看函數調用棧
恢復符號表
在終端控制器 restore-symbol 文件路徑下執行 make restore-symbol
生成可執行文件restore-symbol
在通過restore-symbol可執行文件把項目可執行文件恢復符號表
./restore-symbol wechat_arm64 -o wechat_symbol(恢復符號表之后新的執行文件)
要恢復符號表必須是單一架構的 mach-O文件
查看支持架構 lipo -info wechat
拆分架構 lipo wechat -thin arm64 - output wechat_arm64
- 恢復 block 符號表
使用此腳本 ida_search_block.py,在 ida 中執行
生成block_symbol.json文件
在終端控制臺輸入命令生成 Mach-O 文件
LLDB
bt查看函數調用棧
- 之所以能夠 LLDB 動態調試,是因為有 debugSever 在程序中啟動,如果不讓它啟動就會傘退,起到反調試的作用。
- 導出執行文件的頭文件
class-dump -H 執行文件名 -o 導出的路徑
1. ssh
- Apple File Conduit "2" 安裝插件,可以在 mac 獲取 root 權限目錄
- AppSync Unified 安裝插件,可以繞過一些驗證(簽名機制),手機越獄之后的驗證機制就被破壞了。
-
OpenSSH 安裝插件,主要作用通過 openSSH 能連接(登錄)手機,能夠訪問手機的所有東西
// 在完美越獄的手機下
ssh 用戶名@IP地址
ssh root@192.168.21.111 通過具體IP地址是 wifi 連接
登錄之后輸入密碼,默認密碼為 alpine
//刪除服務器對應的公鑰
ssh-keygen -R 服務器 IP 地址
iOS下有兩個用戶 root 最高權限的用戶和 mobile 用戶
exit ;退出
文件的讀寫權限只有 root 才可以操作
ifunbox
// 在 root 下修改密碼
passwd ;再輸入兩次新密碼之后修改成功}
ssh
ssh 是一種網絡協議,用于計算機之間的加密登錄
openSSH
openSSH 其中一種軟件
中間人攻擊
預防中間人攻擊最有效的方法就是驗證公鑰是不是服務器的
如果是公開的 SSH 服務器,一般會將公鑰的哈希值會公布在網站上的
ssh 使用公鑰登錄
除了使用密碼登錄,也可以免密登錄
所謂的公鑰登錄,原理:
1.mac 電腦將自己的公鑰發給遠程的手機
2.手機隨機的生成一段字符串,發給 mac 電腦
3.Mac 電腦利用私鑰加密字符串
4.手機利用公鑰解密字符串,如果能對得上,就成功了
如果還要輸入密碼的,設置文件的權限 chmod 755
//非完美越獄的 ssh 連接
ssh root@localhost -p 2222
//文件拷貝
scp -P 2222 123.text root@localhost:~/
App瘦身
1.先拆執行文件
lipo xx -thin arm64 -output xx_arm64
2.打包 ipa 包
zip -ry xx.ipa Payload
2.cycript
- 在手機終端下無法輸入中文的解決:導入 .inputrc文件到越獄手機的 root 路徑中
//.inputrc 文件包含內容
set convert-meta off
set output-meta on
set meta-flag on
set input-meta on
要使用 vim 就要在越獄手機上安裝Vi IMproved 插件
安裝 adv-cmds 插件一定要安裝,是一個命令行工具包,可以使用終端指令
安裝 Cycript 插件,可以使用 cycript
在登錄手機終端下,輸入:
ps -A //查看所有進程
ps -A | grep XX //過濾進程
- 連接某個進程的方法
//第一種連接方式,根據進程名稱
cycript -p WeChat
//第二種連接方式,根據進程ID
cycript -p 2365
//退出連接:control + D
在 cycript 中可以添加函數,會依附在某個進程里面,進程退出之后就失效
WX20180607-113016@2x.png
- cy文件
1.把 cy 文件放入手機路徑/usr/lib/cycript0.9中
2.在終端輸入@import xx(cy文件名)
//cy文件內容
rootvc = function() {
return UIApp.keyWindow.rootViewController;
};
keyWindow = function() {
return UIApp.keyWindow;
};
APPID = [[NSBundle mainBundle] bundleIdentifier];
currentvc = function() {
var tempcurrentvc;
var temprootvc = UIApp.keyWindow.rootViewController;
var next = YES;
while(next) {
if ([temprootvc presentedViewController]) {
temprootvc = [temprootvc presentedViewController];
}
if ([temprootvc isKindOfClass:[UITabBarController class]]) {
temprootvc = [temprootvc selectedViewController];
} else if ([temprootvc isKindOfClass:[UINavigationController class]]){
temprootvc = [temprootvc topViewController];
} else {
next = NO;
tempcurrentvc = temprootvc;
}
}
return tempcurrentvc;
};
- 砸殼:加密的 app 是無法 class-dump,class-dump 可以導出頭文件
靜態的方法:Clutch
1.下載 Clutch-2.0.4,拷貝到手機root@localhost:/usr/bin 目錄下
2.mv Clutch-2.0.4 Clutch //重命名
3.執行權限 chmod +x Clutch
4.Clutch -i ;查詢加密的 APP(沒有砸殼的)
5.Clutch -d 使用序列號或者 bundleID
6.得到砸殼后的 ipa 文件,拷貝出來
7.在 Mac 終端下驗證查看執行文件信息是否加密,otool -l xxx | grep crypt
動態的方法:dumpdecrypted
1.下載dumpdecrypted(https://github.com/stefanesser/dumpdecrypted),解壓之后,執行在當前目錄下終端執行 make
2.得到一個dumpdecrypted.dylib文件,拷貝到手機:
scp -P 2222 dumpdecrypted.dylib root@localhost:~/
3.依附到某個進程插入動態庫dumpdecrypted.dylib,
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib 進程的路徑(ps -A 可以查看進程路徑)
4.到當前目錄下得到 xxx.decrypted的新文件
-
dumpdecrypted砸殼出現的問題一:
解決方案:
## 列出可簽名證書
security find-identity -v -p codesigning
## 為dumpecrypted.dylib簽名
codesign --force --verify --verbose --sign "iPhone Developer: xxx xxxx (xxxxxxxxxx)" dumpdecrypted.dylib
然后重新上傳dumpdecrypted.dylib到手機,再重新砸殼
-
寫插件
- Homebrew
// 安裝 Homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
常用的方式
brew install ldid 安裝
brew uninstall ldid 卸載
brew search ldid 搜索
brew upgrade ldid 更新
brew list 查看列表
brew update 更新 Homebrew
-
Theos
// 安裝 Theos
https://github.com/theos/theos/wiki/Installation
- 創建插件過程:
1.在Mac 桌面上創建一個 theosdemo 文件目錄,在此目錄下進入終端
-
2.輸入 nic.pl
-
3.輸入11,選擇創建 tweak,并依此輸入Project Name、Package Name、uthor/Maintainer Name、MobileSubstrate Bundle filter等信息,最后得到文件wechatpwdtweak(Package Name工程名是自己定義的)
-
4.修改工程下的內容
-
5.修改完之后就在終端下執行:make ;編譯一下
-
6.在執行打包指令:make package
7.make install:安裝插件到手機,就完成了
關于Theos的坑!!!!
1.不要在中文目錄下編譯工程.否則報錯!
2.packageName(包名稱),全部小寫!!!
**打包的問題:make package
Error: IO::Compress::lzma
解決方案兩種:
1.安裝xz
$ brew install xz
$ sudo cpan IO::Compress::Lzma
2. 改變壓縮方式
2.1修改dm.pl 文件
vim $THEOS/$THEOS/vendor/dm.pl/dm.pl
#use IO::Compress::Lzma;
#use IO::Compress::Xz;
2.2修改deb.mk 文件
vim $THEOS/makefiles/package/deb.mk
修改為:
_THEOS_PLATFORM_DPKG_DEB_COMPRESSION ?= gzip
**編譯的問題:make
Error: You do Not an SDK
需要指定Xcode . 安裝過MonkeyDev
clean 清除緩存!
- 文件拷貝:
1.電腦拷貝到手機
scp -P 2222 xxx root@localhost:~/
2.手機拷貝到電腦
scp -P 2222 root@localhost:~/xxx ~/Desktop
查看執行文件架構
file xxx
- 越獄手機之后添加源和插件
-
添加源
- PP助手源:http://apt.25pp.com
- 威鋒源:http://apt.so
-
安裝插件
- Apple File Conduit "2" 插件:可以在 mac 獲取 root 權限目錄
- AppSync Unified 插件:可以繞過一些驗證(簽名機制),手機越獄之后的驗證機制就被破壞了。
- OpenSSH 插件:主要作用通過 OpenSSH 能連接(登錄)手機,能夠訪問手機的所有東西
- Cycript 插件
-
LLDB 調試
Xcode: LLDB
手機: APP、debugserver
LLDB->debugserver->APP
cd /Developer/usr/bin
- debugserver 連接 APP
- debugserver *:端口號 -a 進程
- *:端口號。使用手機的某個端口提供服務
- -a 進程:連接的 APP(進程 ID,進程名稱--MachO 文件名稱)
- debugserver *:端口號 -a 進程
./debugserver *:12346 -a WeChat
iOS 攻防策略
動態庫能夠被加載,而且調用:
如果一個應用的二進制被修改了注定要重簽名!
dyld (應用可執行文件)調用:
插入到某個進程:DYLD_INSERT_LIBRARIES
-
攻擊
- OC 方法:Method Swizzling
- 系統 C 函數:fishhook,系統庫函數是有符號的,綁定符號
- Tweak 寫插件的方式安裝在越獄手機上,通過DYLD_INSERT_LIBRARIES 方式注入動態庫到 APP 中
- 攻克用 RESTRICT 段防護的 APP,利用二進制修改器破壞防護
- 攻克 ptrace:使用 fishhook
- 攻克 sysctl :使用 fishhook
-
防護
- 基本防護, fishhook
- Tweak 使用 DYLD_INSERT_LIBRARIES 進攻,就用 RESTRICT 段防護:
- 在 target—》Build Settings-》Other Linker Flags添加 -Wl,sectcreate,__RESTRICT,__restrict,/dev/null
- Tweak 使用 DYLD_INSERT_LIBRARIES 進攻,就用 RESTRICT 段防護:
- 以防二進制修改器破壞防護,使用 dyld 源碼再進行防護
- ptrace防護--反調試:拒絕進程的附加
- 通過 framework 防護調試
- sysctl 檢測進程是否被調試
- 代碼混淆,通過 .pch 文件
- 字符串加密
- 隱藏函數名稱
- 使用匯編進行系統調用
- 重簽名防護
防護主要手段
1.重簽名防護;
2.ptrace 防護(用匯編)
3.反 hook 防護(動態庫提前)
4.混淆關鍵代碼
ptrace (process trace 進程跟蹤)
此函數提供了一個進程監聽控制另一個進程,并且可以檢測被控制進程的內存和寄存器里面的數據!它可以用來實現斷點調試和系統調用跟蹤,debugserver 就是用的它。
iOS 中沒有提供相關的頭。
sysctl 函數:
//sysctl 防護
int name[4];//里面放字節碼,查詢信息
name[0] = CTL_KERN;//內核查看
name[1] = KERN_PROC;//查詢進程
name[2] = KERN_PROC_PID;//傳遞的參數是進程的 ID(PID)
name[3] = getpid();//PID 的值
struct kinfo_proc info;//接受進程查詢結果信息的結構體
size_t info_size = sizeof(info);//結構體的大小
int error = sysctl(name, sizeof(name)/sizeof(*name), &info, &info_size, 0, 0);
assert(error == 0);//0就是沒有錯誤,其他就是錯誤碼
return ((info.kp_proc.p_flag & P_TRACED) != 0);
閃退的可能是防護使用:
- exit();
- ptrace;