日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android 安全】DEX 加密 ( Java 工具开发 | 加密解密算法 API | 编译代理 Application 依赖库 | 解压依赖库 aar 文件 )

發布時間:2025/6/17 Android 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android 安全】DEX 加密 ( Java 工具开发 | 加密解密算法 API | 编译代理 Application 依赖库 | 解压依赖库 aar 文件 ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、加密解密算法 API
  • 二、編譯代理 Application 依賴庫
  • 三、解壓代理 Application 依賴庫 aar 文件



參考博客 :

  • 【Android 安全】DEX 加密 ( 常用 Android 反編譯工具 | apktool | dex2jar | enjarify | jd-gui | jadx )
  • 【Android 安全】DEX 加密 ( Proguard 簡介 | Proguard 相關網址 | Proguard 混淆配置 )
  • 【Android 安全】DEX 加密 ( Proguard 簡介 | 默認 ProGuard 分析 )
  • 【Android 安全】DEX 加密 ( Proguard keep 用法 | Proguard 默認混淆結果 | 保留類及成員混淆結果 | 保留注解以及被注解修飾的類/成員/方法 )
  • 【Android 安全】DEX 加密 ( Proguard 混淆 | 混淆后的報錯信息 | Proguard 混淆映射文件 mapping.txt )
  • 【Android 安全】DEX 加密 ( Proguard 混淆 | 將混淆后的報錯信息轉為原始報錯信息 | retrace.bat 命令執行目錄 | 暴露更少信息 )
  • 【Android 安全】DEX 加密 ( DEX 加密原理 | DEX 加密簡介 | APK 文件分析 | DEX 分割 )
  • 【Android 安全】DEX 加密 ( 多 DEX 加載 | 65535 方法數限制和 MultiDex 配置 | PathClassLoader 類加載源碼分析 | DexPathList )
  • 【Android 安全】DEX 加密 ( 不同 Android 版本的 DEX 加載 | Android 8.0 版本 DEX 加載分析 | Android 5.0 版本 DEX 加載分析 )
  • 【Android 安全】DEX 加密 ( DEX 加密使用到的相關工具 | dx 工具 | zipalign 對齊工具 | apksigner 簽名工具 )
  • 【Android 安全】DEX 加密 ( 支持多 DEX 的 Android 工程結構 )
  • 【Android 安全】DEX 加密 ( 代理 Application 開發 | multiple-dex-core 依賴庫開發 | 配置元數據 | 獲取 apk 文件并準備相關目錄 )
  • 【Android 安全】DEX 加密 ( 代理 Application 開發 | 解壓 apk 文件 | 判定是否是第一次啟動 | 遞歸刪除文件操作 | 解壓 Zip 文件操作 )
  • 【Android 安全】DEX 加密 ( 代理 Application 開發 | 加載 dex 文件 | 反射獲取系統的 Element[] dexElements )
  • 【Android 安全】DEX 加密 ( 代理 Application 開發 | 加載 dex 文件 | 使用反射獲取方法創建本應用的 dexElements | 各版本創建 dex 數組源碼對比 )
  • 【Android 安全】DEX 加密 ( Java 加密工具開發 | 加密解密算法 API | 編譯代理 Application 依賴庫 | 解壓依賴庫 aar 文件 ) )

在 【Android 安全】DEX 加密 ( 支持多 DEX 的 Android 工程結構 ) 博客中介紹了 DEX 加密工程的基本結構 ,

app 是主應用 , 其 Module 類型是 “Phone & Tablet Module” ,

multiple-dex-core 是 Android 依賴庫 , 其作用是解密并加載多 DEX 文件 , 其 Module 類型是 “Android Library” ,

multiple-dex-tools 是 Java 依賴庫 , 其類型是 “Java or Kotlin Library” , 其作用是用于生成主 DEX ( 主 DEX 的作用就是用于解密與加載多 DEX ) , 并且還要為修改后的 APK 進行簽名 ;


在 【Android 安全】DEX 加密 ( 代理 Application 開發 | multiple-dex-core 依賴庫開發 | 配置元數據 | 獲取 apk 文件并準備相關目錄 ) 博客中講解了 multiple-dex-core 依賴庫開發 , 每次啟動都要解密與加載 dex 文件 , 在該博客中講解到了 獲取 apk 文件 , 并準備解壓目錄 ;

在 【Android 安全】DEX 加密 ( 代理 Application 開發 | 解壓 apk 文件 | 判定是否是第一次啟動 | 遞歸刪除文件操作 | 解壓 Zip 文件操作 ) 博客中講解了 apk 文件解壓操作 ;

在 【Android 安全】DEX 加密 ( 代理 Application 開發 | 加載 dex 文件 | 反射獲取系統的 Element[] dexElements )博客中講解了 dex 文件加載第一階段 , 獲取系統中的 Element[] dexElements ;

在 【Android 安全】DEX 加密 ( 代理 Application 開發 | 加載 dex 文件 | 使用反射獲取方法創建本應用的 dexElements | 各版本創建 dex 數組源碼對比 ) 博客中講解了講解 dex 文件加載操作 第二階段 , 創建本應用的 dex 文件數組 Element[] dexElements ;

在 【Android 安全】DEX 加密 ( 代理 Application 開發 | 加載 dex 文件 | 將系統的 dexElements 與 應用的 dexElements 合并 | 替換操作 ) 博客中講解了剩余的兩個操作 :

  • 系統加載的 Element[] dexElements 數組 與 我們 自己的 Element[] dexElements 數組 進行合并操作 ;
  • 替換 ClassLoader 加載過程中的 Element[] dexElements 數組 ( 封裝在 DexPathList 中 )

本博客中介紹 加密解密算法 API , 編譯代理 Application 依賴庫 , 解壓依賴庫 aar 文件 ;





一、加密解密算法 API



先寫一個加密解密算法 , 該算法用于 dex 文件的 加密 / 解密 操作 ;


初始化 加密 / 解密 算法 : 根據算法類型 , 初始化 加密 / 解密 算法 ;

/*** 加密解密算法類型*/val algorithm = "AES/ECB/PKCS5Padding"// 初始化加密算法encryptCipher = Cipher.getInstance(algorithm)

設置密鑰 : 獲取密鑰的 Byte 數組類型 , 并創建 AES 密鑰 ;

// 將密鑰字符串轉為字節數組var keyByte = pwd.toByteArray()// 創建密鑰val key = SecretKeySpec(keyByte, "AES")

設置算法類型及密鑰 : 加密算法 , 傳入 Cipher.ENCRYPT_MODE 參數 , 解密算法 , 傳入 Cipher.DECRYPT_MODE 參數 ;

// 設置算法類型, 及密鑰encryptCipher.init(Cipher.ENCRYPT_MODE, key);// 設置算法類型, 及密鑰decryptCipher.init(Cipher.DECRYPT_MODE, key);

完整代碼示例 :

class AES {/*** 加密密鑰, 16 字節*/val DEFAULT_PWD = "kimhslmultiplede"/*** 加密解密算法類型*/val algorithm = "AES/ECB/PKCS5Padding"/*** 加密算法, 目前本應用中只需要加密, 不需要解密*/lateinit var encryptCipher: Cipher;/*** 解密算法*/lateinit var decryptCipher: Cipher;@ExperimentalStdlibApiconstructor(pwd: String){// 初始化加密算法encryptCipher = Cipher.getInstance(algorithm)// 初始化解密算法decryptCipher = Cipher.getInstance(algorithm)// 將密鑰字符串轉為字節數組var keyByte = pwd.toByteArray()// 創建密鑰val key = SecretKeySpec(keyByte, "AES")// 初始化加密算法encryptCipher.init(Cipher.ENCRYPT_MODE, key);// 初始化解密算法decryptCipher.init(Cipher.DECRYPT_MODE, key);}/*** 加密操作*/fun encrypt(contet : ByteArray) : ByteArray{var result : ByteArray = encryptCipher.doFinal(contet)return result}/*** 解密操作*/fun decrypt(contet : ByteArray) : ByteArray{var result : ByteArray = decryptCipher.doFinal(contet)return result}}



二、編譯代理 Application 依賴庫



生成 dex 文件 , 該 dex 文件中只包含解密 其它 dex 的功能

編譯配置 : 在 菜單欄 / File / Setting / Build, Execution, Deployment / Compiler 設置界面中 ,

勾選 Compile independent modules in parallel (may require larger ) 選項 ;


編譯工程 : 編譯工程時會生成 Android 依賴庫的 aar 文件 , 生成目錄是 module/build/outputs/aar/ 目錄下


獲取 multiple-dex-core-debug.aar 文件的另外一種方法 : 運行 Gradle 任務中的 Tasks/other/assembleDebug 任務 , 即可生成 multiple-dex-core-debug.aar 文件 ;


解壓獲取文件 ( 僅做參考 ) :

D:\002_Project\002_Android_Learn\DexEncryption\multiple-dex-core\build\outputs\aar

路徑下的 multiple-dex-core-debug.aar 文件后綴修改為 .zip

解壓上述文件 , 拿到 classes.jar 文件即可 ;

該 classes.jar 就是 multiple-dex-core 的 Android 依賴庫中的 ProxyApplication.kt Kotlin 文件 編譯出的 jar 包 ;

上述 解壓文件僅做 參考 , 實際使用時 , 在程序中使用代碼解壓 ;





三、解壓代理 Application 依賴庫 aar 文件



獲取 multiple-dex-core-debug.aar 文件對象

// 獲取 multiple-dex-core-debug.aar 文件對象var aarFile = File("multiple-dex-core/build/outputs/aar/multiple-dex-core-debug.aar")

解壓上述 multiple-dex-core-debug.aar 文件到 aarUnzip 目錄中 , 先創建解壓目錄 ;

// 解壓上述 multiple-dex-core-debug.aar 文件到 aarUnzip 目錄中// 創建解壓目錄var aarUnzip = File("multiple-dex-tools/aarUnzip")

正式解壓 , unZipAar 方法在下面完整代碼中 ;

// 解壓操作unZipAar(aarFile, aarUnzip)

拿到 multiple-dex-core-debug.aar 中解壓出來的 classes.jar 文件

// 拿到 multiple-dex-core-debug.aar 中解壓出來的 classes.jar 文件var classesJarFile = File(aarUnzip, "classes.jar")

完整代碼示例 :

fun main() {/*1 . 生成 dex 文件 , 該 dex 文件中只包含解密 其它 dex 的功能編譯工程會生成 Android 依賴庫的 aar 文件生成目錄是 module/build/outputs/aar/ 目錄下前提是需要在 菜單欄 / File / Setting / Build, Execution, Deployment / Compiler設置界面中 , 勾選 Compile independent modules in parallel (may require larger )將 D:\002_Project\002_Android_Learn\DexEncryption\multiple-dex-core\build\outputs\aar路徑下的 multiple-dex-core-debug.aar 文件后綴修改為 .zip解壓上述文件拿到 classes.jar 文件即可 ;*/// 獲取 multiple-dex-core-debug.aar 文件對象var aarFile = File("multiple-dex-core/build/outputs/aar/multiple-dex-core-debug.aar")// 解壓上述 multiple-dex-core-debug.aar 文件到 aarUnzip 目錄中// 創建解壓目錄var aarUnzip = File("multiple-dex-tools/aarUnzip")// 解壓操作unZipAar(aarFile, aarUnzip)// 拿到 multiple-dex-core-debug.aar 中解壓出來的 classes.jar 文件var classesJarFile = File(aarUnzip, "classes.jar") }/*** 刪除文件, 如果有目錄, 則遞歸刪除*/ private fun deleteFile(file: File) {if (file.isDirectory) {val files = file.listFiles()for (f in files) {deleteFile(f)}} else {file.delete()} }/*** 解壓文件* @param zip 被解壓的壓縮包文件* @param dir 解壓后的文件存放目錄*/ fun unZipAar(zip: File, dir: File) {try {// 如果存放文件目錄存在, 刪除該目錄deleteFile(dir)// 獲取 zip 壓縮包文件val zipFile = ZipFile(zip)// 獲取 zip 壓縮包中每一個文件條目val entries = zipFile.entries()// 遍歷壓縮包中的文件while (entries.hasMoreElements()) {val zipEntry = entries.nextElement()// zip 壓縮包中的文件名稱 或 目錄名稱val name = zipEntry.name// 如果 apk 壓縮包中含有以下文件 , 這些文件是 V1 簽名文件保存目錄 , 不需要解壓 , 跳過即可if (name == "META-INF/CERT.RSA" || name == "META-INF/CERT.SF" || (name== "META-INF/MANIFEST.MF")) {continue}// 如果該文件條目 , 不是目錄 , 說明就是文件if (!zipEntry.isDirectory) {val file = File(dir, name)// 創建目錄if (!file.parentFile.exists()) {file.parentFile.mkdirs()}// 向剛才創建的目錄中寫出文件val fileOutputStream = FileOutputStream(file)val inputStream = zipFile.getInputStream(zipEntry)val buffer = ByteArray(1024)var len: Intwhile (inputStream.read(buffer).also { len = it } != -1) {fileOutputStream.write(buffer, 0, len)}inputStream.close()fileOutputStream.close()}}// 關閉 zip 文件zipFile.close()} catch (e: Exception) {e.printStackTrace()} } 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的【Android 安全】DEX 加密 ( Java 工具开发 | 加密解密算法 API | 编译代理 Application 依赖库 | 解压依赖库 aar 文件 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。