當前位置:
首頁 > 最新 > Android應用安全,防反編譯實踐

Android應用安全,防反編譯實踐

首先,我個人的看法是,真正廣泛對外發布的應用,其代碼無法被真正保護。因為如果有人或者組織,真的願意不計代價投入,最終是可以將你的應用破解,得到源碼的。但這並不意味著應用的安全保護措施就沒有意義,所有的應用安全策略,都是在努力以較小的代價,增加應用的安全性,使潛在攻擊者破解應用需要付出巨大的代價和高昂的成本,讓其破解行為得不償失,主動放棄破解,從而保護我們的應用。以下是個人當下在第一階段學習和實踐的安全策略,做個記錄。


混淆是一種用來隱藏程序意圖的技術,可以增加代碼閱讀的難度,使攻擊者難以全面掌控app內部實現邏輯,從而增加逆向工程和破解的難度,防止知識產權被竊取。

代碼混淆技術主要做了如下的工作:

1、通過對代碼類名,函數名做替換來實現代碼混淆保護;

2、簡單的邏輯分支混淆。

已經有很多第三方的軟體可以用來混淆我們的Android應用,常見的有:

Proguard

DashO

Dexguard

DexProtector

ApkProtect

Shield4j

Stringer

Allitori

這些混淆器在代碼中起作用的層次是不一樣的。Android編譯的大致流程如下:

有的混淆器是在編譯之前直接作用於java源代碼,有的作用於java位元組碼,有的作用於Dalvik位元組碼。但基本都是針對java層作混淆。

在Android中,可以直接使用Proguard進行代碼混淆,方式很簡單,在build.gradle中配置即可,如圖

代碼混淆的好處是:

1、將類、欄位和方法使用短小無意義的名稱進行重命名,使代碼可閱讀性變差,要全面掌控代碼邏輯難度變大;

2、可以優化位元組碼,刪除未使用的指令,使得安裝包體積變小。

其缺陷在於:

1、無法真正保護代碼不被反編譯;

2、在應對動態調試逆向分析上無效;

3、通過驗證本地簽名的機制很容易被繞過。

也就是說,代碼混淆並不能有效的保護應用自身。

理論基礎:

Android中的每個應用都是有一個唯一的簽名。但是這個簽名在之前是可以被偽造,並實現為此打包的。

實踐方法

為了防止應用被二次打包,或者是需要破解我們的apk的操作,在入口處添加簽名驗證,如果發現應用的簽名不正確就立即退出程序。我們可以在應用啟動的時候獲取應用的簽名信息,與正式簽名內容進行比較,若發現簽名不一致,直接退出應用。如圖:

問題點:

如果破解者精通Smali語法,完全可以在對應類的.smali文件中直接修改返回值

如圖:

三、反調試

對外發布的版本是release版本,在其中增加應用調試狀態的檢測,一旦發現應用處於調試狀態,立即採取對應措施。

1、檢測應用是否處於調試狀態

2、驗證apk是否開啟了調試,以及是否有debugger已經連接

3、檢測進程的TracerPid(TracerPid正常情況是0,如果被調試這個是不為0的)

4、檢測應用是不是運行在一台模擬器中


理論基礎:

完整性校驗就是我們用各種演算法來計算一個文件的完整性,防止這個文件被修改。

其中常用的方法就是計算一個文件的CRC32的值或者計算一個文件的哈希值。我們在防止apk被反編譯的方法中也可以採用這種方法。我們知道apk生成的classes.dex主要由java文件生成的,它是整個apk的邏輯實現。所以我們可以對classes.dex文件進行完整性校驗,來保證整個程序的邏輯不被修改。如果我們想要保證整個apk文件的完整性,也可以對整個apk文件進行完整性校驗。下面我們分別來實現對classes.dex文件和apk文件的完整性校驗。

實踐方法

通過對classes的crc值進行對比判斷,可以確定apk是否有被修改。本地的crc值可以自己判斷得出,每個版本發布應用的crc值在掛包時上傳到伺服器,通過介面獲取,然後和本地crc值進行對比。

問題點

1、破解者篡改從伺服器獲取到的值,或者直接改掉比較結果。代碼混淆可以提升破解者定位到是哪個方法進行判斷的難度。

2、如果app上傳crc值,由伺服器判斷,然後直接使用伺服器返回的判斷結果,可否避免結果被篡改?


apktool :

用途:主要查看res文件下xml文件、AndroidManifest.xml和圖片。(注意:如果直接解壓.apk文件,xml文件打開全部是亂碼)

下載地址:https://ibotpeaches.github.io/Apktool/install/

下載兩個文件apktool.bat和apktool.jar(這個如果你下載的文件有版本號,比如apktool_2.2.1.jar,就要改名字為apktool.jar), 然後把上面兩個文件都放到C://Windows下面。

官網教程:https://ibotpeaches.github.io/Apktool/#

使用方法:即:運行CMD,進入XTCWatch_5.3.5.apk所在目錄,然後運行apktool d XTCWatch_5.3.5.apk就可以了,默認解壓的文件就在XTCWatch_5.3.5.apk所在目錄。

dex2jar

用途:將apk反編譯成Java源碼(classes.dex轉化成jar文件)

步驟:1、將要反編譯的APK後綴名改為.rar或則 .zip,並解壓,得到其中的額classes.dex文件(它就是java文件編譯再通過dx工具打包而成的)

2、將獲取到的classes.dex放到之前解壓出來的工具dex2jar-2.0文件夾內

3、在命令行下定位到d2j-dex2jar.bat所在目錄,輸入:

即可得到jar文件,效果如下:

在dex2jar-2.0目錄下會生成一個classes_dex2jar.jar的文件,然後打開工具jd-gui文件夾里的jd-gui.exe,之後用該工具打開之前生成的classes_dex2jar.jar文件,便可以看到源碼了。

jd-gui

作用:查看APK中classes.dex轉化成出的jar文件,即源碼文件

如下圖是網易雲音樂的源碼文件:

如下圖是微信的源碼文件:

應用安全包含的東西比較多,以上是初步學習和實踐的小結,接下來會在對抗jd-gui、防抓包、防克隆、下載文件安全性檢驗、應用加殼、Smali語法等方面進行一些學習和實踐。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 千億星辰 的精彩文章:

TAG:千億星辰 |