iOS 逆向開發的點點滴滴

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 符號表
  1. 使用此腳本 ida_search_block.py,在 ida 中執行


  1. 生成block_symbol.json文件


  1. 在終端控制臺輸入命令生成 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


  • 越獄手機之后添加源和插件
    • 添加源

    • 安裝插件

      • 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 *:12346 -a WeChat


iOS 攻防策略

動態庫能夠被加載,而且調用:
如果一個應用的二進制被修改了注定要重簽名!
dyld (應用可執行文件)調用:
插入到某個進程:DYLD_INSERT_LIBRARIES

  • 攻擊
      1. OC 方法:Method Swizzling
      1. 系統 C 函數:fishhook,系統庫函數是有符號的,綁定符號
      1. Tweak 寫插件的方式安裝在越獄手機上,通過DYLD_INSERT_LIBRARIES 方式注入動態庫到 APP 中
      1. 攻克用 RESTRICT 段防護的 APP,利用二進制修改器破壞防護
      1. 攻克 ptrace:使用 fishhook
      1. 攻克 sysctl :使用 fishhook
  • 防護
      1. 基本防護, fishhook
      1. Tweak 使用 DYLD_INSERT_LIBRARIES 進攻,就用 RESTRICT 段防護:
        • 在 target—》Build Settings-》Other Linker Flags添加 -Wl,sectcreate,__RESTRICT,__restrict,/dev/null
      1. 以防二進制修改器破壞防護,使用 dyld 源碼再進行防護
      1. ptrace防護--反調試:拒絕進程的附加
      1. 通過 framework 防護調試
      1. sysctl 檢測進程是否被調試
      1. 代碼混淆,通過 .pch 文件
      1. 字符串加密
      1. 隱藏函數名稱
      1. 使用匯編進行系統調用
      1. 重簽名防護

防護主要手段
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);


閃退的可能是防護使用:

  1. exit();
  2. ptrace;
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。