APP加固技術歷程及未來級別方案:虛機源碼保護

来源:http://www.cnblogs.com/dxjx/archive/2017/12/01/7942171.html
-Advertisement-
Play Games

傳統app加固技術經歷了四代變更,保護級別每一代都有所提升,但其固有的安全缺陷和相容性問題始終未能得到解決。下一代加固技術"虛機源碼保護"適用代碼類型更廣泛,保護級別更高,相容性更強,堪稱未來級別的保護方案。 ...


傳統App加固技術,前後經歷了四代技術變更,保護級別每一代都有所提升,但其固有的安全缺陷和相容性問題始終未能得到解決。而下一代加固技術—虛機源碼保護,適用代碼類型更廣泛,App保護級別更高,相容性更強,堪稱未來級別的保護方案。

undefined

(加固技術發展歷程)  

第一代加固技術—動態載入

第一代Android加固技術用於保護應用的邏輯不被逆向與分析,最早普遍在惡意軟體中使用,其主要基於Java虛擬機提供的動態載入技術。 其保護流程是: 開發階段中將程式切分成載入(Loader)與關鍵邏輯(Payload)兩部分,並分別打包;

undefined

(開發階段) 運行時載入部分(Loader)會先運行,釋放出關鍵邏輯(Payload),然後java的動態載入技術進行載入,並轉交控制權。

undefined

(啟動流程)

undefined

(核心代碼)   備註(multidex組件的加固原理): Android的DEX文件在設計之初程式普遍較小,所以在DEX文件設計時,只允許包含65535個函數引用。而隨著Android應用的發展,大量的應用的代碼已經超過了65535的限制,為瞭解決這個問題,Android5.0之後原生支持載入多個dex,而為了對舊版本的相容,Android提供了multidex組件。該組件的實現原理與上面介紹的是一致的。   缺陷與對抗 第一代加固技術的缺陷是依賴Java的動態載入機制,而這個機制要求關鍵邏輯(Payload)部分必須解壓,並且釋放到文件系統,這就給了攻擊機會去獲取對應的文件。雖然可以通過關鍵邏輯(Payload)被載入後,被從文件系統刪除,用於防止被覆制,但是攻擊者可以攔截對應的刪除函數,阻止刪除。 而關鍵邏輯(Payload)會被加密後保存,可用於對抗靜態分析,但是攻擊者可以通過自定義虛擬機,攔截動態載入機制所使用的關鍵函數,在這個函數內部,複製文件系統中的關鍵邏輯(Payload)文件。  

第二代加固技術—不落地載入

相對第一代加固技術,第二代加固技術在APK修改方面已經完善,能做到對開發的零干擾。開發過程中不需要對應用做特殊處理,只需要在最終發佈前進行保護即可。而為了實現這個零干擾的流程,Loader需要處理好Android的組件的生命周期。   主要流程: 1)Loader被系統載入。 2)系統初始化Loader內的StubApplication。 3)StubApplication解密並且載入原始的DEX文件(Payload)。 4)StubApplication從原始的DEX文件(Payload)中找到原始的Application對象,創建並初始化。 5)將系統內所有對StubApplication對象的引用使用替換成原始Application,此步驟使用JAVA的反射機制實現。6)由Android系統進行其他組件的正常生命周期管理。

undefined

(對開發零干擾的加固後啟動流程)   另一方面,不落地載入技術是在第一代加固技術的基礎上改進,主要解決第一代技術中Payload必須釋放到文件系統(俗稱落地)的缺陷,其主要的技術方案有兩種: A.攔截系統IO相關的函數(如read、write),在這些函數中提供透明加解密。具體的流程是: 1)關鍵邏輯(Payload)以加密的方式存儲在APK中。 2)運行時載入部分(Loader)將關鍵邏輯釋(Payload)放到文件系統,此時關鍵邏輯(Payload)還處於加密狀態。 3)載入部分攔截對應的系統IO函數(read,write等)。 4)載入部分(Loader)正常調用Java動態載入機制。由於虛擬機的IO部分被攔截,所以虛擬機讀取到已經解密的關鍵邏輯(Payload)。

undefined

(透明加解密方案流程)   B.直接調用虛擬機提供的函數進行不落地的載入,具體流程是: 1)關鍵邏輯(Payload)以加密的方式存儲在APK中。 2)運行時載入部分(Loader)將關鍵邏輯釋(Payload)放到記憶體。 3)載入部分調用虛擬機內部介面進行載入。

undefined

(不落地載入流程)   關鍵的系統函數如下:

undefined

 

 

相容性 方案A透明加密方案由於其需要攔截系統的IO函數,這部分會使用inline hook或者got hook等技術,其會帶來一定的相容性問題 方案B的不落地載入方案由於其調需要調用系統內部的介面,而這個介面並不導出,各個廠商在實現時又有各自的自定義修改,導致該方案存在相容性問題。   缺陷與對抗 第二代加固技術在應用啟動時要處理大量的加解密載入操作,會造成應用長時間假死(黑屏),用戶體驗差。 在加固技術實現上沒有本質區別,雖然能防止第一代加固技術文件必須落地被覆制的缺陷,但是也可以從以下方面進行對抗: 例如記憶體中的DEX文件頭會被清除,用於防止在dump文件中被找到;DEX文件結構被破壞,例如增加了一些錯誤的數據,提高恢復的成本。 但是Payload被載入之後,在記憶體中是連續的,利用gdb等調試工具dump記憶體後可以直接找到Payload,進行簡單的處理之後可以恢復出100%的Payload文件。   和第一代加固技術的對抗方法一樣,不落地載入也無法對抗自定義虛擬機。只需對上述的關鍵函數進行攔截然後將對應的記憶體段寫出去,即可恢復Payload。註意,由於IO相關的函數被攔截,所以無法直接調用read/write等函數進行直接的讀寫,需要使用syscall函數進行繞過。 雖然廠商會自己實現可能上述函數,從而繞過上述函數的攔截。但是Android的類載入器必須能找到對於的結構體才能正常執行,攻擊者可以以類載入器做為起點,找到對應的Payload在記憶體中的位置。  

第三代加固技術—指令抽離

由於第二代加固技術僅僅對文件級別進行加密,其帶來的問題是記憶體中的Payload是連續的,可以被攻擊者輕易獲取。第三代加固技術對這部分進行了改進,將保護級別降到了函數級別。   主要的流程是:發佈階段將原始DEX內的函數內容(Code Item)清除,單獨移除到一個文件中。

undefined

(發佈階段)   運行階段將函數內容重新恢復到對應的函數體。恢復的時間點有幾個方式: A.載入之後恢復函數內容到DEX殼所在的記憶體區域

undefined

(運行階段)   B.載入之後將函數內容恢復到虛擬機內部的結構體上:虛擬機讀取DEX文件後內部對每一個函數有一個結構體,這個結構體上有一個指針指向函數內容(CodeItem),可以通過修改這個指針修改對應的函數內容。

undefined

C.攔截虛擬機內與查找執行代碼相關的函數,返回函數內容。   相容性 指令抽離技術使用了大量的虛擬內部結構與未被文檔的特性,再加上Android複雜的廠商定製,帶來大量的相容性問題。   缺陷與對抗 指令抽離技術的某些方案與虛擬機的JIT性能優化衝突,無法達到最佳的運行性能。依舊使用了java虛擬機進行函數內容的執行。攻擊者可以通過自定義Android虛擬機,在解釋器的代碼上做記錄一個函數的內容(CodeItem)。接下來遍歷觸發所有函數,從而獲取到全部的函數內容。最終重新組裝成一個完整的DEX文件。目前已經有自動化工具可以指令抽離技術中脫殼。

undefined

(第三代加固DEX文件脫殼流程)  

第四代加固技術—指令轉換/VMP

第三代加固技術在函數級別的保護,使用Android虛擬機內的解釋器執行代碼,帶來可能被記錄的缺陷,第四代加固技術使用自己的解釋器來避免第三代的缺陷。而自定義的解釋器無法對Android系統內的其他函數進行直接調用,必須使用JAVA的JNI介面進行調用。其主要實現由兩種: A.DEX文件內的函數被標記為native,內容被抽離並轉換成一個符合JNI要求的動態庫。 動態庫內通過JNI和Android系統進行交互。

undefined

B.DEX文件內的函數被標記為native,內容被抽離並轉換成自定義的指令格式,該格式使用自定義接收器執行,和A一樣需要使用JNI和Android系統進行調用。

undefined

 

相容性 第四代VMP加固技術一般配合第三代加固技術使用,所以第三代的所有相容性問題,指令轉換/VMP加固也存在。   缺陷與對抗 不論使用指令轉換/VMP加固的A方案或者B方案,其必須通過虛擬機提供的JNI介面與虛擬機進行交互,攻擊者可以直接將指令轉換/VMP加固方案當作黑盒,通過自定義的JNI介面對象,對黑盒內部進行探測、記錄和分析,進而得到完整DEX程式。

undefined

(第四代加固DEX文件恢復)   另外,第四代VMP加固技術只實現Java代碼保護,沒有做到使用VMP技術來保護C/C++等代碼,安全保護能力有所欠缺。  

下一代加固技術—虛機源碼保護

跟第四代的VMP加固技術,虛機源碼保護加固是用虛機技術保護所有的代碼,包括Java,Kotlin,C/C++,Objective-C,Swift等多種代碼,具備極高的相容性;使App得到更高安全級別的保護,運行更加穩定。   虛機源碼保護為用戶提供一套完整的工具鏈,首先把用戶待保護的核心代碼編譯成中間的二進位文件,隨後生成獨特的虛機源碼保護執行環境和只能在該環境下執行的運行程式。   虛機源碼保護會在App內部隔離出獨立的執行環境,該核心代碼的運行程式在此獨立的執行環境里運行。即便App本身被破解,這部分核心代碼仍然不可見。

undefined

(虛機源碼保護加固流程)   生成的虛機源碼保護擁有獨特的可變指令集,極大的提高了指令跟蹤、逆向分析的難度。同時,虛機源碼保護還提供了反調試能力和監控能力。虛機源碼保護可以通過自身的探針感知到環境的變化,實時探測到外界對本環境的調試、註入等非正常執行流程變化,將調試動作引入程式陷阱,併發出警報,進而進行實時更新,提高安全強度。   加固技術發展及其攻防對抗的更迭,伴隨著互聯網技術發展不斷升級,我們深信邪不能勝正,而虛機源碼保護加固作為當前領先的加固技術,在未來很長一段時間,能夠為App提供足夠強度的保護,為企業和開發者的業務發展保駕護航。   * 更多黑灰產對抗技術及案例分享,請關註頂象技術:https://www.dingxiang-inc.com/blog
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • UINavigationBar的一些顏色設置,以前老是忘,這次記住了 ...
  • 一,效果圖。 二,工程圖。 三,代碼。 ...
  • 這篇教程的主要目的是解釋怎麼樣在你的iOS工程中創建並使用一個SDK,俗稱.a文件。 環境:xcode 9.0 創建一個靜態庫工程 打開Xcode,點擊File\New\Project, 選擇iOS\Framework and Library\Cocoa Touch Static Library新建 ...
  • 最近在搗鼓小程式,期間遇到的問題,踩過的坑,也是在網上各種搜。這裡也說下我解決的問題,方便大家。 在小程式首頁顯示文本列表的時候,為了美觀,不希望把所有的文本都顯示出來,希望是顯示前幾行(比如前3行,然後加上省略號),網上的大部分做法是從客戶端(client)來考慮的,一開始我也試圖從客戶端來解決問 ...
  • 在做項目的過程中,遇到了一個需求,在Android代碼里可以通過圖片的ID動態載入圖片。要載入Android文件夾裡面的圖片,我們就要知道它的ID,要動態獲取,那麼就得動態獲取圖片的ID。 那麼應該怎麼做呢? 我們可以用 接下來我們講講動態獲取其他資源ID的方法 1、 獲取佈局資源ID int la ...
  • Base64是網路上最常見的用於傳輸8Bit位元組碼的編碼方式之一,Base64就是一種基於64個可列印字元來表示二進位數據的方法。 Base64編碼是從二進位到字元的過程,可用於在HTTP環境下傳遞較長的標識信息。例如,在Java Persistence系統Hibernate中,就採用了Base64 ...
  • 眾所周知,日誌的管理是軟體系統很重要的一部分,千萬不可忽略其重要性。完整的日誌將會在系統維護中起著異常重要的作用,就好像磨刀不誤砍柴工一樣,日誌就像對系統進行分析的工具,工具便捷了,對系統分析起來就能達到事半功倍的效果。開發者必須要明白日誌的價值和意義,萬萬不可忽略和輕視。 LogCook是一款非常... ...
  • 用TabbarController進行模塊分類和管理,這裡推薦一個CYLTabBarController,只需兩個數組就可以使用和管理; 1.導入CYLTabBarController 使用cocoapods導入即可 pod 'CYLTabBarController', '~> 1.14.1',終端 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...