個人部落格
Android應用加固的簡單實現方案(二)
前言
上一篇文章介紹了基於dex加固方案的兩種具體實現。相對於手動加固,基於gradle實現的加固方案效率有了進一步提升。但是,還是需要在殼Module中增加util相關工具類的引用,為進一步減少程式碼侵入性,在前面方案的基礎上,進一步完善外掛的功能。
實現原理
為了避免在殼Module中引入脫殼相關的工具類,可以在aar生成後,利用ASM生成需要的class檔案,然後修改aar中的classes.jar檔案,將我們生成的class檔案加入到classes.jar中。而殼Module的啟動Application也需要在編譯後修改attachBaseContext方法,加入脫殼程式碼的引用。這塊都可以通過修改class中的方法來實現。而脫殼後,實質上還是執行apk中的程式碼,因此,apk中也需要對應修改以上兩種。
具體實現可以參考原始碼:
使用步驟
下面主要介紹外掛生成後的使用:
- 專案根目錄下的build.gradle中引入外掛
buildscript {
repositories {
//...
maven {
url uri('E:\\Repository')
}
//...
}
dependencies {
//...
classpath 'com.wangyz.plugins:ShellPlugin:1.0.0'
//...
}
}
allprojects {
repositories {
//...
maven {
url uri('E:\\Repository')
}
//...
}
}
複製程式碼
- app模組下的build.gradle引入外掛及配置外掛
apply plugin: 'com.wangyz.plugins.ShellPlugin'
//主要注意shellModuleName和shellApplication的配置
shellConfig {
//殼Module的名稱
shellModuleName = 'shell'
//殼Module中Application的全類名
shellApplication = 'com.wangyz.shell.ShellApplication'
keyStore = 'E:\\Code\\Android\\android.keystore'
keyStorePassword = 'android'
keyPassword = 'android'
alias = 'android'
}
複製程式碼
- 殼Module中增加繼承自Application的自定義Application,如這裡的ShellApplication,然後重寫attachBaseContext方法
public class ShellApplication extends Application {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
}
}
複製程式碼
-
sync工程
-
在打包apk前,先執行Build-Clean Project,然後雙擊gradle皮膚的app/Tasks/build/assembleRelease,就會在專案根目錄/殼Module名稱-release/outputs/下生成signed.apk,這個apk就是加固過的apk.
注意事項
-
這裡只是演示加固的思路,對於加密部分,只是用了簡單的^操作,具體可以自己換成AES,RSA或者其它加密方式。
-
外掛會用到dx,gralde的命令,因此需要配置這兩個的路徑
-
外掛會用到ASM,在編譯出class後修改class。經過實踐,發現在生成apk後,沒有修改過程式碼或者沒有執行sync的操作後,transform的回撥不會走,因此也不會執行修改class的邏輯,因此在每次生成加固apk前,需要執行clean專案的操作。
-
引入外掛後的配置檔案一定不能錯,重點關注shellModuleName和shellApplication,否則會導致生成的apk無法正常使用。
原始碼
原始碼地址:github.com/milovetingt…