iOS逆向記錄(一)

iOS逆向環境介紹

*** 越獄環境:iphone5s iOS 8.3***

Flongers-iPhone:~ root# uname -a
Darwin Flongers-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,1 arm64 N51AP Darwin
1.Drawin體系
  • Darwin是一種類似unix的操作系統,他的核心XNU,XNU是一種混合式內核,結合了mach與BSD兩種內核

    • 主流的類unix:
      • Linux 由Linus Torvalds研發的,代表發行版本CenOS,Redhat,Ubuntu,Debian,openWRT等

      • Mac OS X的Intel部分

      • freeBSD 由加州大學伯克利分校基于UNIX研發的(UNIX變種,當時如果不是與貝爾實驗室打官司,可能就不會有現在的Linux什么事)

      • Solaris 由Sun(現為Oracel)開發的UNIX商業版本

  • BSD 實現在Mach的上層,這一層提供的API 支持了POSIX標準模型。在XNU中主要實現了一些高級的API與模塊

  • UNIX 進程模型
    e.g fork,vfork,wait,waitpid,exec等

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

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

  • 網絡協議棧(BSD Socket API),符合POSIX 模型
    e.g socket();bind(); listen();accept();connect(); gethostbyname(); gethostbyaddr()等伯克利套接字API

  • 文件系統/設備系統
    e.g Filesystem Hierarchy Standard(文件系統層次化標準)

  • iOS,OSI,ISO的含義

    • iOS 蘋果公司開發的移動操作系統

    • OSI 是Open System Interconnection的縮寫,意為開放式系統互聯。OSI模型把網絡通信的工作分為7層,分別是物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層和應用層。

    • IOS是國際標準化組織。上面的OSI模型由該組織制定。一般類UNIX系統都基本符合POSIX標準和IOS C標準

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

      • ISO C標準,C語言標準庫接口

  • 為什么越獄

  • 突破iOS沙盒機制的限制(sandbox)
    沙盒是一種安全機制,為運行中的程序提供隔離環境。沙盒在啟動的時候可以設置運行的程序是否可以訪問網絡、文件、目錄等
2.Cydia - 越獄iOS的軟件管理平臺 (Cydia 之父 - Jay Freeman(杰 弗里曼))
  • 越獄iOS是合法的

  • 安裝OpenSSH

    在Cydia中搜索OpenSSH并安裝,這樣iOS上面就可以開啟SSH服務。SSH服務默認綁定端口號22
    • 使用SSH命令連接iOS,默認登錄密碼"alpine"
     ssh root@xx.xx.xx.xx       //iOS連接wifi,設置中可以看到ip地址,也可以改成靜態IP地址
  • 使用scp命令可以傳輸文件
  scp  filename  root@xx.xx.xx.xx:/tmp                 //拷貝本地文件到遠端
  
  scp root@xx.xx.xx.xx:/tmp/filename  /tmp/         //從遠端拷貝文件到本地
  • 修改默認密碼
  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     【詳細顯示該軟件包的信息】
      
         apt-get clean                   【清除apt-get安裝的軟件包備份,可以釋放儲存空間,不影響軟件正常使用】
      
  • 使用apt-get 安裝軟件包
    e.g 安裝traceroute

        apt-get install traceroute  //發現找不到軟件包
        
        //如果不知道軟件包名稱,也可以用關鍵字搜索
        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  //發送icmp報文,檢查網絡狀況

    ps aux                          //查看進程信息
    ps -e                           

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

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

    top
    top -l 1 | head -n 10 | grep PhysMem  //顯示系統內存使用情況
    
    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 : 只抓經過接口en0的包
     (3)-t : 不顯示時間戳
     (4)-s 0 : 抓取數據包時默認抓取長度為68字節。加上-S 0 后可以抓到完整的數據包
     (5)-c 100 : 只抓取100個數據包
     (6) tcp port ! 22  : 不抓tcp端口22的數據包
     (7) dst port ! 22 : 不抓取目標端口是22的數據包
     (8)dst host 192.168.1.137 : 抓取目標地址為192.168.1.137的包
     (9)src net 192.168.1.0/24 : 數據包的源網絡地址為192.168.1.0/24
3.iOS文件系統結構
  • 可視化方式常看iOS系統文件
    ==在iOS通過Cydia安裝Apple File Conduit 2,在OS X使用iFunBox可以查看iOS系統文件(iOS和OS X需要在通一個局域網內)==

  • 通過SSH遠程登錄iOS來查看

  • Filesystem Hierarchy Standard 文件系統層次化標準(以下簡稱FHS)
    ==FHS為類UNIX操作系統的文件目錄結構制定了一套標準,目的是讓用戶預知文件或目錄的存放位置。UNIX操作系統的常見目錄結構如下所示。==

       /:根目錄,以斜杠表示,其他所有文件和目錄在根目錄下展開。
    
       /bin:"binary"的簡寫,存放提供用戶級基礎功能的二進制文件,如ls、ps等。
    
       /boot:存放能使系統成功啟動的所有文件。iOS中此目錄為空。
    
       /dev:"device"的簡寫,存放BSD設備文件。每個文件代表系統的一個塊設備或字符設備,一般來說,“塊設備”以塊為單位傳輸數據,如硬盤;而“字符設備”以字符為單位傳輸數據,如調制解調器。
    
       /sbin:"system binaries"的簡寫,存放提供系統級基礎功能的二進制文件,如netstat、reboot等。
    
       /etc:"Et Cetera"的簡寫,存放系統腳本及配置文件,如passwd、hosts等。在iOS中,/etc是一個符號鏈接,實際指向/private/etc。
    
       /lib:存放系統庫文件、內核模塊及設備驅動等。iOS中此目錄為空。
    
       /mnt:"mount"的簡寫,存放臨時的文件系統掛載點。iOS中此目錄為空。
    
       /private:存放兩個目錄,分別是/private/etc和/private/var。
    
       /tmp:臨時目錄。在iOS中,/tmp是一個符號鏈接,實際指向/private/var/tmp。
    
       /usr:包含了大多數用戶工具和程序。/usr/bin包含那些/bin和/sbin中未出現的基礎功能,如nm、killall等;/usr/include包含所有的標準C頭文件;/usr/lib存放庫文件。
    
      /var:"variable"的簡寫,存放一些經常更改的文件,比如日志、用戶數據、臨時文件等。其中/var/mobile和/var/root分別存放了mobile用戶和root用戶的文件,是重點關注的目錄。
    
  • UNIX系統文件權限簡介(UNIX一切皆文件:讀寫普通文件、目錄、設備、socket、管道、CPU信息、進程信息等)
  • 系統用3位(bit)來表示文件的權限,從高位到低位分別是r(read)權限、w(write)權限,以及x(execute)權限。文件與用戶的關系存在以下三種可能性:
  • 此用戶是屬主用戶(文件所有者的權限)
  • 此用戶不是屬主用戶,但在屬主組里(組用戶權限)
  • 此用戶既不是屬主用戶,又不在屬主組里(Other用戶權限)
```
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位來表示一個文件的權限,如果某一位為1,則這一位代表的權限生效,否則無效。例如,111101101代表rwxr-xr-x,即該文件的屬主用戶擁有r、w、x權限,而屬主組和其他所有人只具有r和x權限;同時,二進制的111101101轉換成十六進制是755,也是一種常見的權限表示法。

可以使用chmod 命令修改文件權限,如 chmod  755  filename

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

      /Developer:如果一臺設備連接Xcode后被指定為調試用機,Xcode就會在iOS中生成這個目錄,其中會含有一些調試需要的工具和數據。

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

      /System/Library:iOS文件系統中最重要的目錄之一,存放大量系統組件。

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

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

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

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

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

      /var/mobile/Library/SMS下存放短信數據庫;

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

  ```


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

如獲取iOS上微信程序的Bundle路徑,可以通過ps -e | grep appname
Flongers-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運行生產的數據和配置信息等
   如獲取iOS上微信程序的Date路徑,可以通過cycript工具
   Flongers-iPhone:~ root# cycript -p WeChat
   cy# directory = NSHomeDirectory()
   @"/var/mobile/Containers/Data/Application/986376B5-EF08-4CAF-81FB-CAE48D1FE4AE"
   cy# 
  • Date目錄結構如下:
```
Flongers-iPhone:/var/mobile/Containers/Data/Application/986376B5-EF08-4CAF-81FB-CAE48D1FE4AE root# ls
Documents/  Library/  tmp/
```
  • Document 存放應用運行時生成的并且需要保存的數據。注:iTunes或iCloud同步設備時會備份該目錄

  • Library/Caches 存放應用運行時生成的并且需要保存的數據。iTunes或iCloud不同步。

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

  • tmp 存放應用運行時所需的臨時數據。當某個應用沒運行時,iOS系統可能會清除該目錄下的文件。但不可依賴這種自動清除機制,應該及時手動清除。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容