安卓逆向:app加固原理,app脫殼原理
####
app加固原理
####
首先是為什麼要加固app?
加固,就是為了防止被很容易的被逆向,逆向就是說把app的原始碼摳出來,比如遊戲app,如果別人想要抄襲我,逆向之後,把程式碼拿去,然後就可以用,後臺都有,這是很危險的,
所以要加固,讓你難以逆向,這不是完全杜絕,而且相對比較難,
###
然後是一般app都是怎麼加固的?
一般不會自己公司加固,而是用的第三方加固, 比如應用市場的加固,所以你釋出上去應用市場,要求是沒有加固的,防止這個app有一些敏感的功能,違法的功能,做壞事的功能,
然後是應用市場給你加固,加固之後然後釋出出去,
有的應用市場不嚴格,可能允許你上傳加固的app,這是為了讓別人上傳更多的app,
可以選擇用還是不用他們應用市場的加固方案,可以不用,所以不是所有的app都有加固的,
每一個應用市場,都有自己的加固方案,
比如360,騰訊,這兩個搞定了,其他的都不用管,因為大部分app都在這些應用市場了,
加固的方案基本就是dex加固和so加固,
####
怎麼判斷一個app有沒有加固?
舉例:
使用zip的方法,或者jadx工具,反編譯,看目錄結構
找到lib資料夾,如果裡面有libsharea.so,這個就是騰訊的樂加固,
###
在沒有加固之前,jadx反編譯之後,是可以看到原始碼的
但是加固之後的app,你是看不到原始碼的,只能看到加固廠商的一些資訊,根本就沒有原始碼的目錄
加固之後,你是看不到原始碼的,只能看到殼的內容,
####
這個時候我們看看這個加固的apk的,application檔案,
如果沒有加固,肯定是直接去找這個xml檔案了,
但是現在加固了,現在要先進加固的殼,然後才能去找這個xml,
這個時候application檔案,安卓name就是殼的入口了,往下找,就會有原來app的安卓name的入口,
####
而且你去看Androidmanifest.xml檔案,發現是進入這個殼的application了,不是進入app原本的application了,
加固之後相當於是兩個apk了,
要先啟動殼的apk,然後通過這個殼apk,把源app的內容載入起來,放到記憶體裡面,
這個就是下一步載入的源app的application,
###
加固原理
你上傳你的源apk到應用市場,
應用市場有自己的加固殼程式,用這個殼去加密你的源apk,這個殼程式主要是讀取源apk的dex檔案,加密成為一個新的dex檔案,
最後生成一個新的apk,
###
加固之後的app執行原理
這個apk先載入殼app,殼app讀取源dex檔案,然後解密出來源app的dex,執行源apk,
###
現在加固了之後,你反編譯就不行了,看不到原始碼了,
所以必須要解決脫殼的問題,
app脫殼原理:
脫殼的原理
在殼app解密源apk的dex之後,源apk被載入之前,攔截這個過程中的系統函式,把記憶體中的dex檔案dump拿出來,
這個中間的流程是很長的,你要在哪一層hook,這個也需要你選擇,
因為只有殼app知道如何解密,所以這一步脫殼,還是需要知道這個原理,
#######
怎麼脫殼?
主要是兩種方式,
脫殼分為兩個方法
一個是手動脫殼,
一個是工具脫殼
###
脫殼-手動脫殼
通過動態除錯,跟蹤計算Dex原始檔的記憶體偏移地址,從記憶體中Dump出Dex檔案 難度大,暫存器,彙編,反除錯,反讀寫 IDA動態除錯:反除錯,彙編,計算記憶體地址
動態除錯,你要從記憶體裡面拿程式碼了,這種記憶體裡面的程式碼就是彙編了,甚至是機器碼,就不容易了,
而且可能人家還有反除錯,這種就很困難,
跟著app載入流程走,把記憶體中的檔案提出來,這個難度大,
####
脫殼-工具脫殼
工具脫殼又有兩種,
第一種:脫殼-工具脫殼-Xposed框架
Fdex2:Hook ClassLoader loadClass方法 通用脫殼 dumpDex:https://github.com/WrBug/dumpDex 這兩個工具就是apk,直接安裝就可以了,很簡單,不用處理,這兩個是在java層脫殼,
重點介紹一下fdex2,這個工具,
很好用,基本騰訊的樂加固,360的加固,都是可以脫殼的,
要使用這個工具,首先是要安裝這個Xposed,而手機要安裝這個,要先root,否則安裝不了,
使用已有工具會有問題:會發現很多的新的apk,都無法脫殼,技術晚半代至一代,可以脫老版本APPxposed框架也可以自己寫程式碼脫殼,但是這個java不會,所以不考慮,
####
第二種:脫殼-工具脫殼-frida框架
一個是hook技術,
改變程式執行流程的一種技術 在函式被呼叫前,通過HOOK技術,先得到該函式的控制權,實現該函式的邏輯改寫
我們之前繞過簽名是,改了人家的smali檔案,這樣不好,還好沒有做其他的校驗,否則你不一定能繞過,
frida框架
主要系統函式都已HOOK/基於xposed frida開發脫殼工具/有大神已開發上層應用模組
所以兩種辦法,還是hook技術比較好,既不需要修改原始碼,還不是太困難,
####
hook,一般是可以hook兩層,
1個是java層
1個native層,也就是so庫,這個難度大一點,裡面都是c語言,
###
###
#####