iOS-逆向總結

一.常識

  • 查看設備輸出信息: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 拷貝本地文件到遠程服務器
    1. xcode/products里面的app格式文件是我們編譯好的程序,例如 we.app
    2. we.app 里面有圖片慎冤、視頻等資源和Mach-O(可執(zhí)行文件,二進制文件)文件.
    3. 把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.查看證書id security 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.
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市梢莽,隨后出現(xiàn)的幾起案子萧豆,更是在濱河造成了極大的恐慌昏名,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阵面,死亡現(xiàn)場離奇詭異轻局,居然都是意外死亡置鼻,警方通過查閱死者的電腦和手機钙勃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門希太,熙熙樓的掌柜王于貴愁眉苦臉地迎上來克饶,“玉大人,你說我怎么就攤上這事誊辉》龋” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵芥映,是天一觀的道長洲尊。 經(jīng)常有香客問我远豺,道長,這世上最難降的妖魔是什么坞嘀? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任躯护,我火速辦了婚禮,結果婚禮上丽涩,老公的妹妹穿的比我還像新娘棺滞。我一直安慰自己,他們只是感情好矢渊,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布继准。 她就那樣靜靜地躺著,像睡著了一般矮男。 火紅的嫁衣襯著肌膚如雪移必。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天毡鉴,我揣著相機與錄音崔泵,去河邊找鬼。 笑死猪瞬,一個胖子當著我的面吹牛憎瘸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播陈瘦,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼幌甘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了痊项?” 一聲冷哼從身側響起锅风,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎线婚,沒想到半個月后遏弱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡塞弊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年漱逸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片游沿。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡饰抒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出诀黍,到底是詐尸還是另有隱情袋坑,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布眯勾,位于F島的核電站枣宫,受9級特大地震影響婆誓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜也颤,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一洋幻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧翅娶,春花似錦文留、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蜕提,卻和暖如春森书,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贯溅。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工拄氯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人它浅。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像镣煮,于是被迫代替她去往敵國和親姐霍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 還是喉嚨痛 懶惰亡國 吃了新加坡菜典唇,秀芳姐生日镊折。叻沙味道不錯,是我喜歡的樣子介衔。吃了草莓恨胚。可頌坊抽到了5元的抵用券炎咖。...
    我是胡蘿卜閱讀 254評論 0 0
  • 陵陽縣位于大齊西南邊境赃泡,與燕國百水郡接壤,三年前燕齊交戰(zhàn)乘盼,燕軍所到之處大肆殺戮升熊,陵陽縣的老百姓死的死逃的逃,大部分...
    小王同學Y閱讀 826評論 4 16
  • 1.今天在火車上跟伙伴們聽yy分享绸栅,自身產(chǎn)品效果的重要性级野,必須快速達到三極致!才有勇氣要求別人粹胯!有了產(chǎn)品效果才能出...
    甄程很自律閱讀 231評論 0 0
  • 4. 魚丸心里的“他們”有很多人蓖柔,是那些活在傳說中的“別人家的孩子”辰企,目前是洛川,最初是常勝利况鸣。 出乎所有人意料蟆豫,...
    葉臻2019閱讀 340評論 0 0
  • 這船看起來有些年頭了,豆豆坐在船上仔細地打量著懒闷,厚厚的青苔遮住了木頭原有的紋理十减,船上居然還有幾條蹦蹦跳跳的銀魚和...
    浮槎來去不相逢閱讀 152評論 0 0