iOS 逆向開發(fā)的點(diǎn)點(diǎn)滴滴

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)表
  1. 使用此腳本 ida_search_block.py志鞍,在 ida 中執(zhí)行


  1. 生成block_symbol.json文件


  1. 在終端控制臺(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)程退出之后就失效


WX20180607-113016@2x.png
  • 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ī)之后添加源和插件
    • 添加源

    • 安裝插件

      • 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 *: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

  • 攻擊
      1. OC 方法:Method Swizzling
      1. 系統(tǒng) C 函數(shù):fishhook奔缠,系統(tǒng)庫函數(shù)是有符號(hào)的掠抬,綁定符號(hào)
      1. Tweak 寫插件的方式安裝在越獄手機(jī)上,通過DYLD_INSERT_LIBRARIES 方式注入動(dòng)態(tài)庫到 APP 中
      1. 攻克用 RESTRICT 段防護(hù)的 APP校哎,利用二進(jìn)制修改器破壞防護(hù)
      1. 攻克 ptrace:使用 fishhook
      1. 攻克 sysctl :使用 fishhook
  • 防護(hù)
      1. 基本防護(hù), fishhook
      1. Tweak 使用 DYLD_INSERT_LIBRARIES 進(jìn)攻两波,就用 RESTRICT 段防護(hù):
        • 在 target—》Build Settings-》Other Linker Flags添加 -Wl,sectcreate,__RESTRICT,__restrict,/dev/null
      1. 以防二進(jìn)制修改器破壞防護(hù),使用 dyld 源碼再進(jìn)行防護(hù)
      1. ptrace防護(hù)--反調(diào)試:拒絕進(jìn)程的附加
      1. 通過 framework 防護(hù)調(diào)試
      1. sysctl 檢測(cè)進(jìn)程是否被調(diào)試
      1. 代碼混淆闷哆,通過 .pch 文件
      1. 字符串加密
      1. 隱藏函數(shù)名稱
      1. 使用匯編進(jìn)行系統(tǒng)調(diào)用
      1. 重簽名防護(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ù)使用:

  1. exit();
  2. ptrace;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绕沈,一起剝皮案震驚了整個(gè)濱河市锐想,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乍狐,老刑警劉巖赠摇,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異浅蚪,居然都是意外死亡藕帜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門惜傲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來洽故,“玉大人,你說我怎么就攤上這事盗誊∈鄙酰” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵哈踱,是天一觀的道長(zhǎng)荒适。 經(jīng)常有香客問我,道長(zhǎng)开镣,這世上最難降的妖魔是什么刀诬? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮邪财,結(jié)果婚禮上舅列,老公的妹妹穿的比我還像新娘。我一直安慰自己卧蜓,他們只是感情好帐要,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著弥奸,像睡著了一般榨惠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盛霎,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天赠橙,我揣著相機(jī)與錄音,去河邊找鬼愤炸。 笑死期揪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的规个。 我是一名探鬼主播凤薛,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼姓建,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了缤苫?” 一聲冷哼從身側(cè)響起速兔,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎活玲,沒想到半個(gè)月后涣狗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡舒憾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年镀钓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镀迂。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡掸宛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出招拙,到底是詐尸還是另有隱情唧瘾,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布别凤,位于F島的核電站饰序,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏规哪。R本人自食惡果不足惜求豫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诉稍。 院中可真熱鬧蝠嘉,春花似錦、人聲如沸杯巨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽服爷。三九已至杜恰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間仍源,已是汗流浹背心褐。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留笼踩,地道東北人逗爹。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像嚎于,于是被迫代替她去往敵國(guó)和親掘而。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挟冠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345