成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

iOS應用程序的脫殼實現原理淺析

移動開發(fā)
對于諸多逆向愛好者來說,給一個app脫殼是一項必做的事情。基于安全性的考慮,蘋果對上架到appstore的應用都會進行加密處理,所以如果直接逆向一個從appstore下載的應用程序時,所能看到的“源代碼”將非常的晦澀難懂。

應用程序加載過程

對于諸多逆向愛好者來說,給一個app脫殼是一項必做的事情。基于安全性的考慮,蘋果對上架到appstore的應用都會進行加密處理,所以如果直接逆向一個從appstore下載的應用程序時,所能看到的“源代碼”將非常的晦澀難懂。為了能看懂應用程序的“源代碼”,就必須對應用程序進行解密,也就是所謂的脫殼。脫殼后的目的是可以分析應用程序的一些技術實現原理,或者利用一些漏洞進行攻擊和測試。

這篇文章不是一篇介紹如何利用工具去進行脫殼的教程,而只是簡單的分析這些常用脫殼工具的實現原理。要想了解脫殼原理,就要先去了解一個被加密的應用程序是如何被運行的。下面一張圖片簡單的介紹了一個被加殼后的應用程序被加載和運行的過程:

 

iOS應用程序的脫殼實現原理淺析

程序脫殼過程

脫殼原理以及常見的工具

要對一個殼應用進行脫殼處理,無非就是采用靜態(tài)脫殼和動態(tài)脫殼兩種方法:靜態(tài)脫殼就是在已經掌握和了解到了殼應用的加密算法和邏輯后在不運行殼應用程序的前提下將殼應用程序進行解密處理。靜態(tài)脫殼的方法難度大,而且加密方發(fā)現應用被破解后就可能會改用更加高級和復雜的加密技術;動態(tài)脫殼就是從運行在進程內存空間中的可執(zhí)行程序映像(image)入手,來將內存中的內容進行轉儲(dump)處理來實現脫殼處理。這種方法實現起來相對簡單,且不必關心使用的是何種加密技術。從上面的殼應用程序運行的過程就可以看出無論殼程序如何被加密處理,最終運行后在進程中的代碼映像(image)始終是被解密后的原始程序二進制。所以只要一個進程內存空間中的代碼映像(image)能被讀取和訪問就可以實現動態(tài)脫殼。下面要介紹的兩個工具就是巧妙的運用了兩種不同的訪問技巧來實現動態(tài)脫殼的。

一、利用動態(tài)庫注入來實現脫殼的dumpdecrypted/frida-ios-dump

dumpdecrypted和frida-ios-dump都是在github上開源的項目,下載地址分別為:https://github.com/stefanesser/dumpdecrypted和https://github.com/AloneMonkey/frida-ios-dump。關于使用這兩個工具來進行脫殼的文檔非常之多。我們知道一個應用除了有一個可執(zhí)行程序外,還會鏈接非常多的動態(tài)庫。動態(tài)庫加載后和可執(zhí)行程序共享相同的進程內存空間,而且動態(tài)庫中的代碼是可以訪問整個進程內存空間中的有權限的區(qū)域的,包括可執(zhí)行程序的image被加載到進程中的內存區(qū)域。因此只要想辦法讓應用程序加載某個特定的第三方動態(tài)庫,也就是讓這個第三方動態(tài)庫注入到應用程序的進程中去就可以實現將被解密過后的可執(zhí)行程序在進程內存中的image信息轉儲到文件中去從而實現脫殼處理。對于一個越獄后的設備來說主要可以通過兩種方法來實現第三方動態(tài)庫的注入:

  1. 設置環(huán)境變量DYLD_INSERT_LIBRARIES的值指向這個第三方動態(tài)庫的路徑。然后運行要脫殼的應用程序即可。 DYLD_INSERT_LIBRARIES環(huán)境變量的設置是一個操作系統(tǒng)提供的特性,所有運行的程序都會加載這個環(huán)境變量中所指向的動態(tài)庫文件。
  2. 將第三方動態(tài)庫文件保存在越獄設備的/Library/MobileSubstrate/DynamicLibraries/目錄下并編寫對應的庫的同名plist文件,所有plist中指定的可執(zhí)行程序一旦運行就會加載對應的動態(tài)庫(此目錄即Tweak插件所在的目錄)。
  • 還有一種直接修改對應mach-o格式的可執(zhí)行文件內容來實現動態(tài)庫注入。

動態(tài)庫加載的問題解決后就需要解決動態(tài)庫中代碼運行的時機問題了。要想讓一個被加載的動態(tài)庫在加載后自動運行某一段代碼可以有四種方法:

  1. 建立一個C++全局對象,并在對象所屬類的構造函數中添加特定代碼。
  2. 建立一個OC類,并在OC類的+load方法中添加特定的代碼。
  3. 生成動態(tài)庫時指定一個初始化init入口函數,并在入口函數中添加特定的代碼。
  4. 在動態(tài)庫中定義一個帶有_attribute_((constructor))聲明的函數,并在函數內添加特定的代碼。
  • 如果你想更進一步的了解上述那些方法的加載的原理,請參考我的文章:深入解構iOS系統(tǒng)下的全局對象和初始化函數

dumpdecrypted這個工具就是通過建立一個名為dumpdecrypted.dylib的動態(tài)庫并在庫內部定義了一個

 

  1. __attribute__((constructor)) 
  2. void dumptofile(int argc, const char **argv, const char **envp, const char **apple, struct ProgramVars *pvars) 

函數來實現脫殼的。這個函數的大體實現會在后面繼續(xù)介紹。

二、利用父子進程關系來實現脫殼的Clutch

Clutch也是一個在github上開源的項目,下載地址為:https://github.com/KJCracks/Clutch。關于這個工具的使用教程也非常之多。我們知道在unix系列的操作系統(tǒng)中父進程可以通過fork或者posix_spawnp兩個函數來運行或者建立一個子進程的,這兩個函數都會返回對應的子進程ID(PID)。iOS系統(tǒng)則可以通過task_for_pid函數來從進程ID獲取進程在mach內核子系統(tǒng)中的mach port標識。得到mach port 標識后,就可以借助mach_vm_read_overwrite函數來讀取指定進程空間中的任意虛擬內存區(qū)域中所存儲的內容。因此Clutch內部的實現就是Clutch這個程序對將要進行脫殼的程序文件路徑調用posix_spawnp函數來運行從而成為其子進程,然后借助task_for_pid以及mach_vm_read_overwrite函數來讀取脫殼程序子進程在內存中已經被解密后的可執(zhí)行程序的image所映射的內存空間來達到脫殼的目的的。

一個思考:可能在實際中并不一定要求是父子進程關系,是否只要某個具有特權的程序或者運行在root用戶上的程序只要拿到了對應進程的PID就可以通過mach子系統(tǒng)提供的API來讀取其他進程內存空間中的信息呢?

上述的兩種方法中不管是dumpdecrypted還是Clutch最終都是將被解密后的可執(zhí)行程序的image在內存中的映射寫入到一個文件中去來保存脫殼后的內容。參考dumpdecrypted中的dumptofile函數實現以及Clutch中的Dumpers目錄下的實現代碼就可以看出:一個可執(zhí)行程序image在內存中映射的內容的結構和mach-o格式的可執(zhí)行文件結構基本上是保持一致的。都是有一個mach_header結構體頭還有諸多的load_command結構體組成。因此所謂的dump處理就是將內存中的這些結構和數據原封不動的寫入到文件中去即完成了脫殼中的最核心的部分。如果想仔細的閱讀這部分代碼的實現,建議先了解一下mach-o文件格式的組成。

后記

當你了解了這些內部實現后,也許你會發(fā)覺其實它的原理很簡單。而且有可能你也能很快的去實現。可問題的關鍵是為什么這些方法總是別人能想到,而我們卻想不到呢?這是否和國人的思維以及解決問題的方式相關呢?在我們的教育和實踐體系中更多的是拿來主義和實用主義,往往很少人會對問題進行深入的探索研究以及進行問題的關聯(lián)性思考。但愿這種情況在未來能夠得到改進,尤其作為一個程序員,更加應該秉持探索求知的強烈意愿而不是簡單復制和應用就滿足了。

最后還是要感謝《iOS應用逆向與安全》的作者:劉培慶。向他咨詢了逆向相關的一些知識后才得以寫出這篇文章。

責任編輯:未麗燕 來源: 簡書
相關推薦

2022-12-25 18:03:13

Debug原理軟件

2010-12-27 17:04:07

應用程序版本升級

2015-10-10 16:31:58

2009-07-09 16:47:26

Servlet的Web

2009-07-10 17:24:07

Swing應用程序

2010-01-22 13:59:34

Visual C++應

2011-07-20 16:59:07

2010-01-26 13:29:46

VC++應用程序

2009-09-24 17:21:17

加速Hibernate

2009-07-20 16:08:04

ASP.NET應用程序

2010-02-22 10:38:09

Python應用程序

2009-07-30 18:50:32

C#發(fā)送消息C#應用程序

2009-08-25 09:39:21

創(chuàng)建C# Window

2009-07-17 13:42:36

Windows CE應WinCE可移植性

2009-09-22 18:39:02

Silverlight

2009-07-14 16:40:31

MyEclipse開發(fā)

2010-02-04 10:17:38

Android應用程序

2010-03-02 14:24:00

Android應用程序

2015-07-09 15:42:48

ios應用生命周期

2014-04-02 09:56:13

iOS應用減小安裝包
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩国产一区二区三区 | 亚洲精品日韩视频 | 国产一区高清 | 国产成人综合久久 | 久久成人免费 | 日韩av.com| 欧美一级高潮片免费的 | 精品国产欧美一区二区三区成人 | 日韩成人精品 | 国产一级成人 | 亚洲第一成人av | 亚洲视频精品 | 中文字幕日韩欧美 | 国产美女精品视频 | 五月精品视频 | 日韩欧美精品在线 | 国产成人99久久亚洲综合精品 | 一级片视频免费 | 精品成人av | 日本不卡免费新一二三区 | www国产成人 | 久久久久久久久久久一区二区 | 久久久久网站 | www.色.com| 国产精品无码久久久久 | 国产粉嫩尤物极品99综合精品 | 91精品国产综合久久久密闭 | 欧美激情在线播放 | 天堂成人国产精品一区 | 午夜一区二区三区在线观看 | 欧美精品一区二区三区四区 | 91婷婷韩国欧美一区二区 | 亚洲精品68久久久一区 | www.久久久久久久久久久久 | 国产精品1区2区3区 一区中文字幕 | 国产一区二区三区免费观看在线 | 黄视频在线网站 | 国产久| 国产视频福利在线观看 | 97超碰站| 永久www成人看片 |