一.常識
- 查看設備輸出信息:xcode - window - devices and simulators - logs
- 修改文件權限 : chmod +x /usr/bin
- SSL:secure sockets layer,對數(shù)據(jù)在傳輸層進行加密.
- SSH:secure shell(安全外殼協(xié)議),遠程登錄使用,防止中間人攻擊.
- SSH依賴了SSL.
- 在同一架構中,每一條匯編指令都有與之對應的唯一的機器指令,所以匯編語言和機器語言可以互相推到.
- mach-o文件由三部分組成
1.header :文件類型 目標架構類型
2.Load commands : 描述文件在虛擬內(nèi)存中的邏輯結構绵咱、布局
3.Raw Segment Data : 正兒八經(jīng)的數(shù)據(jù)(Load commands描述的數(shù)據(jù)) - .o .a .dyld .dylib .dsym(崩潰日志相關) .framework等(共11種) 都是mach-o文件(可執(zhí)行文件),但是dyld本身可以加載其他三種mach-o文件(MH-execute,MH-dylib,MH-bundle)
- file 文件 : 可以查看某一個文件的具體信息
- otool : 查看mach-o文件具體信息
- abort();直接退出應用
二.cycript(動態(tài)調(diào)試app)
- 輸入 進入環(huán)境,control+d退出環(huán)境
- cycript -p neteasemusic 直接進入調(diào)試環(huán)境
- ps -A | grep "" 查看進程id
- 將a.cy添加到路徑
Device/usr/lib/cycript0.9
,然后@import a.cy即可使用a.cy內(nèi)部函數(shù) - UIApp 查看[UIApplication sharedApplication]
- ObjectiveC.classes 查看這個APP所有成員變量,使用哪個類
- *UIApp 查看某一個對象的成員變量
- choose(UIViewController) 查看所有的UIViewController相關類
- scp -P 10010 ~/Desktop/1.cy root@localhost:/usr/lib/cycript0.9/1.cy 拷貝本地文件到遠程服務器
- xcode/products里面的app格式文件是我們編譯好的程序,例如 we.app
- we.app 里面有圖片慎冤、視頻等資源和Mach-O(可執(zhí)行文件,二進制文件)文件.
- 把we.app放到自己新建的Payload文件夾,經(jīng)過壓縮改zip為ipa就是ipa文件了.
三.class-dump(導出app的頭文件)
釘釘虛擬打卡
- 使用class-dump可以導出所有的.h文件
- 下載釘釘ipa(從pp助手下載越獄版本的,要不然導出.h文件會失敗)
- class-dump -H DingTalkBreakJail -o ~/Desktop/classDump_DingTalk
四.Hopper Disassembler(反編譯app)
- 將mach-o文件反匯編為oc或swift偽代碼
- 將mach-o(最好也是越獄版)文件直接拖入Hopper中
五.加殼&脫殼
- 判斷是否加殼:
1.使用mach-o工具查看load-command/LC-Encryption_INFO/cryptid的值,0代表未加密,非0代表加密.
2.使用otool命令,otool -l XX | grep crypt - 脫殼:將未加密的可執(zhí)行文件還原出來(對應加殼)
1.使用Clutch,將Cluth放到usr/bin,Clutch -i查看,Clutch -d 5(數(shù)字)進行脫殼
chmod +x /usr/bin/Clutch : 沒有權限時使用該命令
2.使用dumpDecrypted
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/F2A26AA8-0737-4C7D-AB0B-9CAE638E8E82/DingTalk.app/DingTalk
六.theos(注入自己的代碼)
- theos用來注入自己的代碼
- 配置環(huán)境變量(用戶級別): ~/.bash_profile
- 運行nic.pl
- 記得配置Makefile
export THEOS_DEVICE_IP = 127.0.0.1
export THEOS_DEVICE_PORT = 10010 - make clean && make package && make install
- make package dubug=0 : 發(fā)布realease版本
- 想要加入自己的圖片等資源,需要在tewak文件夾里新建layout(相當于ifunbox的Device)文件夾
- theos_tweak原理:生成文件(dylib)動態(tài)庫和plist,然后使用cydia打包成deb,修改內(nèi)存中的內(nèi)容.
- 刪除自己的tweak庫:
1.通過cydia卸載
2.刪除Device/Library/MobileSubstrate/DynamicLibraries里面的dylib. -
logos語法
1.%c() 等同于NSClassFromString:()
2.%ctor{}加載自己寫的動態(tài)庫的時候調(diào)用
3.%dtor{}應用關閉時調(diào)用
4.%new 生成新的方法, 然后在@interface lyk @end里面生命一下,就可以用了.
5.%log 打印方法的信息
6.logify.pl
七.SpringBoard
- 系統(tǒng)的桌面
八.ldid(權限問題)
- 比如說,訪問其他的app沙河
- 查看mach-o的權限: idld -e 文件 > 文件.entitlements
- 可以把springBoard的權限放到自己寫的 mach-o
九.debugServer(調(diào)試app的工具)
- 使用ldid給debugServer增加權限,然后放到device/usr/bin目錄下.
- debugserver *:10011 -a WeChat 附加debugserver到WeChat上.
- process connect connect://localhost:10011 lldb連接到debugserver
十一.ALSR(防止別人訪問你的函數(shù)、變量地址)
- ALSR : Address Space Lyaout Randomization -->地址空間布局隨機化
- __PAGEZERO,占據(jù)0x 0000 0000個字段,在虛擬內(nèi)存中.(非ARM64,占據(jù)0x4000)
- 函數(shù)放在__text段里面
- 全局變量放在__data段里面
- 函數(shù)和全局變量在編譯完成后,內(nèi)存地址就已經(jīng)固定死了.(參考catagory實現(xiàn))
局部變量是在函數(shù)棧里面.
通過alloc温艇、new等創(chuàng)建的變量是在堆空間. - image list -o -f : 找到ALSR的偏移量,計算函數(shù)真實地址.
只有把mach-o文件載入內(nèi)存的時候,ALSR才管用.所以使用ida應該減去偏移量
十二.匯編
寄存器
- 通用寄存器
64位架構,有29個通用寄存器. x0 - x28
32位架構,有29個通用寄存器. w0- w28(x0-x28的低32位) - pc寄存器
記錄cpu將要執(zhí)行的指令地址 - lr寄存器 x30
記錄bl執(zhí)行完,繼續(xù)執(zhí)行的地址
void main{
void test();
void next();
}
當進入test函數(shù)時,lr會記錄next()函數(shù)的地址,這樣在test() return的時候就可以找到 將要調(diào)用的函數(shù)了.
- ret 指令的本質(zhì) : 將lr的值 賦值給 pc
底層小知識
- sizeof() : 不是函數(shù)....
- cup結構
1.寄存器
2.運算器
3.控制器 - 三大總線:
地址總線:表明訪問的內(nèi)存地址
8086的地址總線寬度為20,每根線都有0和1兩種狀態(tài),所以它的尋址能力為2的20次方=1M,也就是說8086能使用的內(nèi)存最大為1M-----windowsXP的內(nèi)存最大為4G
控制總線:表明是讀還是寫
8086cpu的數(shù)據(jù)總線為8,每次傳2的8次方,也就是1個字節(jié)
數(shù)據(jù)總線:表明 讀或?qū)懙?數(shù)據(jù)
8086的數(shù)據(jù)總線寬度為16,每8bit為1個字節(jié),所以8086的內(nèi)存地址對應2個字節(jié)
我們平時做說的64位操作系統(tǒng),實際上就是說數(shù)據(jù)總線為64,就是說每個內(nèi)存地址能存8個字節(jié)
- 8086地址總線寬度為20,數(shù)據(jù)總線為16,那么16位不能存儲20位的數(shù)據(jù),所以需要用段地址和偏移地址兩個16位來合成20位
- 1word = 2byte = 16bits
- 大小端模式
小端模式:高字節(jié)放到高地址
大端模式:高字節(jié)放到低地址 - 內(nèi)存知識
1.數(shù)據(jù)段:存放全局變量,全局變量的地址在編譯的時候已經(jīng)確定.
2.代碼段:存放代碼
3.棧段:存放局部變量sp(棧頂寄存器)移動時,并不會刪除原來的數(shù)據(jù),直到有新的數(shù)據(jù)才會覆蓋
- 內(nèi)存的高地址存放系統(tǒng)數(shù)據(jù)(ROM-只讀-例如cpu信息等),低地址存放RAM(可讀可寫)
- 1.棧平衡: 函數(shù)調(diào)用前后的棧頂指針(sp)要一致,通過
add sp, 4
(給sp加4)回到棧頂
2.如果不回到棧頂,那么椔呖郑空間會被用完 - 1.函數(shù)的返回值一般放在x0(arm64)或者ax(win64)寄存器中
2.函數(shù)的參數(shù)(局部變量)放在棧(ss)里面,通過push和pop和add sp,4
維持堆棧平衡
3.遞歸崩潰是因為棧容納不了那么多的布局變量
4.函數(shù)分開調(diào)用
(參數(shù)入棧出椣裎牵快速完成)和函數(shù)內(nèi)繼續(xù)調(diào)函數(shù)
(函數(shù)的參數(shù)會一直入棧)是不一樣的.
十三.iOS簽名機制
- 編譯階段:
1.iOS創(chuàng)建證書的時候,用mac生成的request其實就是那臺mac電腦的公鑰.
2.生成request文件的那臺mac電腦的私鑰是用來簽名代碼,使用那臺mac電腦的私鑰將代碼進行簽名,保證代碼沒有被篡改. - 安裝階段:
1.apple的fir私鑰用來簽名mac的公鑰(CA機構的功能)------>cer文件
2.apple的sec私鑰用來簽名第一個簽名 + app id + devices + entitlement
------->mobileProvision.profile文件 - p12是干啥的
知道為啥你得要生成證書的那臺mac的p12文件了吧,因為p12就是apple用自己的私鑰對那臺mac的公鑰進行簽名的cer,給了別人以后,別人才能用apple的公鑰進行解密cer拿到那臺mac的公鑰,才能驗證那臺mac對代碼的簽名.
總結一下流程:
1.在官網(wǎng)創(chuàng)建appID
2.本地用鑰匙串生成request文件
其實就是拿到mac的公鑰
3.上傳request文件到apple官網(wǎng),得到cer文件(apple充當CA角色)
其實就是apple用自己的fir私鑰將**mac的公鑰**進行簽名
4.官網(wǎng)填寫device等信息,得到mobileProvision.profile文件
其實就是apple用自己的sec私鑰將**第一個簽名 + app id + devices **進行簽名
5.在xcode安裝好pp文件,編譯
其實就是 1.xcode用mac的私鑰對代碼進行簽名 2.用apple的sec公鑰驗證sec私鑰,如果一致就說明沒有被篡改,得到**第一個簽名 + app id + devices **,然后對比當前真機是否在devices列表里面或者appid是否一致 3.第二部沒有問題,就用apple的fir公鑰驗證第一個簽名(apple用自己的fir私鑰將**mac的公鑰**進行簽名),如果一致就能拿到mac的公鑰,然后用mac的公鑰驗證代碼是否被篡改
6.如果是在appstroe下載的app,那么只需要fir簽名就行了.(因為已經(jīng)過了蘋果的審核,所以不需要pp文件等....)
十四:重簽名
- 越獄手機已經(jīng)破解了系統(tǒng)權限,不需要驗證簽名,所以可以安裝任何macho文件(任何應用)
- 使用codeSign進行重簽名(
man codeSign 等價于 codeSign --help
)
1.將embedded.mobileprovision放進app包里面
2.查看證書idsecurity find-identity -v -p codesigning
3.從provision.profile文件里抽取entitlements文件
①:security cms -D -i embedded.mobileprovision > temp.plist
②/usr/libexec/PlistBuddy -x -c 'Print :Entitlements' temp.plist > entitlements.plist
③刪除temp.plist
3.codeSign -fs 證書id --entitlements entitlements.plist xxx.app
4.新建Payload文件夾,將app放進去壓縮,將Payload.zip修改為Payload.ipa.