Cycript
- 找到當(dāng)前界面上的所有對(duì)象
cy# UIApp.keyWindow.recursiveDescription.toString
通過控件的 nextResponder 查找視圖控制器
- 打印當(dāng)前控制器下的所有控制器
cy# [UIApp.keyWindow.rootViewController _printHierarchy].toString()
hook 腳本根據(jù)頭文件生一個(gè) xm 文件,hook 所有頭文件的方法
- 第一種方法
路徑:opt/theos/bin/logify.pl
logify.pl 頭文件路徑 > ./hookHeader.xm
生成之后拖入工程編譯之后生成mm 文件,在拖入動(dòng)態(tài)庫中
- 第二種方法
在工程 Config/MethodTraceConfig.plist 文件下修改
ENABLE_METHODTRACE --》 YES
TARGET_CLASS_LIST 下添加要 hook 的文件頭名稱
- 配置環(huán)境變量
配置環(huán)境變量是使用如下命令:
vim ~./bash_profile
在OSX下,我們用如下命令打開環(huán)境變量配置文件:
open ~/.bash_profile
最后,別忘了編譯下
source .bash_profile
- 查看函數(shù)調(diào)用棧
恢復(fù)符號(hào)表
在終端控制器 restore-symbol 文件路徑下執(zhí)行 make restore-symbol
生成可執(zhí)行文件restore-symbol
在通過restore-symbol可執(zhí)行文件把項(xiàng)目可執(zhí)行文件恢復(fù)符號(hào)表
./restore-symbol wechat_arm64 -o wechat_symbol(恢復(fù)符號(hào)表之后新的執(zhí)行文件)
要恢復(fù)符號(hào)表必須是單一架構(gòu)的 mach-O文件
查看支持架構(gòu) lipo -info wechat
拆分架構(gòu) lipo wechat -thin arm64 - output wechat_arm64
- 恢復(fù) block 符號(hào)表
使用此腳本 ida_search_block.py志鞍,在 ida 中執(zhí)行
生成block_symbol.json文件
在終端控制臺(tái)輸入命令生成 Mach-O 文件
LLDB
bt查看函數(shù)調(diào)用棧
- 之所以能夠 LLDB 動(dòng)態(tài)調(diào)試,是因?yàn)橛?debugSever 在程序中啟動(dòng)桨螺,如果不讓它啟動(dòng)就會(huì)傘退私痹,起到反調(diào)試的作用。
- 導(dǎo)出執(zhí)行文件的頭文件
class-dump -H 執(zhí)行文件名 -o 導(dǎo)出的路徑
1. ssh
- Apple File Conduit "2" 安裝插件刷喜,可以在 mac 獲取 root 權(quán)限目錄
- AppSync Unified 安裝插件,可以繞過一些驗(yàn)證(簽名機(jī)制)立砸,手機(jī)越獄之后的驗(yàn)證機(jī)制就被破壞了掖疮。
-
OpenSSH 安裝插件,主要作用通過 openSSH 能連接(登錄)手機(jī)颗祝,能夠訪問手機(jī)的所有東西
// 在完美越獄的手機(jī)下
ssh 用戶名@IP地址
ssh root@192.168.21.111 通過具體IP地址是 wifi 連接
登錄之后輸入密碼浊闪,默認(rèn)密碼為 alpine
//刪除服務(wù)器對(duì)應(yīng)的公鑰
ssh-keygen -R 服務(wù)器 IP 地址
iOS下有兩個(gè)用戶 root 最高權(quán)限的用戶和 mobile 用戶
exit ;退出
文件的讀寫權(quán)限只有 root 才可以操作
ifunbox
// 在 root 下修改密碼
passwd 螺戳;再輸入兩次新密碼之后修改成功}
ssh
ssh 是一種網(wǎng)絡(luò)協(xié)議搁宾,用于計(jì)算機(jī)之間的加密登錄
openSSH
openSSH 其中一種軟件
中間人攻擊
預(yù)防中間人攻擊最有效的方法就是驗(yàn)證公鑰是不是服務(wù)器的
如果是公開的 SSH 服務(wù)器,一般會(huì)將公鑰的哈希值會(huì)公布在網(wǎng)站上的
ssh 使用公鑰登錄
除了使用密碼登錄倔幼,也可以免密登錄
所謂的公鑰登錄盖腿,原理:
1.mac 電腦將自己的公鑰發(fā)給遠(yuǎn)程的手機(jī)
2.手機(jī)隨機(jī)的生成一段字符串,發(fā)給 mac 電腦
3.Mac 電腦利用私鑰加密字符串
4.手機(jī)利用公鑰解密字符串损同,如果能對(duì)得上翩腐,就成功了
如果還要輸入密碼的,設(shè)置文件的權(quán)限 chmod 755
//非完美越獄的 ssh 連接
ssh root@localhost -p 2222
//文件拷貝
scp -P 2222 123.text root@localhost:~/
App瘦身
1.先拆執(zhí)行文件
lipo xx -thin arm64 -output xx_arm64
2.打包 ipa 包
zip -ry xx.ipa Payload
2.cycript
- 在手機(jī)終端下無法輸入中文的解決:導(dǎo)入 .inputrc文件到越獄手機(jī)的 root 路徑中
//.inputrc 文件包含內(nèi)容
set convert-meta off
set output-meta on
set meta-flag on
set input-meta on
要使用 vim 就要在越獄手機(jī)上安裝Vi IMproved 插件
安裝 adv-cmds 插件一定要安裝膏燃,是一個(gè)命令行工具包茂卦,可以使用終端指令
安裝 Cycript 插件,可以使用 cycript
在登錄手機(jī)終端下组哩,輸入:
ps -A //查看所有進(jìn)程
ps -A | grep XX //過濾進(jìn)程
- 連接某個(gè)進(jìn)程的方法
//第一種連接方式等龙,根據(jù)進(jìn)程名稱
cycript -p WeChat
//第二種連接方式处渣,根據(jù)進(jìn)程ID
cycript -p 2365
//退出連接:control + D
在 cycript 中可以添加函數(shù),會(huì)依附在某個(gè)進(jìn)程里面,進(jìn)程退出之后就失效
- cy文件
1.把 cy 文件放入手機(jī)路徑/usr/lib/cycript0.9中
2.在終端輸入@import xx(cy文件名)
//cy文件內(nèi)容
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 可以導(dǎo)出頭文件
靜態(tài)的方法:Clutch
1.下載 Clutch-2.0.4罐栈,拷貝到手機(jī)root@localhost:/usr/bin 目錄下
2.mv Clutch-2.0.4 Clutch //重命名
3.執(zhí)行權(quán)限 chmod +x Clutch
4.Clutch -i ;查詢加密的 APP(沒有砸殼的)
5.Clutch -d 使用序列號(hào)或者 bundleID
6.得到砸殼后的 ipa 文件泥畅,拷貝出來
7.在 Mac 終端下驗(yàn)證查看執(zhí)行文件信息是否加密悠瞬,otool -l xxx | grep crypt
動(dòng)態(tài)的方法:dumpdecrypted
1.下載dumpdecrypted(https://github.com/stefanesser/dumpdecrypted),解壓之后,執(zhí)行在當(dāng)前目錄下終端執(zhí)行 make
2.得到一個(gè)dumpdecrypted.dylib文件涯捻,拷貝到手機(jī):
scp -P 2222 dumpdecrypted.dylib root@localhost:~/
3.依附到某個(gè)進(jìn)程插入動(dòng)態(tài)庫dumpdecrypted.dylib浅妆,
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib 進(jìn)程的路徑(ps -A 可以查看進(jìn)程路徑)
4.到當(dāng)前目錄下得到 xxx.decrypted的新文件
-
dumpdecrypted砸殼出現(xiàn)的問題一:
解決方案:
## 列出可簽名證書
security find-identity -v -p codesigning
## 為dumpecrypted.dylib簽名
codesign --force --verify --verbose --sign "iPhone Developer: xxx xxxx (xxxxxxxxxx)" dumpdecrypted.dylib
然后重新上傳dumpdecrypted.dylib到手機(jī),再重新砸殼
-
寫插件
- 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
- 創(chuàng)建插件過程:
1.在Mac 桌面上創(chuàng)建一個(gè) theosdemo 文件目錄障癌,在此目錄下進(jìn)入終端
-
2.輸入 nic.pl
-
3.輸入11凌外,選擇創(chuàng)建 tweak,并依此輸入Project Name涛浙、Package Name康辑、uthor/Maintainer Name、MobileSubstrate Bundle filter等信息轿亮,最后得到文件wechatpwdtweak(Package Name工程名是自己定義的)
-
4.修改工程下的內(nèi)容
-
5.修改完之后就在終端下執(zhí)行:make 疮薇;編譯一下
-
6.在執(zhí)行打包指令:make package
7.make install:安裝插件到手機(jī),就完成了
關(guān)于Theos的坑!!!!
1.不要在中文目錄下編譯工程.否則報(bào)錯(cuò)!
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.電腦拷貝到手機(jī)
scp -P 2222 xxx root@localhost:~/
2.手機(jī)拷貝到電腦
scp -P 2222 root@localhost:~/xxx ~/Desktop
查看執(zhí)行文件架構(gòu)
file xxx
- 越獄手機(jī)之后添加源和插件
-
添加源
- PP助手源:http://apt.25pp.com
- 威鋒源:http://apt.so
-
安裝插件
- Apple File Conduit "2" 插件:可以在 mac 獲取 root 權(quán)限目錄
- AppSync Unified 插件:可以繞過一些驗(yàn)證(簽名機(jī)制),手機(jī)越獄之后的驗(yàn)證機(jī)制就被破壞了我注。
- OpenSSH 插件:主要作用通過 OpenSSH 能連接(登錄)手機(jī)按咒,能夠訪問手機(jī)的所有東西
- Cycript 插件
-
LLDB 調(diào)試
Xcode: LLDB
手機(jī): APP、debugserver
LLDB->debugserver->APP
cd /Developer/usr/bin
- debugserver 連接 APP
- debugserver *:端口號(hào) -a 進(jìn)程
- *:端口號(hào)但骨。使用手機(jī)的某個(gè)端口提供服務(wù)
- -a 進(jìn)程:連接的 APP(進(jìn)程 ID,進(jìn)程名稱--MachO 文件名稱)
- debugserver *:端口號(hào) -a 進(jìn)程
./debugserver *:12346 -a WeChat
iOS 攻防策略
動(dòng)態(tài)庫能夠被加載励七,而且調(diào)用:
如果一個(gè)應(yīng)用的二進(jìn)制被修改了注定要重簽名!
dyld (應(yīng)用可執(zhí)行文件)調(diào)用:
插入到某個(gè)進(jìn)程:DYLD_INSERT_LIBRARIES
-
攻擊
- OC 方法:Method Swizzling
- 系統(tǒng) C 函數(shù):fishhook奔缠,系統(tǒng)庫函數(shù)是有符號(hào)的掠抬,綁定符號(hào)
- Tweak 寫插件的方式安裝在越獄手機(jī)上,通過DYLD_INSERT_LIBRARIES 方式注入動(dòng)態(tài)庫到 APP 中
- 攻克用 RESTRICT 段防護(hù)的 APP校哎,利用二進(jìn)制修改器破壞防護(hù)
- 攻克 ptrace:使用 fishhook
- 攻克 sysctl :使用 fishhook
-
防護(hù)
- 基本防護(hù), fishhook
- Tweak 使用 DYLD_INSERT_LIBRARIES 進(jìn)攻两波,就用 RESTRICT 段防護(hù):
- 在 target—》Build Settings-》Other Linker Flags添加 -Wl,sectcreate,__RESTRICT,__restrict,/dev/null
- Tweak 使用 DYLD_INSERT_LIBRARIES 進(jìn)攻两波,就用 RESTRICT 段防護(hù):
- 以防二進(jìn)制修改器破壞防護(hù),使用 dyld 源碼再進(jìn)行防護(hù)
- ptrace防護(hù)--反調(diào)試:拒絕進(jìn)程的附加
- 通過 framework 防護(hù)調(diào)試
- sysctl 檢測(cè)進(jìn)程是否被調(diào)試
- 代碼混淆闷哆,通過 .pch 文件
- 字符串加密
- 隱藏函數(shù)名稱
- 使用匯編進(jìn)行系統(tǒng)調(diào)用
- 重簽名防護(hù)
防護(hù)主要手段
1.重簽名防護(hù)腰奋;
2.ptrace 防護(hù)(用匯編)
3.反 hook 防護(hù)(動(dòng)態(tài)庫提前)
4.混淆關(guān)鍵代碼
ptrace (process trace 進(jìn)程跟蹤)
此函數(shù)提供了一個(gè)進(jìn)程監(jiān)聽控制另一個(gè)進(jìn)程,并且可以檢測(cè)被控制進(jìn)程的內(nèi)存和寄存器里面的數(shù)據(jù)阳准!它可以用來實(shí)現(xiàn)斷點(diǎn)調(diào)試和系統(tǒng)調(diào)用跟蹤氛堕,debugserver 就是用的它馏臭。
iOS 中沒有提供相關(guān)的頭野蝇。
sysctl 函數(shù):
//sysctl 防護(hù)
int name[4];//里面放字節(jié)碼讼稚,查詢信息
name[0] = CTL_KERN;//內(nèi)核查看
name[1] = KERN_PROC;//查詢進(jìn)程
name[2] = KERN_PROC_PID;//傳遞的參數(shù)是進(jìn)程的 ID(PID)
name[3] = getpid();//PID 的值
struct kinfo_proc info;//接受進(jìn)程查詢結(jié)果信息的結(jié)構(gòu)體
size_t info_size = sizeof(info);//結(jié)構(gòu)體的大小
int error = sysctl(name, sizeof(name)/sizeof(*name), &info, &info_size, 0, 0);
assert(error == 0);//0就是沒有錯(cuò)誤,其他就是錯(cuò)誤碼
return ((info.kp_proc.p_flag & P_TRACED) != 0);
閃退的可能是防護(hù)使用:
- exit();
- ptrace;