安卓逆向4:app加固原理,app脫殼原理


####

app加固原理

####

首先是為什么要加固app?

加固,就是為了防止被很容易的被逆向,逆向就是說把app的源代碼摳出來,比如游戲app,如果別人想要抄襲我,逆向之后,把代碼拿去,然后就可以用,后台都有,這是很危險的,

所以要加固,讓你難以逆向,這不是完全杜絕,而是相對比較難,

###

然后是一般app都是怎么加固的?

一般不會自己公司加固,而是用的第三方加固, 比如應用市場的加固,所以你發布上去應用市場,要求是沒有加固的,防止這個app有一些敏感的功能,違法的功能,做壞事的功能,

然后是應用市場給你加固,加固之后然后發布出去,

有的應用市場不嚴格,可能允許你上傳加固的app,這是為了讓別人上傳更多的app,

可以選擇用還是不用他們應用市場的加固方案,可以不用,所以不是所有的app都有加固的,

每一個應用市場,都有自己的加固方案,

 比如360,騰訊,這兩個搞定了,其他的都不用管,因為大部分app都在這些應用市場了,

加固的方案基本就是dex加固和so加固,

加固還分為收費和免費,要更好的加固,是收費的,

 

為什么360應用市場,會看到騰訊樂加固的app,

這是為了豐富生態,有些應用市場,會抓取別的應用市場的,

 

還有脫殼的時候,可以在不同的應用市場,下載app,因為不同的應用市場,是不同的,脫殼難度也是不同的,

有的應用市場什么是沒有加固的,所以要注意技巧,

 

 

####

怎么判斷一個app有沒有加固?

舉例:

使用反編譯的方法,比如jadx工具,apktool反編譯,看目錄結構

找到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,

###

現在加固了之后,你反編譯就不行了,看不到源代碼了,

所以必須要解決脫殼的問題,

###

加固方式,

一般就是dex加固和so加固。

最普遍的是dex加固,因為so加固需要一個公司的開發會c語言,

 

 

 

 

 

###

app脫殼原理:

脫殼的原理

 

 

在殼app解密源apk的dex之后,源apk被加載之前,攔截這個過程中的系統函數,把內存中的dex文件dump拿出來,

這個中間的流程是很長的,你要在哪一層hook,這個也需要你選擇,

因為只有殼app知道如何解密,所以這一步脫殼,還是需要知道這個原理,

 

#######

怎么脫殼?

還有脫殼的時候,可以在不同的應用市場,下載app,因為不同的應用市場,是不同的,脫殼難度也是不同的,

有的應用市場什么是沒有加固的,所以要注意技巧,

 

脫殼主要是兩種方式,

脫殼分為兩個方法

一個是手動脫殼,

一個是工具脫殼

###

脫殼必須要對加固的流程熟悉,你越熟悉越知道怎么脫殼,

脫殼的方法很多,可以在不同層脫殼,但是方法原理都是一樣的,就是從內存里面把解密的源app代碼拿出來,

###

脫殼,要了解dex文件的格式,

dex文件包含校驗位,簽名,還有文件大小,

這個簽名就是app簽名,這個簽名會進入這個dex文件,

因為這個原理,可以根據大小來計算內存偏移量,從內存拿取數據,

 

###

脫殼-手動脫殼

通過動態調試,跟蹤計算Dex源文件的內存偏移地址,從內存中Dump出Dex文件
難度大,寄存器,匯編,反調試,反讀寫
IDA

動態調試:反調試,匯編,計算內存地址

動態調試,你要從內存里面拿代碼了,這種內存里面的代碼就是匯編了,甚至是機器碼,就不容易了,

而且可能人家還有反調試,這種就很困難,

跟着app加載流程走,把內存中的文件提出來,這個難度大,

 

---->常用的脫殼方法,還是hook,

####

脫殼-工具脫殼

工具脫殼又有兩種,

第一種:脫殼-工具脫殼-Xposed框架

Fdex2:Hook ClassLoader loadClass方法 通用脫殼
dumpDex:https://github.com/WrBug/dumpDex 
 
這兩個工具就是apk,直接安裝就可以了,很簡單,不用處理,

這兩個是在java層脫殼,

重點介紹一下fdex2,這個工具,

很好用,基本騰訊的樂加固,360的加固,都是可以脫殼的,

要使用這個工具,首先是要安裝這個Xposed,而手機要安裝這個,要先root,否則安裝不了,

 

使用已有工具會有問題:會發現很多的新的apk,都無法脫殼,技術晚半代至一代,可以脫老版本APP 

xposed框架也可以自己寫代碼脫殼,但是這個java不會,所以不考慮,

 

具體這個fdex2,脫殼的原理是什么?

后續還是要研究一下,

####

第二種:脫殼-工具脫殼-frida框架

一個是hook技術,

改變程序執行流程的一種技術 在函數被調用前,通過HOOK技術,先得到該函數的控制權,實現該函數的邏輯改寫

我們之前繞過簽名是,改了人家的smali文件,這樣不好,還好沒有做其他的校驗,否則你不一定能繞過,

frida框架

主要系統函數都已HOOK/基於xposed frida開發脫殼工具/有大神已開發上層應用模塊

 

所以兩種辦法,還是hook技術比較好,既不需要修改源碼,還不是太困難,

####

hook,一般是可以hook兩層,

1個是java層,這個比較好hook,

1個native層,也就是so庫,這個難度大一點,難在看不到源代碼,內部的邏輯都是匯編,

hook的基礎是要看到源代碼,找到函數,所以hook的前提首先是要脫殼,

這個地方有一個疑點,既然是用hook脫殼,而hook又要先脫殼,這不是悖論了???

 

 

 

 

####

加固后的apk的so文件是有特征的,

那可能會從360應用市場下載下來的apk是使用的騰訊的加固方案,這是怎么回事?

可能是應用市場為了豐富自己的apk的生態,然后掃描別的應用市場,然后把自己沒有的包,拿過來,

可以多個應用市場都下載一下apk,有的apk在別的應用市場是沒有加固過的,這樣就方便了,

###

 dex加固,這種就是第三方的加固,

so加固,主要是把核心代碼放到so文件,保護代碼,是c語言寫的,

大部分加固都是dex加固,大廠的產品可能使用so加固,因為需要有c工程師才可以,

###

hook一般是兩種

一個是hook java層,這個就是hookapk的源代碼,這個比較簡單

一個是hook,native層,so庫,這個比較難,需要看懂c語言,看懂匯編代碼,

hook 的前提,你必須要知道函數或者方法名是什么,否則你怎么hook呢,

###

脫殼的原理就是因為不管怎么加固apk,你都要把源apk的代碼加載到內存,運行源apk,這就是脫殼的原理,

 

 

 

###

大廠的app為什么不常加殼,但是小app加殼,

因為大廠的app代碼很大,加殼的話會有性能問題,而且兼容性會報錯,

所以大廠寧願犧牲一些安全性,但是防止客戶的流失率,

那怎么保證安全性,就是混淆,混淆的比較厲害, 

 

#####


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM