iOS逆向研究001

[TOC]

==iOS逆向環(huán)境介紹==

*** 越獄環(huán)境:iphone5s iOS 8.3***

luz-iphone:~ root# uname -a
Darwin luz-iphone 14.0.0 Darwin Kernel Version 14.0.0: Sun Mar 29 19:47:37 PDT 2015; root:xnu-2784.20.34~2/RELEASE_ARM64_S5L8960X iPhone6,2 arm64 N53AP Darwin
1.Drawin體系
  • Darwin是一種類似unix的操作系統(tǒng)琳轿,他的核心XNU逗柴,XNU是一種混合式內(nèi)核,結(jié)合了mach與BSD兩種內(nèi)核

    • 主流的類unix:
      • Linux 由Linus Torvalds研發(fā)的券膀,代表發(fā)行版本CenOS辟躏,Redhat谷扣,Ubuntu,Debian捎琐,openWRT等

      • Mac OS X的Intel部分

      • freeBSD 由加州大學(xué)伯克利分谢嵯眩基于UNIX研發(fā)的(UNIX變種,當(dāng)時如果不是與貝爾實驗室打官司瑞凑,可能就不會有現(xiàn)在的Linux什么事)

      • Solaris 由Sun(現(xiàn)為Oracel)開發(fā)的UNIX商業(yè)版本

  • BSD 實現(xiàn)在Mach的上層在塔,這一層提供的API 支持了POSIX標(biāo)準(zhǔn)模型。在XNU中主要實現(xiàn)了一些高級的API與模塊

  • UNIX 進(jìn)程模型
    == e.g fork拨黔,vfork,wait绰沥,waitpid篱蝇,exec等 ==

  • POSIX 線程模型即pthread,以及相關(guān)的同步功能
    == e.g pthread_create徽曲,pthread_mutex(線程互斥鎖)==

  • UNIX的用戶與組管理
    ==e.g root用戶零截,mobile用戶,chmod等==

  • 網(wǎng)絡(luò)協(xié)議棧(BSD Socket API),符合POSIX 模型
    == e.g socket()秃臣;bind()涧衙; listen()哪工;accept();connect()弧哎; gethostbyname()雁比; gethostbyaddr()等伯克利套接字API==

  • 文件系統(tǒng)/設(shè)備系統(tǒng)
    == e.g Filesystem Hierarchy Standard(文件系統(tǒng)層次化標(biāo)準(zhǔn))==

  • iOS,OSI撤嫩,ISO的含義

    • iOS 蘋果公司開發(fā)的移動操作系統(tǒng)

    • OSI 是Open System Interconnection的縮寫偎捎,意為開放式系統(tǒng)互聯(lián)。OSI模型把網(wǎng)絡(luò)通信的工作分為7層序攘,分別是物理層茴她、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層程奠、傳輸層丈牢、會話層、表示層和應(yīng)用層瞄沙。

    • IOS是國際標(biāo)準(zhǔn)化組織己沛。上面的OSI模型由該組織制定。一般類UNIX系統(tǒng)都基本符合POSIX標(biāo)準(zhǔn)和IOS C標(biāo)準(zhǔn)

      • POSIX表示可移植操作系統(tǒng)接口(Portable Operating System Interface)

      • IOS C標(biāo)準(zhǔn)帕识,C語言標(biāo)準(zhǔn)庫接口

  • 為什么越獄

  • 突破iOS沙盒機(jī)制的限制(sandbox)
    == 沙盒是一種安全機(jī)制泛粹,為運行中的程序提供隔離環(huán)境。沙盒在啟動的時候可以設(shè)置運行的程序是否可以訪問網(wǎng)絡(luò)肮疗、文件晶姊、目錄等==


    這里寫圖片描述
2.Cydia - 越獄iOS的軟件管理平臺 (Cydia 之父 - Jay Freeman(杰 弗里曼))
  • 越獄iOS是合法的

  • 安裝OpenSSH
    == 在Cydia中搜索OpenSSH并安裝,這樣iOS上面就可以開啟SSH服務(wù)伪货。SSH服務(wù)默認(rèn)綁定端口號22 ==

    • 使用SSH命令連接iOS们衙,默認(rèn)登錄密碼"alpine"
     ssh root@xx.xx.xx.xx       //iOS連接wifi,設(shè)置中可以看到ip地址碱呼,也可以改成靜態(tài)IP地址
  • 使用scp命令可以傳輸文件
  scp  filename  root@xx.xx.xx.xx:/tmp                 //拷貝本地文件到遠(yuǎn)端
  
  scp root@xx.xx.xx.xx:/tmp/filename  /tmp/         //從遠(yuǎn)端拷貝文件到本地
  • 修改默認(rèn)密碼
  passwd root
  
 passwd mobile
  • 安裝軟件包管理工具apt-get
    == 在Cydia中搜索 APT 0.6 Transitional并安裝 ==

    • 命令介紹
         apt-get update                    【更新所有的源】
      
         apt-get upgrade                 【更新所有通過apt-get安裝的程序】
      
         apt-get install  packagename         【安裝軟件包】
      
         apt-get remove  packagename      【刪除軟件包蒙挑,不刪除依賴包,不刪除配置文件】
      
         apt-get remove --purge packagename  【刪除該軟件包愚臀,不刪除依賴包忆蚀,刪除配置文件】
      
         apt-get autoremove packagename       [刪除該軟件包,刪除依賴包姑裂,不刪除配置文件]
      
         apt-get autoremove --purge packagname    【可以刪除所有依賴包+配置文件】
      
         apt-cache search string             【搜索含有該string字段的軟件包】
      
         apt-cache show packagename     【詳細(xì)顯示該軟件包的信息】
      
         apt-get clean                   【清除apt-get安裝的軟件包備份馋袜,可以釋放儲存空間,不影響軟件正常使用】
      
  • 使用apt-get 安裝軟件包
    == e.g 安裝traceroute ==

        apt-get install traceroute  //發(fā)現(xiàn)找不到軟件包
        
        //如果不知道軟件包名稱舶斧,也可以用關(guān)鍵字搜索
        apt-cache search traceroute
        
        apt-get install  network-cmds
    
  • 安裝必要工具

        apt-get install  ping
        
        apt-get install  ps
        
        apt-get install  find
        
        apt-get install tcpdump
        
        apt-get install top
        
        apt-get install vim
        
        apt-get install  network-cmds   //-arp, ifconfig, netstat, route, traceroute
    
  • 工具的使用

    ping www.baidu.com -c 4 -s 600  //發(fā)送icmp報文欣鳖,檢查網(wǎng)絡(luò)狀況

    ps aux                          //查看進(jìn)程信息
    ps -e                           

    find / -name ping       //在根目錄開始查找文件名為ping的文件

    grep -r 'hello*' /tmp   //在/tmp目錄中查找包含'hello'字符的文件,-r表示包含子目錄

    top
    top -l 1 | head -n 10 | grep PhysMem  //顯示系統(tǒng)內(nèi)存使用情況
    
    tcpdump -i en0 src host 192.168.1.137
    tcpdump -i en0 dst host 192.168.1.137
    tcpdump -w /tmp/ssh.cap -i en0 tcp port 22 and dst host 192.168.1.137
    tcpdump -w /tmp/ssh.cap -i en0 -t -s 0 -c 100 tcp port ! 22 and dst host 192.168.1.137
      解釋:
     (1)-w /tmp/ssh.cap : 保存成cap文件,方便用ethereal(即wireshark)分析
     (2)-i en0 : 只抓經(jīng)過接口en0的包
     (3)-t : 不顯示時間戳
     (4)-s 0 : 抓取數(shù)據(jù)包時默認(rèn)抓取長度為68字節(jié)茴厉。加上-S 0 后可以抓到完整的數(shù)據(jù)包
     (5)-c 100 : 只抓取100個數(shù)據(jù)包
     (6) tcp port ! 22  : 不抓tcp端口22的數(shù)據(jù)包
     (7) dst port ! 22 : 不抓取目標(biāo)端口是22的數(shù)據(jù)包
     (8)dst host 192.168.1.137 : 抓取目標(biāo)地址為192.168.1.137的包
     (9)src net 192.168.1.0/24 : 數(shù)據(jù)包的源網(wǎng)絡(luò)地址為192.168.1.0/24
3.iOS文件系統(tǒng)結(jié)構(gòu)
  • 可視化方式吃筇ǎ看iOS系統(tǒng)文件
    ==在iOS通過Cydia安裝Apple File Conduit 2什荣,在OS X使用iFunBox可以查看iOS系統(tǒng)文件(iOS和OS X需要在通一個局域網(wǎng)內(nèi))==

  • 通過SSH遠(yuǎn)程登錄iOS來查看

  • Filesystem Hierarchy Standard 文件系統(tǒng)層次化標(biāo)準(zhǔn)(以下簡稱FHS)
    ==FHS為類UNIX操作系統(tǒng)的文件目錄結(jié)構(gòu)制定了一套標(biāo)準(zhǔn),目的是讓用戶預(yù)知文件或目錄的存放位置怀酷。UNIX操作系統(tǒng)的常見目錄結(jié)構(gòu)如下所示稻爬。==

       /:根目錄,以斜杠表示胰坟,其他所有文件和目錄在根目錄下展開因篇。
    
       /bin:"binary"的簡寫,存放提供用戶級基礎(chǔ)功能的二進(jìn)制文件笔横,如ls竞滓、ps等。
    
       /boot:存放能使系統(tǒng)成功啟動的所有文件吹缔。iOS中此目錄為空商佑。
    
       /dev:"device"的簡寫,存放BSD設(shè)備文件厢塘。每個文件代表系統(tǒng)的一個塊設(shè)備或字符設(shè)備茶没,一般來說,“塊設(shè)備”以塊為單位傳輸數(shù)據(jù)晚碾,如硬盤抓半;而“字符設(shè)備”以字符為單位傳輸數(shù)據(jù),如調(diào)制解調(diào)器格嘁。
    
       /sbin:"system binaries"的簡寫笛求,存放提供系統(tǒng)級基礎(chǔ)功能的二進(jìn)制文件,如netstat糕簿、reboot等探入。
    
       /etc:"Et Cetera"的簡寫,存放系統(tǒng)腳本及配置文件懂诗,如passwd蜂嗽、hosts等。在iOS中殃恒,/etc是一個符號鏈接植旧,實際指向/private/etc。
    
       /lib:存放系統(tǒng)庫文件离唐、內(nèi)核模塊及設(shè)備驅(qū)動等隆嗅。iOS中此目錄為空。
    
       /mnt:"mount"的簡寫侯繁,存放臨時的文件系統(tǒng)掛載點。iOS中此目錄為空泡躯。
    
       /private:存放兩個目錄贮竟,分別是/private/etc和/private/var丽焊。
    
       /tmp:臨時目錄。在iOS中咕别,/tmp是一個符號鏈接技健,實際指向/private/var/tmp。
    
       /usr:包含了大多數(shù)用戶工具和程序惰拱。/usr/bin包含那些/bin和/sbin中未出現(xiàn)的基礎(chǔ)功能雌贱,如nm、killall等偿短;/usr/include包含所有的標(biāo)準(zhǔn)C頭文件欣孤;/usr/lib存放庫文件。
    
      /var:"variable"的簡寫昔逗,存放一些經(jīng)常更改的文件降传,比如日志、用戶數(shù)據(jù)勾怒、臨時文件等婆排。其中/var/mobile和/var/root分別存放了mobile用戶和root用戶的文件,是重點關(guān)注的目錄笔链。
    
  • UNIX系統(tǒng)文件權(quán)限簡介(UNIX一切皆文件:讀寫普通文件段只、目錄、設(shè)備鉴扫、socket赞枕、管道、CPU信息幔妨、進(jìn)程信息等)
  • 系統(tǒng)用3位(bit)來表示文件的權(quán)限鹦赎,從高位到低位分別是r(read)權(quán)限、w(write)權(quán)限误堡,以及x(execute)權(quán)限古话。文件與用戶的關(guān)系存在以下三種可能性:
  • 此用戶是屬主用戶(文件所有者的權(quán)限)
  • 此用戶不是屬主用戶,但在屬主組里(組用戶權(quán)限)
  • 此用戶既不是屬主用戶锁施,又不在屬主組里(Other用戶權(quán)限)
```
1111 1111  = 2^0*1 + 2^1*1 + 2^2*1 + 2^3*1 + ...+2^7*1 = 2^8 - 1 

8421
1111  = 8+4+2+1 = 15
1011  = 8+2+1 = 11

rwx      r-x    r--
111      101    100 
所有者   屬組   其他

用3*3位來表示一個文件的權(quán)限陪踩,如果某一位為1,則這一位代表的權(quán)限生效悉抵,否則無效肩狂。例如,111101101代表rwxr-xr-x姥饰,即該文件的屬主用戶擁有r傻谁、w、x權(quán)限列粪,而屬主組和其他所有人只具有r和x權(quán)限审磁;同時谈飒,二進(jìn)制的111101101轉(zhuǎn)換成十六進(jìn)制是755,也是一種常見的權(quán)限表示法态蒂。

可以使用chmod 命令修改文件權(quán)限杭措,如 chmod  755  filename

* iOS的獨有目錄
  ```
      /Applications:存放所有的系統(tǒng)App和來自于Cydia的App,但不包括StoreApp钾恢。

      /Developer:如果一臺設(shè)備連接Xcode后被指定為調(diào)試用機(jī)手素,Xcode就會在iOS中生成這個目錄,其中會含有一些調(diào)試需要的工具和數(shù)據(jù)瘩蚪。

      /Library:存放一些提供系統(tǒng)支持的數(shù)據(jù)泉懦。其中/Library/MobileSubstrate下存放了所有基于CydiaSubstrate(原名MobileSubstrate)的插件(如:tweak編寫的插件)。

      /System/Library:iOS文件系統(tǒng)中最重要的目錄之一募舟,存放大量系統(tǒng)組件祠斧。

      /System/Library/Frameworks和/System/Library/PrivateFrameworks:存放iOS中的各種framework

      /System/Library/CoreServices里的SpringBoard.app:iOS桌面管理器(類似于Windows里的explorer),是用戶與系統(tǒng)交流的最重要中介拱礁。

      /User:用戶目錄(其實就是mobile用戶的home目錄)琢锋,實際指向/var/mobile,這個目錄里存放大量用戶數(shù)據(jù)呢灶,比如:

      /var/mobile/Media/DCIM下存放照片吴超;

      /var/mobile/Media/Recordings下存放錄音文件;

      /var/mobile/Library/SMS下存放短信數(shù)據(jù)庫鸯乃;

      /var/mobile/Library/Mail下存放郵件數(shù)據(jù)鲸阻。
      
      /var/mobile/Containers,存放StoreApp缨睡。值得注意的是鸟悴,App的可執(zhí)行文件在bundle與App中的數(shù)據(jù)目錄被分別存放在/var/mobile/Containers/Bundle和/var/mobile/Containers/Data這兩個不同目錄下。其中/var/mobile/Containers/Data是我們常用的應(yīng)用沙盒目錄的起始目錄:NSString *directory = NSHomeDirectory(); //獲取沙盒根目錄

  ```


* iOS應(yīng)用(Store App)沙盒目錄:
- Application Bundle  包含應(yīng)用可執(zhí)行文件和資源文件

如獲取iOS上微信程序的Bundle路徑奖年,可以通過ps -e | grep appname
luz-iphone:/ root# ps -e | grep WeChat
1368 ?? 5:41.43 /var/mobile/Containers/Bundle/Application/749DC69A-3A8D-4B5C-9926-1220E69FC85F/WeChat.app/WeChat

 - Application Data  包含App運行生產(chǎn)的數(shù)據(jù)和配置信息等
    ```
    如獲取iOS上微信程序的Date路徑细诸,可以通過cycript工具
    luz-iphone:~ root# cycript -p WeChat
    cy# directory = NSHomeDirectory()
    @"/var/mobile/Containers/Data/Application/986376B5-EF08-4CAF-81FB-CAE48D1FE4AE"
    cy# 
Date目錄結(jié)構(gòu)如下:
```
luz-iphone:/var/mobile/Containers/Data/Application/986376B5-EF08-4CAF-81FB-CAE48D1FE4AE root# ls
Documents/  Library/  tmp/
```
  • Document 存放應(yīng)用運行時生成的并且需要保存的數(shù)據(jù)。注:iTunes或iCloud同步設(shè)備時會備份該目錄

  • Library/Caches 存放應(yīng)用運行時生成的并且需要保存的數(shù)據(jù)陋守。iTunes或iCloud不同步震贵。

  • Library/Preferences 存放偏好設(shè)置。iOS的偏好設(shè)置(settings)應(yīng)用也會在該目錄查找應(yīng)用的設(shè)置信息水评。NSUserDefaults保存在該目錄下猩系。iTunes或iCloud同步設(shè)備時備份該目錄。

  • tmp 存放應(yīng)用運行時所需的臨時數(shù)據(jù)中燥。當(dāng)某個應(yīng)用沒運行時寇甸,iOS系統(tǒng)可能會清除該目錄下的文件。但不可依賴這種自動清除機(jī)制,應(yīng)該及時手動清除幽纷。

4.Cycript工具介紹(作者:saurik式塌,官網(wǎng):http://www.cycript.org/
  • Cycript是一款腳本語言,可以看作是Objective-JavaScript友浸,它可以幫助我們輕松測試和驗證函數(shù)效果。

    • 在越獄手機(jī)中可以通過注入方式在第三方應(yīng)用中運行

    • 也可以用靜態(tài)庫的方式把cycript集成到自己的應(yīng)用(MonkeyDev偏窝,可以給非越獄iOS第三方App寫插件收恢,但是權(quán)限受沙盒限制)

  • 在越獄手機(jī)中安裝Cycript

    • 在Cydia上搜索Cycript進(jìn)行安裝

    • apt-get install cycript

  • Cycript使用(注入到第三方進(jìn)程空間)

    • 注入Cycript模塊到第三方進(jìn)程
     //確認(rèn)進(jìn)程名或者進(jìn)程PID
     luz-iphone:/ root# ps -e | grep WeChat 
    

1368 ?? 6:17.44 /var/mobile/Containers/Bundle/Application/749DC69A-3A8D-4B5C-9926-1220E69FC85F/WeChat.app/WeChat

//打開方式1
luz-iphone:/ root# cycript -p WeChat
cy#

//打開方式2
luz-iphone:/ root# cycript -p 1368
cy#


- 退出cycript
 **Control+D**

- 實戰(zhàn)演練
  
//WeChat  cycript -p WeChat
[[UIApplication sharedApplication] setStatusBarHidden:YES]   //隱藏狀態(tài)欄
[[UIApplication sharedApplication] setStatusBarHidden:NO]    //顯示狀態(tài)欄

[[[UIAlertView alloc]initWithTitle:@"Tanzhou" message:@"Hello luz" delegate:ni cancelButtonTitle:@"ok" otherButtonTitles:nil, nil] show]            //彈框

[[UIApplication sharedApplication] setApplicationIconBadgeNumber:1000]   //設(shè)置badge數(shù)字 
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:1]
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0]
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0]

//SpringBroad cycript -p SpringBroad
[[SBScreenShotter sharedInstance] saveScreenshot:YES]   截屏,閃光
[[SBScreenShotter sharedInstance] saveScreenshot:NO]   截屏祭往,不閃光
[[SBScreenFlash mainScreenFlasher] flashColor:[UIColor magentaColor] withCompletion:nil] 屏幕閃紫色光

#####  5.逆向的你基本思路
- 正向工程(Forward Engineering)
 抽象的邏輯設(shè)計 =>  具體的物理實現(xiàn)        

 設(shè)計概念和算法  =>  編寫源代碼  =>  編譯成二進(jìn)制機(jī)器碼   

**將想法和設(shè)計理念變成具體實現(xiàn)的過程** 

- 逆向工程(Reverse Engineering)
具體的物理實現(xiàn)     =>   抽象的邏輯設(shè)計
反編譯機(jī)器碼 => 匯編代碼(類似的高級語言代碼) => 理解其算法和設(shè)計概念

**從二進(jìn)制碼中提取設(shè)計概念和算法** 

- 程序的編譯和反編譯
 高級語言(C/C++/Oc/Java/Python/C#)     -> 中間語言(如:匯編等) -> 目標(biāo)代碼(exe/lib/dll/sys/dylib等二進(jìn)制文件)
  
  ```
            編譯鏈接   
 高級語言   ------->    機(jī)器碼   
            <------     機(jī)器碼  
           反匯編/反編譯

        編譯鏈接
高級語言  ===>     機(jī)器碼  
          <===
        反匯編/反編譯
  • 逆向的思路

  • 逆向必須是有目的的伦意、有針對性的(明確你要做的事情)

  • 先熟悉你要逆向的目標(biāo)程序,從正向的思路去猜測他可能的實現(xiàn)方法(使用的框架硼补、調(diào)用的系統(tǒng)API等)

  • 定位關(guān)鍵代碼

    • 通過監(jiān)控UI事件的響應(yīng)定位關(guān)鍵代碼

    • 通過監(jiān)控底層API的調(diào)用定位關(guān)鍵代碼(如網(wǎng)絡(luò)訪問接口驮肉、文件讀寫接口等)

    • 通過觀察數(shù)據(jù)的變化來定位關(guān)鍵代碼和地址

逆向是一個試錯的過程,需要不停的猜測已骇、查找和進(jìn)行驗證离钝,既考驗?zāi)托囊部简瀯邮帜芰?/strong>

6.程序、進(jìn)程褪储、線程卵渴、內(nèi)存結(jié)構(gòu)的概念
  • 程序(靜態(tài)的,磁盤上)
    程序是完成某個功能的指令集鲤竹。程序一般是指可執(zhí)行的二進(jìn)制文件浪读。

  • 進(jìn)程(動態(tài)的,內(nèi)存中)

    • 進(jìn)程的概念
      進(jìn)程是程序的運行實例辛藻,是系統(tǒng)進(jìn)行資源分配和調(diào)度運行的基本單位碘橘。

    換句話說進(jìn)程是一個容器,包含程序執(zhí)行需要的代碼吱肌、數(shù)據(jù)還有資源等信息痘拆。多任務(wù)的操作系統(tǒng),可以同時執(zhí)行多個進(jìn)程岩榆。

    • 進(jìn)程虛擬地址空間
      多任務(wù)操作系統(tǒng)中的每一個進(jìn)程都運行在一個屬于它自己的內(nèi)存沙盤中错负,這個沙盤就是虛擬地址空間
      (virtual addressspace), 在32位經(jīng)典模式下勇边,它總是一個4GB的內(nèi)存地址塊犹撒。這些虛擬地址通過頁表(pagetable)
      映射到物理內(nèi)存,頁表由操作系統(tǒng)維護(hù)并被處理器引用粒褒。每個進(jìn)程都擁有一套屬于它自己的頁表识颊,但是還有一個隱情,
      只要虛擬地址被使能,那么它將會作用于這臺機(jī)器上運行的所有軟件祥款,包括內(nèi)核本身清笨,因此,有一部分虛擬地址必須保
      留給內(nèi)核使用刃跛。
  • 線程
    輕量級進(jìn)程抠艾,是進(jìn)程內(nèi)一個相對獨立的、可調(diào)度的執(zhí)行單元桨昙,是CPU調(diào)度的基本單元检号。

  • 函數(shù)
    包含某個特定功能的代碼塊,可以叫做子程序蛙酪。

  • 典型的內(nèi)存空間布局

  • 從低地址到高地址依次為:代碼區(qū)齐苛、只讀常量區(qū)、全局區(qū)/數(shù)據(jù)區(qū)桂塞、BSS段凹蜂、堆區(qū)、棧區(qū)阁危。

    代碼區(qū):存放可執(zhí)行指令玛痊。
    
    只讀常量區(qū):存放字面值常量、具有常屬性且被初始化的全局和靜態(tài)局部變量(如:字符串字面值欲芹、被const關(guān)鍵字修飾的全局變量和被const關(guān)鍵字修飾的靜態(tài)局部變量)卿啡。
    
    全局區(qū)/數(shù)據(jù)區(qū):存放已初始化的全局變量和靜態(tài)局部變量。
    
    BBS段:存放未初始化的全局變量和靜態(tài)局部變量菱父,并把它們的值初始化為0颈娜。
    
    堆區(qū):存放動態(tài)分配的內(nèi)存。
    
    棧區(qū):自動變量和函數(shù)調(diào)用時需要保存的信息(逆向分析的重點)
    
    補充:
      代碼區(qū)和只讀常量區(qū)一般統(tǒng)稱為代碼段
      
      棧區(qū)和堆區(qū)之間相對生長的浙宜,堆區(qū)的分配一般按照地址從小到大進(jìn)行官辽,而棧區(qū)的分配一般按照地址從大到小進(jìn)行分配。
    
    這里寫圖片描述
7.逆向工具集和安裝和使用
  • iOS逆向工程的工具大致可分為四類:
  • 檢測工具
    如:Reveal粟瞬、tcpdump等

  • 反編譯工具(反匯編工具 - 分析二進(jìn)制文件并得到一些信息)
    如:IDA同仆、Hopper Disassembler、classdump等

  • 調(diào)試工具
    如:lldb裙品、Cycript等

  • 開發(fā)工具
    如:Xcode俗批、theos等

  • classdump
    可以將Mach-O文件中的Objective-C運行時的聲明的信息導(dǎo)出,即編寫OC代碼時的 .h文件市怎。class-dump只能導(dǎo)出未經(jīng)加密的App的頭文件岁忘。classdump是對"otool -ov" 信息的翻譯,以一種我們熟悉的易讀的方式呈現(xiàn)区匠。官網(wǎng)http://stevenygard.com/projects/class-dump/
     where options are:
          -a             show instance variable offsets
          -A             show implementation addresses
          --arch <arch>  choose a specific architecture from a universal binary (ppc, ppc64, i386, x86_64)
          -C <regex>     only display classes matching regular expression
          -f <str>       find string in method name
          -H             generate header files in current directory, or directory specified with -o
          -I             sort classes, categories, and protocols by inheritance (overrides -s)
          -o <dir>       output directory used for -H
          -r             recursively expand frameworks and fixed VM shared libraries
          -s             sort classes and categories by name
          -S             sort methods by name
          -t             suppress header in output, for testing
          --list-arches  list the arches in the file, then exit
          --sdk-ios      specify iOS SDK version (will look in /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS<version>.sdk
          --sdk-mac      specify Mac OS X version (will look in /Developer/SDKs/MacOSX<version>.sdk
          --sdk-root     specify the full SDK root path (or use --sdk-ios/--sdk-mac for a shortcut)
    
  • otool工具簡介
    otool(object file displaying tool) :目標(biāo)文件的展示工具干像。可以用來發(fā)現(xiàn)應(yīng)用中使用到了哪些系統(tǒng)庫,調(diào)用了其中哪些方法麻汰,使用了庫中哪些對象及屬性速客,它是Xcode自帶的常用工具。

    -f print the fat headers
    -a print the archive header
    -h print the mach header
    -l print the load commands
    -L print shared libraries used
    -D print shared library id name
    -t print the text section (disassemble with -v)
    -p <routine name>  start dissassemble from routine name
    -s <segname> <sectname> print contents of section
    -d print the data section
    -o print the Objective-C segment
    -r print the relocation entries
    -S print the table of contents of a library
    -T print the table of contents of a dynamic shared library
    -M print the module table of a dynamic shared library
    -R print the reference table of a dynamic shared library
    -I print the indirect symbol table
    -H print the two-level hints table
    -G print the data in code table
    -v print verbosely (symbolically) when possible
    -V print disassembled operands symbolically
    -c print argument strings of a core file
    -X print no leading addresses or headers
    -m don't use archive(member) syntax
    -B force Thumb disassembly (ARM objects only)
    -q use llvm's disassembler (the default)
    -Q use otool(1)'s disassembler
    -mcpu=arg use `arg' as the cpu for disassembly
    -j print opcode bytes
    -P print the info plist section as strings
    -C print linker optimization hints
    --version print the version of /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/otool 
    
    • 依賴庫的查詢
      如: otool -L WeChart

    • 是否加殼
      如:otool -l WeChart | grep -B 2 crypt

  • classdump的使用
    class-dump -s -S -H /Applications/Memenet/Memenet.app/Contents/MacOS/memenet -o ./MyHeaders

    ```
     查看某文件夾下文件的個數(shù)五鲫,包括子文件夾里的溺职。
     ls -lR|grep "^-"|wc -l
    
     查看某文件夾下文件夾的個數(shù),包括子文件夾里的位喂。
     ls -lR|grep "^d"|wc -l
    
    
    
    定位要砸殼的StoreApp的執(zhí)行文件名字TargetApp (ps -e 可以得到全路徑)  

    定位要砸殼的StoreApp的Document目錄:
    cycript -p TargetApp
    [[NSFileManager defaultManager]URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]

    得到路徑:#"file:///var/mobile/Containers/Data/Application/986376B5-EF08-4CAF-81FB-CAE48D1FE4AE/Documents/"

    進(jìn)入Document目錄: cd  /var/mobile/Containers/Data/Application/986376B5-EF08-4CAF-81FB-CAE48D1FE4AE/Documents/
    拷貝dumpdecrypted.dylib: cp  dumpdecrypted.dylib .

    DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/749DC69A-3A8D-4B5C-9926-1220E69FC85F/WeChat.app/WeChat
 
  • theos(作者:@DHowett)
    越獄開發(fā)工具包
  • xcode工具集的路徑需要設(shè)置正確
    查看命令: xcode-select --print-path

    設(shè)置命令: xcode-select --switch /Applications/Xcode-beta.app/Contents/Developer

  • 通過github安裝theos
    https://github.com/theos/theos/wiki/Installation

  • 修改所有者
    sudo chown -R $(id -u):$(id -g) theos

    theos維基百科:
    http://iphonedevwiki.net/index.php/Theos/Setup#For_Mac_OS_X
    http://iphonedevwiki.net/index.php/Theos

  • 環(huán)境變量
    export THEOS=/opt/theos

    可以寫入~/.bash_profile
    source ~/.bash_profile

    echo $THEOS

  • ldid(作者:saurik )
    維基百科:http://iphonedevwiki.net/index.php/Ldid

    越獄iPhone下的簽名工具(更改授權(quán)entitlements)辅愿,可以為thos開發(fā)的程序進(jìn)程簽名(支持在OS X和iOS上運行)。

  • 安裝ldid
    $ brew install ldid fakeroot

  • 加密算法

  • 對稱加密算法:RC4忆某、DES、3DES阔蛉、AES128弃舒、AES256等。加解密雙方密鑰相同状原。

  • 非對稱加密算法:RSA聋呢、Elgamal等。加解密雙方使用密鑰對颠区。

  • 哈希算法:MD5(16Byte)削锰、SHA1(20Byte)等。任意長度的信息轉(zhuǎn)換成到某一固定長度的信息摘要(具有唯一性毕莱,不可逆性)器贩,主要作用是對數(shù)據(jù)數(shù)據(jù)完整性校驗。

  • 數(shù)字簽名 (蘋果官方的私鑰簽名朋截,公鑰驗證)

    • 數(shù)字簽名是非對稱密鑰加密技術(shù)與數(shù)字摘要技術(shù)的應(yīng)用蛹稍。對指定信息使用哈希算法,得到一個固定長度的信息摘要部服,然后再使用 私鑰 (注意必須是私鑰)對該摘要加密唆姐,就得到了數(shù)字簽名。
  • 數(shù)字證書
    數(shù)字證書是一個文件廓八,由蘋果的 Apple Worldwide Developer Relations Certification Authority(WWDR)證書認(rèn)證中心進(jìn)行簽名奉芦,其的主要作用是用來標(biāo)示身份。證書文件主要包含兩部分內(nèi)容:證書信息和證書簽名

    • 證書信息
      包含用戶的公鑰剧蹂、用戶個人信息声功、證書頒發(fā)機(jī)構(gòu)信息、證書有效期等信息国夜。(這里的用戶主要指開發(fā)者)

    • 證書簽名
      WWDR將上述證書本身內(nèi)容的使用哈希算法得到一個固定長度的信息摘要减噪,然后使用自己的私鑰對該信息摘要加密生成數(shù)字簽名。

    • 證書的驗證
      iOS系統(tǒng)原本就持有WWDR的公鑰,系統(tǒng)首先會對證書內(nèi)容通過指定的哈希算法計算得到一個信息摘要筹裕;然后使用WWDR的公鑰對證書中包含的數(shù)字簽名解密醋闭,從而得到經(jīng)過WWDR的私鑰加密過的信息摘要;最后對比兩個信息摘要朝卒,如果內(nèi)容相同就說明該證書可信证逻。在驗證了證書是可信的以后,iOS系統(tǒng)就可以獲取到證書中包含的開發(fā)者的公鑰抗斤,并使用該公鑰來判斷代碼簽名的可用性了囚企。

    • 證書存在的意義
      通過證書使用過程可以看出,證書本身只是一個容器瑞眼,用來承載開發(fā)者的公鑰龙宏。iOS通過驗證證書的合法性來確保開發(fā)者公鑰的合法性。

  • 代碼簽名與驗證(開發(fā)者的私鑰簽名伤疙,公鑰驗證)
    打包過程中使用開發(fā)者私鑰對應(yīng)用進(jìn)行簽名银酗。

    開發(fā)者的公鑰被包含在數(shù)字證書里,數(shù)字證書又被包含在描述文件(Provisioning File)中徒像,描述文件在應(yīng)用被安裝的時候會被拷貝到iOS設(shè)備中黍特。iOS安全系統(tǒng)通過證書就能夠確定開發(fā)者身份,就能夠通過從證書中獲取到的公鑰來驗證開發(fā)者用該公鑰對應(yīng)的私鑰簽名后的代碼锯蛀、資源文件等有沒有被更改破壞灭衷,最終確定應(yīng)用能否合法的在iOS設(shè)備上合法運行。

  • 工具的使用

    查看codesign load command 
    otool -l WeChat | grep -A 5 SIGNATURE
    
    查看簽名信息
    ?  tmp codesign -dvvv WeChat
    Executable=/private/tmp/WeChat
    Identifier=com.tencent.xin
    Format=Mach-O universal (armv7 arm64)
    CodeDirectory v=20200 size=448783 flags=0x0(none) hashes=14017+5 location=embedded
    Hash type=sha256 size=32
    CandidateCDHash sha1=6e2f8a93dbe63c17ea3b3a3dc032826b9eddf2b7
    CandidateCDHash sha256=d6f1afe23b598a76301711a4a62a5505a749a12a
    Hash choices=sha1,sha256
    CDHash=d6f1afe23b598a76301711a4a62a5505a749a12a
    Signature size=3925
    Authority=Apple iPhone OS Application Signing
    Authority=Apple iPhone Certification Authority
    Authority=Apple Root CA
    Info.plist=not bound
    TeamIdentifier=88L2Q4487U
    Sealed Resources=none
    Internal requirements count=1 size=96
    
    查看entitlement內(nèi)容 
    codesign -d --entitlements - WeChat
    ldid -e WeChat
    
    修改entitlement內(nèi)容 
    ldid -Sentitlement.xml  WeChat
    
  • dpkg工具

  • 安裝

$ brew install --from-bottle https://raw.githubusercontent.com/Homebrew/homebrew-core/7a4dabfc1a2acd9f01a1670fde4f0094c4fb6ffa/Formula/dpkg.rb
$ brew pin dpkg
  • 使用
dpkg -i/-r  deb包安裝/卸載
dpkg -s com.iosre.myiosreproject 查看安裝包信息
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末旁涤,一起剝皮案震驚了整個濱河市翔曲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拭抬,老刑警劉巖部默,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異造虎,居然都是意外死亡傅蹂,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門算凿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來份蝴,“玉大人,你說我怎么就攤上這事氓轰』榉颍” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵署鸡,是天一觀的道長案糙。 經(jīng)常有香客問我限嫌,道長,這世上最難降的妖魔是什么时捌? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任怒医,我火速辦了婚禮,結(jié)果婚禮上奢讨,老公的妹妹穿的比我還像新娘稚叹。我一直安慰自己,他們只是感情好拿诸,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布扒袖。 她就那樣靜靜地躺著,像睡著了一般亩码。 火紅的嫁衣襯著肌膚如雪季率。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天描沟,我揣著相機(jī)與錄音蚀同,去河邊找鬼。 笑死啊掏,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的衰猛。 我是一名探鬼主播迟蜜,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼啡省!你這毒婦竟也來了娜睛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤卦睹,失蹤者是張志新(化名)和其女友劉穎畦戒,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體结序,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡障斋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了徐鹤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片垃环。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖返敬,靈堂內(nèi)的尸體忽然破棺而出遂庄,到底是詐尸還是另有隱情,我是刑警寧澤劲赠,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布涛目,位于F島的核電站秸谢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏霹肝。R本人自食惡果不足惜估蹄,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望阿迈。 院中可真熱鬧元媚,春花似錦、人聲如沸苗沧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽待逞。三九已至甥角,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間识樱,已是汗流浹背嗤无。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留怜庸,地道東北人当犯。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像割疾,于是被迫代替她去往敵國和親嚎卫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

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

  • 4.Cycript工具介紹(作者:saurik宏榕,官網(wǎng):http://www.cycript.org/) Cycri...
    Flonger閱讀 870評論 0 1
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,522評論 25 707
  • 背景:電商網(wǎng)站有購物車功能拓诸,旅游(OTA)網(wǎng)站沒有,為什么麻昼?購物車的作用是什么奠支? 這個問題,我們分解為兩個部分抚芦;1...
    2c5994723157閱讀 688評論 0 4
  • 沒有遙遠(yuǎn) 沒有近 影子的長度斜入寂無 只有這兩棵樹了 大部分葉子已經(jīng)逃離 太高的地方 近也是遙遠(yuǎn)么 向上的都彎曲 ...
    楊昊田閱讀 511評論 16 29
  • 傻子人很好倍谜,別人給他的食物他都會分享給他人。不求一絲回報叉抡!但也就是這樣別人給了他一個稱號叫“傻子枢劝!” ...
    清風(fēng)徐來拂柳煙云閱讀 346評論 0 0