
在上篇文章中,我們講了LLDB的常用指令,以及這些指令的作用,但是LLDB的功能遠遠不止這些,今天我們來看一下LLDB的高級功能吧。
今天的DEMO也比較簡單,可以在點擊這里下載到:Demo8_LLDB高級用法
接下來本文會從以下幾點進行闡述:
- ASLR簡介
- chise安裝&使用
- DerekSelander-LLDB
- Cycript安裝&簡單使用
- 腳本自動鏈接
- Cycript練習
- Cycript高級用法
- cy文件封裝
1. ASLR簡介
ASLR(Address space layout randomization)是一種針對緩沖區(qū)溢出的安全保護技術,通過對堆、棧、共享庫映射等線性區(qū)布局的隨機化,通過增加攻擊者預測目的地址的難度,防止攻擊者直接定位攻擊代碼位置,達到阻止溢出攻擊的目的。
大部分主流的操作系統(tǒng)已經(jīng)實現(xiàn)了ASLR。
| 平臺 | 描述 |
|---|---|
| Linux | Linux已在內核版本2.6.12中添加ASLR。 |
| Windows | Windows Server 2008,Windows 7,Windows Vista,Windows Server 2008 R2,默認情況下啟用ASLR,但它僅適用于動態(tài)鏈接庫和可執(zhí)行文件。 |
| Mac OS X | Apple在Mac OS X Leopard10.5(2007年十月發(fā)行)中某些庫導入了隨機地址偏移,但其實現(xiàn)并沒有提供ASLR所定義的完整保護能力。而Mac OS X Lion10.7則對所有的應用程序均提供了ASLR支持。Apple宣稱為應用程序改善了這項技術的支持,能讓32及64位的應用程序避開更多此類攻擊。從OS X Mountain Lion10.8開始,核心及核心擴充(kext)與zones在系統(tǒng)啟動時也會隨機配置。 |
| iOS(iPhone, iPod touch, iPad) | Apple在iOS4.3內導入了ASLR。 |
| Android | Android 4.0提供地址空間配置隨機加載(ASLR),以幫助保護系統(tǒng)和第三方應用程序免受由于內存管理問題的攻擊,在Android 4.1中加入地址無關代碼(position-independent code)的支持。 |
1.1 ASLR 案例
創(chuàng)建iOS項目,在 touchBegan:withEvent: 調用一個簡單的方法。
Build一下,將LLDBDemo的可執(zhí)行文件復制一份出來,使用Hopper查看,獲取到自己寫的方法的地址。
3.使用 breakpoint -a 0xxx 下一個地址斷點。
4.使用 MachOView 分析PageZero地址。
注意:image list的首地址和hopper中的地址,他們中間有一個偏移地址。因為image list 每次加載進內存都會默認加一個ASLR,所以我們得到一個數(shù)據(jù)的地址時要減去image list地址,這時可以通過MachO文件來查看數(shù)據(jù)。
macho中的地址+hopper中的函數(shù)地址就是當前的函數(shù)地址
定義一個全局變量,找到這個變量的地址,使用MachO對應的變量,找MachO中的偏移值。
2. chisel 安裝
1.github開源,可通過homebrew安裝
2.安裝完成添加一個路徑到 .lldbinit中
注意:chisel配置環(huán)境依據(jù)github上的方法來,否則環(huán)境錯誤將調用不了。
3. chisel 使用
1.chisel 本質 注意配置完chise需要重啟xcode或者在lldb命令中使用 command source ~/.lldbinit。
2.pviews / pview self.view / pview -u self 命令的使用。
3.pvc 查看控制器的層級結構。
4.presponder 控件地址 輸出這個按鈕的響應鏈條。
5.pactions 地址 得到當前按鈕的響應事件。
6.pclass 對象地址 得到對象的繼承關系。
7.fv/fvc 類名 查看視圖/查看控制器。
8.methods 類對象地址 找到當前類的方法,屬性,地址。
9.pinternals 類對象地址 查到當前對象的屬性,當前對象的屬性值。
10.fvc -v 對象地址 根據(jù)對像的地址找到對象的類型。
11.taplog 找到當前界面中響應的控件的對象、地址.
注意:taplog使用需要注意以下2點
1.界面控件是可響應的
2.這個命令會使當前的程序掛掉
- filcker 對象地址 將當前的控件閃爍顯示,快速找到某一個控件。
- vs 對象地址 動態(tài)的操作這個控件,進入到LLDB中,根據(jù)提示調試。
4. DerekSelander-LLDB 安裝
1.github 安裝 參照 chisel 安裝
2.search UIView 查找所有View
3.使用monkeyDev 調試
4.快速定位
4.1 通過內存地址下斷點
4.2 使用 search 類名 查到對象的地址
4.3 使用 methods 地址 找到對象的成員變量/方法
4.4 使用 b -a 地址 設置斷點
4.5 使用 bt 查看當前的調用棧,會發(fā)現(xiàn)當前的狀態(tài)是去符號的狀態(tài)
4.6 sbt 恢復當前函數(shù)的符號
使用方法參照github
5. Cycript-安裝
5.1 Cycript 簡介
Cycript是由Cydia創(chuàng)始人Saurik推出的一款腳本語言,Cycript混合了OC、JavaScript語法的解釋器,這意味著我們能夠在一個命令中使用Oc或者JavaScript,甚至兩者并用。它能夠掛鉤正在運行的進程,能夠在運行時修改很多東西。
5.2 Cycript 安裝
- 官網(wǎng): http://www.cycript.org/
- 下載后使用Cycript這個可執(zhí)行文件
- 為了方便,我們可以放在 /opt/cycript_0.9.594 (opt目錄有可選的意思)
- 為了方便使用,可以在~/.bash_profile中配置環(huán)境變量(執(zhí)行文件路徑)。
5.3 Cycript 簡單使用
1.首先鏈接手機
monkeyDev 使用,monkeydev 默認連接手機端口 6666
2.應用跑起來,打開終端,查看手機ip
3.ccycript -r xxx.xxx.xxx.xxx:6666
4.終端輸入UIWindow keyWindow()
5.[UIApplication shardAppliccation]
6.var keyWindow = UIWindow.keyWindow()
7.keyWindow
8.keyWindow.rootViewController
9.#內存地址 拿到這個對象
10.*#內存地址 拿到某個對象的所有成員變量
11.也可以使用上面的 keyWindow
12.[i for(i in *keyWindow)] // 拿到keyWindow的所有成員變量,只拿key
13.keyWindow.reccursiveDescription // 拿到視圖的層級關系,會發(fā)現(xiàn)拿到的都是亂碼
14.keyWindow.reccursiveDescription.toString() // 格式化輸出
15.choose[UIButton] // 獲取Button類型的控件 不知是全項目中的還是當前文件中的,這個要測試
16.使用 control+D 退出,然后重新連接,之前的keyWindow 還是在的。(因為當前的進程還是在的,如果把當前的進程刪掉就沒有了)
- 腳本自動連接
- 將所有的腳本放在一個文件夾中,給腳本可執(zhí)行權限,并在.base_podfile中添加相應的路徑
5.4 Cycript 簡單使用案例 這里要修改VX相關的內容,由于沒有多余的VX號,這里就做個簡單的記錄。
1.進入cycript環(huán)境
2.修改當前界面的狀態(tài)欄
[UIApp setStatusBarHidden:YES]; // 隱藏狀態(tài)欄
[UIApp setStatusBarHidden:NO]; // 顯示狀態(tài)欄
[UIApp setApplicationIconBadgeNumber:9999]; // 修改消息條數(shù)
3.修改轉賬金額數(shù)據(jù)
chose[UILabel] // 查找UILabel
搜索剛才的 0.01 的文本
拿到對象使用 #對象.text = "¥xxx" // 注意,當這個界面消失的時候,這個對象就沒有了,所以界面也沒有了
5.5 cycript 高級用法
1.cycript 內置的對象 ObjectiveC.classes // 列舉當前項目中的所有的類
2.APPID 獲取當前的 Build id
3.pviews() // 獲取項目中的Views
4.pvcs() // 獲取控制器
5.調試某一個按鈕
LLDB 找到某一個按鈕,獲取按鈕的類型
使用 choose(AttachmentButton)
pactions(#地址) // 給個對象,輸出它的Actions
rp(#對象地址) // 獲取這個對象的響應鏈條
6.monkeyDev Config 中的URL ,通過瀏覽器打開,會發(fā)現(xiàn)一個*.cy文件
1.自己創(chuàng)建 *.cy文件,創(chuàng)建空類型的文件,文件依賴當前的工程
2.文件類型改成JavaScript或者oc、C++語法,重啟Xcode才會有語法高亮
3.在cy環(huán)境下測試函數(shù),輸入以下代碼
sum = function(a,b){return a+b;}
sub(10,20)
4.在cy文件中添加上述代碼,并導入到app中,TARGETS -> 項目 -> Build Phases -> Copy Files 中添加 test.cy 文件
5.在cy環(huán)境下 @inport test 文件,否則找不到文件
6.接下來我們就可以在我們的文件中添加自己需要的代碼了
注意:我們在文件中添加的變量要用函數(shù)的方法獲得,否則變量會在執(zhí)行第一次之后就固定了。
7.js 匿名函數(shù)自執(zhí)行表達式
( function(export(參數(shù))){
code ...
// 代碼自動執(zhí)行
// 變量后需要用逗號隔開
})(export)
如有問題歡迎下方留言評論