日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

【Android 安全】DEX 加密 ( 阶段总结 | 主应用 | 代理 Application | Java 工具 | 代码示例 ) ★

發(fā)布時(shí)間:2025/6/17 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android 安全】DEX 加密 ( 阶段总结 | 主应用 | 代理 Application | Java 工具 | 代码示例 ) ★ 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 一、主應(yīng)用
  • 二、代理 Application 解析
    • 1、代理 Application 源碼
    • 2、反射對(duì)象成員以及方法的工具類
    • 3、壓縮解壓縮工具類
    • 4、OpenSSL 解密工具類
    • 5、OpenSSL 解密相關(guān) NDK 源碼
    • 6、CmakeLists.txt 構(gòu)建腳本
    • 7、NDK 日志頭文件
    • 8、build.gradle 構(gòu)建腳本
  • 三、Java 工具
    • 1、主函數(shù)
    • 2、加密相關(guān)工具類



相關(guān)資源 :

  • 本階段源碼下載 : https://download.csdn.net/download/han1202012/13214384 ( 快照 )
  • GitHub 地址 : https://github.com/han1202012/DexEncryption ( 完整代碼 )




一、主應(yīng)用



在主應(yīng)用中 , 進(jìn)行兩個(gè)操作 :

  • 操作一 : 配置 AndroidManifest.xml 中的 代理 Application ;
  • 操作二 : 配置 真實(shí) Application 全類名 , 以及 版本號(hào) ;
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"package="kim.hsl.dex"><applicationandroid:name="kim.hsl.multipledex.ProxyApplication"android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><!-- app_name 值是該應(yīng)用的 Application 的真實(shí)全類名真實(shí) Application : kim.hsl.dex.MyApplication代理 Application : kim.hsl.multipledex.ProxyApplication --><meta-data android:name="app_name" android:value="kim.hsl.dex.MyApplication"/><!-- DEX 解密之后的目錄名稱版本號(hào) , 完整目錄名稱為 :kim.hsl.dex.MyApplication_1.0 --><meta-data android:name="app_version" android:value="\1.0"/><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

配置 NDK 的 CPU 架構(gòu) : 只配置 armeabi-v7a 架構(gòu)即可 ;

apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions'android {compileSdkVersion 29buildToolsVersion "30.0.2"defaultConfig {applicationId "kim.hsl.dex"minSdkVersion 18targetSdkVersion 29versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"externalNativeBuild{cmake{// 配置要編譯動(dòng)態(tài)庫(kù)的 CPU 架構(gòu), 這里編譯 armeabi-v7a 版本的動(dòng)態(tài)庫(kù)// arm64-v8a, armeabi-v7a, x86, x86_64abiFilters 'armeabi-v7a'}}}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}externalNativeBuild {cmake {path "src/main/cpp/CMakeLists.txt"version "3.10.2"}} }dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"implementation 'androidx.appcompat:appcompat:1.2.0'implementation 'androidx.core:core-ktx:1.3.2'implementation 'androidx.constraintlayout:constraintlayout:2.0.4'testImplementation 'junit:junit:4.12'androidTestImplementation 'androidx.test.ext:junit:1.1.2'androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'implementation project(':multiple-dex-core') }



二、代理 Application 解析



代理 Application 操作步驟 :

  • 1 . 獲取 APK 文件 : 獲取本應(yīng)用的 APK 文件 ;
  • 2 . 獲取相關(guān)元數(shù)據(jù) : 獲取在主應(yīng)用 AndroidManifest.xml 中配置的 真實(shí) Application 全類名 , 以及版本號(hào)信息 ;
  • 3 . 創(chuàng)建工作目錄 : 創(chuàng)建用戶私有目錄 , 將 APK 文件解壓到該目錄中 ;
  • 4 . 解密 dex 文件 : 遍歷被解壓的目錄 , 發(fā)現(xiàn)被加密的 dex 文件后 , 將該 dex 文件解密為可以直接使用的 dex 文件 ;
  • 5 . 獲取 DexPathList 對(duì)象 : 反射獲取 BaseDexClassLoader 中的 DexPathList 成員 ;
  • 6 . 獲取 Element[] dexElements 數(shù)組 : 反射獲取 DexPathList 中的 Element[] dexElements 數(shù)組成員 ;
  • 7 . 獲取創(chuàng)建 Element[] dexElements 數(shù)組方法 : 6.06.06.0 以下系統(tǒng)獲取 makeDexElements 方法 , 7.07.07.0 以上系統(tǒng)獲取 makePathElements 方法 ;
  • 8 . 創(chuàng)建 Element[] dexElements 數(shù)組 : 調(diào)用上述反射的方法創(chuàng)建 Element[] dexElements 數(shù)組 ;
  • 9 . 合并并設(shè)置 Element[] dexElements 數(shù)組 : 將上述創(chuàng)建的 Element[] dexElements 數(shù)組 與 原本的 Element[] dexElements 數(shù)組 合并 , 設(shè)置給 DexPathList 中的 Element[] dexElements 數(shù)組成員 ;


1、代理 Application 源碼


package kim.hsl.multipledex;import android.app.Application; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.os.Build; import android.os.Bundle; import android.text.TextUtils; import android.util.Log;import java.io.File; import java.io.IOException; import java.lang.reflect.Array; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List;public class ProxyApplication extends Application {public static final String TAG = "ProxyApplication";/*** 應(yīng)用真實(shí)的 Application 全類名*/String app_name;/*** DEX 解密之后的目錄名稱*/String app_version;/*** 在 Application 在 ActivityThread 中被創(chuàng)建之后,* 第一個(gè)調(diào)用的方法是 attachBaseContext 函數(shù).* 該函數(shù)是 Application 中最先執(zhí)行的函數(shù).*/@Overrideprotected void attachBaseContext(Context base) {super.attachBaseContext(base);try {Log.i(TAG, "attachBaseContext");/*在該 Application 中主要進(jìn)行兩個(gè)操作 :1 . 解密并加載多個(gè) DEX 文件2 . 將真實(shí)的 Application 替換成應(yīng)用的主 Application*//*I . 解密與加載多 DEX 文件先進(jìn)行解密, 然后再加載解密之后的 DEX 文件1. 先獲取當(dāng)前的 APK 文件2. 然后解壓該 APK 文件*/// 獲取當(dāng)前的 APK 文件, 下面的 getApplicationInfo().sourceDir 就是本應(yīng)用 APK 安裝文件的全路徑File apkFile = new File(getApplicationInfo().sourceDir);// 獲取在 app Module 下的 AndroidManifest.xml 中配置的元數(shù)據(jù),// 應(yīng)用真實(shí)的 Application 全類名// 解密后的 dex 文件存放目錄ApplicationInfo applicationInfo = null;applicationInfo = getPackageManager().getApplicationInfo(getPackageName(),PackageManager.GET_META_DATA);Bundle metaData = applicationInfo.metaData;if (metaData != null) {// 檢查是否存在 app_name 元數(shù)據(jù)if (metaData.containsKey("app_name")) {app_name = metaData.getString("app_name").toString();}// 檢查是否存在 app_version 元數(shù)據(jù)if (metaData.containsKey("app_version")) {app_version = metaData.getString("app_version").toString();}}// 創(chuàng)建用戶的私有目錄 , 將 apk 文件解壓到該目錄中File privateDir = getDir(app_name + "_" + app_version, MODE_PRIVATE);Log.i(TAG, "attachBaseContext 創(chuàng)建用戶的私有目錄 : " + privateDir.getAbsolutePath());// 在上述目錄下創(chuàng)建 app 目錄// 創(chuàng)建該目錄的目的是存放解壓后的 apk 文件的File appDir = new File(privateDir, "app");// app 中存放的是解壓后的所有的 apk 文件// app 下創(chuàng)建 dexDir 目錄 , 將所有的 dex 目錄移動(dòng)到該 dexDir 目錄中// dexDir 目錄存放應(yīng)用的所有 dex 文件// 這些 dex 文件都需要進(jìn)行解密File dexDir = new File(appDir, "dexDir");// 遍歷解壓后的 apk 文件 , 將需要加載的 dex 放入如下集合中ArrayList<File> dexFiles = new ArrayList<File>();// 如果該 dexDir 不存在 , 或者該目錄為空 , 并進(jìn)行 MD5 文件校驗(yàn)if (!dexDir.exists() || dexDir.list().length == 0) {// 將 apk 中的文件解壓到了 appDir 目錄ZipUtils.unZipApk(apkFile, appDir);// 獲取 appDir 目錄下的所有文件File[] files = appDir.listFiles();Log.i(TAG, "attachBaseContext appDir 目錄路徑 : " + appDir.getAbsolutePath());Log.i(TAG, "attachBaseContext appDir 目錄內(nèi)容 : " + files);// 遍歷文件名稱集合for (int i = 0; i < files.length; i++) {File file = files[i];Log.i(TAG, "attachBaseContext 遍歷 " + i + " . " + file);// 如果文件后綴是 .dex , 并且不是 主 dex 文件 classes.dex// 符合上述兩個(gè)條件的 dex 文件放入到 dexDir 中if (file.getName().endsWith(".dex") &&!TextUtils.equals(file.getName(), "classes.dex")) {// 篩選出來(lái)的 dex 文件都是需要解密的// 解密需要使用 OpenSSL 進(jìn)行解密// 獲取該文件的二進(jìn)制 Byte 數(shù)據(jù)// 這些 Byte 數(shù)組就是加密后的 dex 數(shù)據(jù)byte[] bytes = OpenSSL.getBytes(file);// 解密該二進(jìn)制數(shù)據(jù), 并替換原來(lái)的加密 dex, 直接覆蓋原來(lái)的文件即可OpenSSL.decrypt(bytes, file.getAbsolutePath());// 將解密完畢的 dex 文件放在需要加載的 dex 集合中dexFiles.add(file);// 拷貝到 dexDir 中Log.i(TAG, "attachBaseContext 解密完成 被解密文件是 : " + file);}// 判定是否是需要解密的 dex 文件}// 遍歷 apk 解壓后的文件} else {// 已經(jīng)解密完成, 此時(shí)不需要解密, 直接獲取 dexDir 中的文件即可for (File file : dexDir.listFiles()) {dexFiles.add(file);}}Log.i(TAG, "attachBaseContext 解密完成 dexFiles : " + dexFiles);for(int i = 0; i < dexFiles.size(); i ++){Log.i(TAG, i + " . " + dexFiles.get(i).getAbsolutePath());}// 截止到此處 , 已經(jīng)拿到了解密完畢 , 需要加載的 dex 文件// 加載自己解密的 dex 文件loadDex(dexFiles, privateDir);Log.i(TAG, "attachBaseContext 完成");} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}/*** 加載 dex 文件集合* 這些 dex 文件已經(jīng)解密* 參考博客 : https://hanshuliang.blog.csdn.net/article/details/109608605* <p>* 創(chuàng)建自己的 Element[] dexElements 數(shù)組* ( libcore/dalvik/src/main/java/dalvik/system/DexPathList.java )* 然后將 系統(tǒng)加載的 Element[] dexElements 數(shù)組 與 我們自己的 Element[] dexElements 數(shù)組進(jìn)行合并操作*/void loadDex(ArrayList<File> dexFiles, File optimizedDirectory)throwsIllegalAccessException,InvocationTargetException,NoSuchFieldException,NoSuchMethodException {Log.i(TAG, "loadDex");/*需要執(zhí)行的步驟1 . 獲得系統(tǒng) DexPathList 中的 Element[] dexElements 數(shù)組( libcore/dalvik/src/main/java/dalvik/system/DexPathList.java )2 . 在本應(yīng)用中創(chuàng)建 Element[] dexElements 數(shù)組 , 用于存放解密后的 dex 文件3 . 將 系統(tǒng)加載的 Element[] dexElements 數(shù)組與 我們自己的 Element[] dexElements 數(shù)組進(jìn)行合并操作4 . 替換 ClassLoader 加載過(guò)程中的 Element[] dexElements 數(shù)組 ( 封裝在 DexPathList 中 )*//*1 . 獲得系統(tǒng) DexPathList 中的 Element[] dexElements 數(shù)組第一階段 : 在 Context 中調(diào)用 getClassLoader() 方法 , 可以拿到 PathClassLoader ;第二階段 : 從 PathClassLoader 父類 BaseDexClassLoader 中找到 DexPathList ;第三階段 : 獲取封裝在 DexPathList 類中的 Element[] dexElements 數(shù)組 ;上述的 DexPathList 對(duì)象 是 BaseDexClassLoader 的私有成員Element[] dexElements 數(shù)組 也是 DexPathList 的私有成員因此只能使用反射獲取 Element[] dexElements 數(shù)組*/// 階段一二 : 調(diào)用 getClassLoader() 方法可以獲取 PathClassLoader 對(duì)象// 從 PathClassLoader 對(duì)象中獲取 private final DexPathList pathList 成員Field pathListField = ReflexUtils.reflexField(getClassLoader(), "pathList");// 獲取 classLoader 對(duì)象對(duì)應(yīng)的 DexPathList pathList 成員Object pathList = pathListField.get(getClassLoader());//階段三 : 獲取封裝在 DexPathList 類中的 Element[] dexElements 數(shù)組Field dexElementsField = ReflexUtils.reflexField(pathList, "dexElements");// 獲取 pathList 對(duì)象對(duì)應(yīng)的 Element[] dexElements 數(shù)組成員Object[] dexElements = (Object[]) dexElementsField.get(pathList);/*2 . 在本應(yīng)用中創(chuàng)建 Element[] dexElements 數(shù)組 , 用于存放解密后的 dex 文件不同的 Android 版本中 , 創(chuàng)建 Element[] dexElements 數(shù)組的方法不同 , 這里需要做兼容*/Method makeDexElements;Object[] addElements = null;if (Build.VERSION.SDK_INT <=Build.VERSION_CODES.M) { // 5.0, 5.1 makeDexElements// 反射 5.0, 5.1, 6.0 版本的 DexPathList 中的 makeDexElements 方法makeDexElements = ReflexUtils.reflexMethod(pathList, "makeDexElements",ArrayList.class, File.class, ArrayList.class);ArrayList<IOException> suppressedExceptions = new ArrayList<IOException>();addElements = (Object[]) makeDexElements.invoke(pathList, dexFiles,optimizedDirectory,suppressedExceptions);} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // 7.0 以上版本 makePathElements// 反射 7.0 以上版本的 DexPathList 中的 makeDexElements 方法makeDexElements = ReflexUtils.reflexMethod(pathList, "makePathElements",List.class, File.class, List.class);ArrayList<IOException> suppressedExceptions = new ArrayList<IOException>();addElements = (Object[]) makeDexElements.invoke(pathList, dexFiles,optimizedDirectory,suppressedExceptions);}/*3 . 將 系統(tǒng)加載的 Element[] dexElements 數(shù)組與 我們自己的 Element[] dexElements 數(shù)組進(jìn)行合并操作首先創(chuàng)建數(shù)組 , 數(shù)組類型與 dexElements 數(shù)組類型相同將 dexElements 數(shù)組中的元素拷貝到 newElements 前半部分, 拷貝元素個(gè)數(shù)是 dexElements.size將 addElements 數(shù)組中的元素拷貝到 newElements 后半部分, 拷貝元素個(gè)數(shù)是 dexElements.size*/Object[] newElements = (Object[]) Array.newInstance(dexElements.getClass().getComponentType(),dexElements.length + addElements.length);// 將 dexElements 數(shù)組中的元素拷貝到 newElements 前半部分, 拷貝元素個(gè)數(shù)是 dexElements.sizeSystem.arraycopy(dexElements, 0, newElements, 0, dexElements.length);// 將 addElements 數(shù)組中的元素拷貝到 newElements 后半部分, 拷貝元素個(gè)數(shù)是 dexElements.sizeSystem.arraycopy(addElements, 0, newElements, dexElements.length, addElements.length);/*4 . 替換 ClassLoader 加載過(guò)程中的 Element[] dexElements 數(shù)組 ( 封裝在 DexPathList 中 )*/dexElementsField.set(pathList, newElements);Log.i(TAG, "loadDex 完成");} }

2、反射對(duì)象成員以及方法的工具類


反射對(duì)象成員以及方法的工具類 :

package kim.hsl.multipledex;import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Arrays;public class ReflexUtils {/*** 通過(guò)反射方法獲取 instance 類中的 memberName 名稱的成員* @param instance 成員所在對(duì)象* @param memberName 成員變量名稱* @return 返回 Field 類型成員* @throws NoSuchFieldException*/public static Field reflexField(Object instance, String memberName) throws NoSuchFieldException {// 獲取字節(jié)碼類Class clazz = instance.getClass();// 循環(huán)通過(guò)反射獲取// 可能存在通過(guò)反射沒有找到成員的情況 , 此時(shí)查找其父類是否有該成員// 循環(huán)次數(shù)就是其父類層級(jí)個(gè)數(shù)while (clazz != null) {try {// 獲取成員Field memberField = clazz.getDeclaredField(memberName);// 如果不是 public , 無(wú)法訪問(wèn) , 設(shè)置可訪問(wèn)if (!memberField.isAccessible()) {memberField.setAccessible(true);}return memberField;} catch (NoSuchFieldException exception){// 如果找不到, 就到父類中查找clazz = clazz.getSuperclass();}}// 如果沒有拿到成員 , 則直接中斷程序 , 加載無(wú)法進(jìn)行下去throw new NoSuchFieldException("沒有在 " + clazz.getName() + " 類中找到 " + memberName + "成員");}/*** 通過(guò)反射方法獲取 instance 類中的 參數(shù)為 parameterTypes , 名稱為 methodName 的成員方法* @param instance 成員方法所在對(duì)象* @param methodName 成員方法名稱* @param parameterTypes 成員方法參數(shù)* @return* @throws NoSuchMethodException*/public static Method reflexMethod(Object instance, String methodName, Class... parameterTypes)throws NoSuchMethodException {// 獲取字節(jié)碼類Class clazz = instance.getClass();// 循環(huán)通過(guò)反射獲取// 可能存在通過(guò)反射沒有找到成員方法的情況 , 此時(shí)查找其父類是否有該成員方法// 循環(huán)次數(shù)就是其父類層級(jí)個(gè)數(shù)while (clazz != null) {try {// 獲取成員方法Method method = clazz.getDeclaredMethod(methodName, parameterTypes);// 如果不是 public , 無(wú)法訪問(wèn) , 設(shè)置可訪問(wèn)if (!method.isAccessible()) {method.setAccessible(true);}return method;} catch (NoSuchMethodException e) {// 如果找不到, 就到父類中查找clazz = clazz.getSuperclass();}}// 如果沒有拿到成員 , 則直接中斷程序 , 加載無(wú)法進(jìn)行下去throw new NoSuchMethodException("沒有在 " + clazz.getName() + " 類中找到 " + methodName + "成員方法");}}

3、壓縮解壓縮工具類


壓縮解壓縮工具類 :

package kim.hsl.multipledex;import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.util.Enumeration; import java.util.zip.CRC32; import java.util.zip.CheckedOutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipOutputStream;public class ZipUtils {/*** 刪除文件, 如果有目錄, 則遞歸刪除*/private static void deleteFile(File file){if (file.isDirectory()){File[] files = file.listFiles();for (File f: files) {deleteFile(f);}}else{file.delete();}}/*** 解壓文件* @param zip 被解壓的壓縮包文件* @param dir 解壓后的文件存放目錄*/public static void unZipApk(File zip, File dir) {try {// 如果存放文件目錄存在, 刪除該目錄deleteFile(dir);// 獲取 zip 壓縮包文件ZipFile zipFile = new ZipFile(zip);// 獲取 zip 壓縮包中每一個(gè)文件條目Enumeration<? extends ZipEntry> entries = zipFile.entries();// 遍歷壓縮包中的文件while (entries.hasMoreElements()) {ZipEntry zipEntry = entries.nextElement();// zip 壓縮包中的文件名稱 或 目錄名稱String name = zipEntry.getName();// 如果 apk 壓縮包中含有以下文件 , 這些文件是 V1 簽名文件保存目錄 , 不需要解壓 , 跳過(guò)即可if (name.equals("META-INF/CERT.RSA") || name.equals("META-INF/CERT.SF") || name.equals("META-INF/MANIFEST.MF")) {continue;}// 如果該文件條目 , 不是目錄 , 說(shuō)明就是文件if (!zipEntry.isDirectory()) {File file = new File(dir, name);//創(chuàng)建目錄if (!file.getParentFile().exists()) {file.getParentFile().mkdirs();}// 向剛才創(chuàng)建的目錄中寫出文件FileOutputStream fos = new FileOutputStream(file);InputStream is = zipFile.getInputStream(zipEntry);byte[] buffer = new byte[2048];int len;while ((len = is.read(buffer)) != -1) {fos.write(buffer, 0, len);}is.close();fos.close();}}// 關(guān)閉 zip 文件zipFile.close();} catch (Exception e) {e.printStackTrace();}}/*** 壓縮目錄為zip* @param dir 待壓縮目錄* @param zip 輸出的zip文件* @throws Exception*/public static void zip(File dir, File zip) throws Exception {zip.delete();// 對(duì)輸出文件做CRC32校驗(yàn)CheckedOutputStream cos = new CheckedOutputStream(new FileOutputStream(zip), new CRC32());ZipOutputStream zos = new ZipOutputStream(cos);//壓縮compress(dir, zos, "");zos.flush();zos.close();}/*** 添加目錄/文件 至zip中* @param srcFile 需要添加的目錄/文件* @param zos zip輸出流* @param basePath 遞歸子目錄時(shí)的完整目錄 如 lib/x86* @throws Exception*/private static void compress(File srcFile, ZipOutputStream zos,String basePath) throws Exception {if (srcFile.isDirectory()) {File[] files = srcFile.listFiles();for (File file : files) {// zip 遞歸添加目錄中的文件compress(file, zos, basePath + srcFile.getName() + "/");}} else {compressFile(srcFile, zos, basePath);}}private static void compressFile(File file, ZipOutputStream zos, String dir)throws Exception {// temp/lib/x86/libdn_ssl.soString fullName = dir + file.getName();// 需要去掉tempString[] fileNames = fullName.split("/");//正確的文件目錄名 (去掉了temp)StringBuffer sb = new StringBuffer();if (fileNames.length > 1){for (int i = 1;i<fileNames.length;++i){sb.append("/");sb.append(fileNames[i]);}}else{sb.append("/");}//添加一個(gè)zip條目ZipEntry entry = new ZipEntry(sb.substring(1));zos.putNextEntry(entry);//讀取條目輸出到zip中FileInputStream fis = new FileInputStream(file);int len;byte data[] = new byte[2048];while ((len = fis.read(data, 0, 2048)) != -1) {zos.write(data, 0, len);}fis.close();zos.closeEntry();}}

4、OpenSSL 解密工具類


package kim.hsl.multipledex;import android.util.Log;import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile;public class OpenSSL {static {System.loadLibrary("openssl");}/*** 從文件中讀取 Byte 數(shù)組* @param file* @return* @throws Exception*/public static byte[] getBytes(File file) throws Exception {try {// 創(chuàng)建隨機(jī)讀取文件RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r");// 獲取文件字節(jié)數(shù) , 創(chuàng)建保存文件數(shù)據(jù)的緩沖區(qū)byte[] buffer = new byte[(int) randomAccessFile.length()];// 讀取整個(gè)文件數(shù)據(jù)randomAccessFile.readFully(buffer);// 關(guān)閉文件randomAccessFile.close();return buffer;} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return null;}/*** 調(diào)用 OpenSSL 解密 dex 文件* @param data* @param path*/public static native void decrypt(byte[] data, String path); }

5、OpenSSL 解密相關(guān) NDK 源碼


#include <jni.h> #include <stdio.h> #include <android/log.h> #include <malloc.h> #include <string.h> #include <openssl/evp.h> #include "logging_macros.h"JNIEXPORT void JNICALL Java_kim_hsl_multipledex_OpenSSL_decrypt(JNIEnv *env, jobject instance, jbyteArray data, jstring path) {// 將 Java Byte 數(shù)組轉(zhuǎn)為 C 數(shù)組jbyte *src = (*env)->GetByteArrayElements(env, data, NULL);// 將 Java String 字符串轉(zhuǎn)為 C char* 字符串const char *filePath = (*env)->GetStringUTFChars(env, path, 0);// 獲取 Java Byte 數(shù)組長(zhǎng)度int srcLen = (*env)->GetArrayLength(env, data);/** 下面的代碼是從 OpenSSL 源碼跟目錄下 demos/evp/aesccm.c 中拷貝并修改*/// 加密解密的上下文EVP_CIPHER_CTX *ctx;int outlen;// 創(chuàng)建加密解密上下文ctx = EVP_CIPHER_CTX_new();/* Select cipher 配置上下文解碼參數(shù)* 配置加密模式 :* Java 中的加密算法類型 "AES/ECB/PKCS5Padding" , 使用 ecb 模式* EVP_aes_192_ecb() 配置 ecb 模式* AES 有五種加密模式 : CBC、ECB、CTR、OCF、CFB* 配置密鑰 :* Java 中定義的密鑰是 "kimhslmultiplede"*/EVP_DecryptInit_ex(ctx, EVP_aes_128_ecb(), NULL, "kimhslmultiplede", NULL);// 申請(qǐng)解密輸出數(shù)據(jù)內(nèi)存, 申請(qǐng)內(nèi)存長(zhǎng)度與密文長(zhǎng)度一樣即可// AES 加密密文比明文要長(zhǎng)uint8_t *out = malloc(srcLen);// 將申請(qǐng)的內(nèi)存設(shè)置為 0memset(out, 0, srcLen);// 記錄解密總長(zhǎng)度int totalLen = 0;/** 解密操作* int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out,int *outl, const unsigned char *in, int inl);* 解密 inl 長(zhǎng)度的 in , 解密為 outl 長(zhǎng)度的 out* 解密的輸入數(shù)據(jù)是 src, 長(zhǎng)度為 srcLen 字節(jié), 注意該長(zhǎng)度是 int 類型* 解密的輸出數(shù)據(jù)是 out, 長(zhǎng)度為 srcLen 字節(jié), 注意該長(zhǎng)度是 int* 指針類型*/EVP_DecryptUpdate(ctx, out, &outlen, src, srcLen);totalLen += outlen; //更新總長(zhǎng)度/** int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *outm,int *outl);* 解密時(shí), 每次解密 16 字節(jié), 如果超過(guò)了 16 字節(jié) , 就會(huì)剩余一部分無(wú)法解密,* 之前的 out 指針已經(jīng)解密了 outlen 長(zhǎng)度, 此時(shí)接著后續(xù)解密, 指針需要進(jìn)行改變 out + outlen* 此時(shí)需要調(diào)用該函數(shù) , 解密剩余內(nèi)容*/EVP_DecryptFinal_ex(ctx, out + outlen, &outlen);totalLen += outlen; //更新總長(zhǎng)度, 此時(shí) totalLen 就是總長(zhǎng)度// 解密完成, 釋放上下文對(duì)象EVP_CIPHER_CTX_free(ctx);// 將解密出的明文, 寫出到給定的 Java 文件中FILE *file = fopen(filePath, "wb");// 寫出 out 指針指向的數(shù)據(jù) , 寫出個(gè)數(shù) totalLen * 1 , 寫出到 file 文件中fwrite(out, totalLen, 1, file);// 關(guān)閉文件fclose(file);// 釋放解密出的密文內(nèi)存free(out);// 釋放 Java 引用(*env)->ReleaseByteArrayElements(env, data, src, 0);(*env)->ReleaseStringUTFChars(env, path, filePath); }

6、CmakeLists.txt 構(gòu)建腳本


cmake_minimum_required(VERSION 3.4.1)# 配置編譯選項(xiàng), 編譯類型 動(dòng)態(tài)庫(kù), C++ 源碼為 native-lib.c add_library(opensslSHAREDnative-lib.c)find_library(log-liblog)# 設(shè)置 openssl 函數(shù)庫(kù)的靜態(tài)庫(kù)地址 方式一 報(bào)錯(cuò) set(LIB_DIR ${CMAKE_SOURCE_DIR}/lib/${ANDROID_ABI}) add_library(crypto STATIC IMPORTED)# 預(yù)編譯 openssl 靜態(tài)庫(kù) set_target_properties(cryptoPROPERTIESIMPORTED_LOCATION${LIB_DIR}/libcrypto.a) # 指定頭文件 include_directories(${CMAKE_SOURCE_DIR}/include) # 方式一配置完畢# 設(shè)置 openssl 函數(shù)庫(kù)的靜態(tài)庫(kù)地址 方式二# 指定 openssl 頭文件查找目錄 # CMAKE_SOURCE_DIR 指的是當(dāng)前的文件地址 #include_directories(${CMAKE_SOURCE_DIR}/include)# 指定 openssl 靜態(tài)庫(kù) # CMAKE_CXX_FLAGS 表示會(huì)將 C++ 的參數(shù)傳給編譯器 # CMAKE_C_FLAGS 表示會(huì)將 C 參數(shù)傳給編譯器# 參數(shù)設(shè)置 : 傳遞 CMAKE_CXX_FLAGS C+= 參數(shù)給編譯器時(shí) , 在 該參數(shù)后面指定庫(kù)的路徑 # CMAKE_SOURCE_DIR 指的是當(dāng)前的文件地址 # -L 參數(shù)指定動(dòng)態(tài)庫(kù)的查找路徑 #set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -L${CMAKE_SOURCE_DIR}/lib/armeabi-v7a")#message("CMake octopus ${CMAKE_SOURCE_DIR} , ${ANDROID_ABI}, {CMAKE_SOURCE_DIR}/lib/${ANDROID_ABI}")# 鏈接動(dòng)態(tài)庫(kù) target_link_libraries(opensslcryptoandroid${log-lib})

7、NDK 日志頭文件


#ifndef __SAMPLE_ANDROID_DEBUG_H__ #define __SAMPLE_ANDROID_DEBUG_H__ #include <android/log.h>#if 1 #ifndef MODULE_NAME #define MODULE_NAME "octopus" #endif#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, MODULE_NAME, __VA_ARGS__) #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, MODULE_NAME, __VA_ARGS__) #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, MODULE_NAME, __VA_ARGS__) #define LOGW(...) __android_log_print(ANDROID_LOG_WARN,MODULE_NAME, __VA_ARGS__) #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,MODULE_NAME, __VA_ARGS__) #define LOGF(...) __android_log_print(ANDROID_LOG_FATAL,MODULE_NAME, __VA_ARGS__)#define ASSERT(cond, ...) if (!(cond)) {__android_log_assert(#cond, MODULE_NAME, __VA_ARGS__);} #else#define LOGV(...) #define LOGD(...) #define LOGI(...) #define LOGW(...) #define LOGE(...) #define LOGF(...) #define ASSERT(cond, ...)#endif#endif // __SAMPLE_ANDROID_DEBUG_H__

8、build.gradle 構(gòu)建腳本


apply plugin: 'com.android.library' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions'android {compileSdkVersion 29buildToolsVersion "30.0.2"defaultConfig {minSdkVersion 16targetSdkVersion 29versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"consumerProguardFiles 'consumer-rules.pro'externalNativeBuild{cmake{// 配置要編譯動(dòng)態(tài)庫(kù)的 CPU 架構(gòu), 這里編譯 arm 和 x86 兩個(gè)版本的動(dòng)態(tài)庫(kù)// arm64-v8a, armeabi-v7a, x86, x86_64abiFilters 'armeabi-v7a'}}//配置 APK 打包 哪些動(dòng)態(tài)庫(kù)// 示例 : 如在工程中集成了第三方庫(kù) , 其提供了 arm, x86, mips 等指令集的動(dòng)態(tài)庫(kù)// 那么為了控制打包后的應(yīng)用大小, 可以選擇性打包一些庫(kù) , 此處就是進(jìn)行該配置ndk{// 打包生成的 APK 文件指揮包含 ARM 指令集的動(dòng)態(tài)庫(kù)abiFilters "armeabi-v7a"}}externalNativeBuild{cmake{// 配置編譯的 CMake 腳本位置, 默認(rèn)當(dāng)前目錄是 app 目錄// build.gradle 構(gòu)建腳本所在目錄path 'src/main/cpp/CMakeLists.txt'}}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}}dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"implementation 'androidx.appcompat:appcompat:1.2.0'implementation 'androidx.core:core-ktx:1.3.2'testImplementation 'junit:junit:4.12'androidTestImplementation 'androidx.test.ext:junit:1.1.2'androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' }



三、Java 工具



Java 工具要執(zhí)行的操作 :

  • 1 . 解壓依賴庫(kù) : 解壓代理 Application 編譯生成的 aar 文件 , 目的是拿到其中的 classes.jar 文件 ;
  • 2 . 生成 dex 文件 : 使用 dx 工具 , 將上述 classes.jar 生成為 classes.dex ;
  • 3 . 解壓主應(yīng)用 : 解壓主應(yīng)用的 app-debug.apk 文件 , 目的是為了拿到其真實(shí)的 dex 文件 ;
  • 4 . 加密 dex : 加密從 app-debug.apk 中拿到的 dex 文件 ;
  • 5 . 拷貝 dex 文件 : 將上面生成的 代理 Application 的 classes.dex 拷貝到 app-debug.apk 文件解壓目錄 ;
  • 6 . 壓縮打包 : 將上述加密后的 dex 文件 , 以及 拷貝了 代理 Application 的 classes.dex 所在的目錄壓縮打包為 app-unsigned.apk 文件 ;
  • 7 . 對(duì)齊操作 : 使用 zipalign 工具 , 對(duì)齊 app-unsigned.apk , 對(duì)齊后的文件為 app-unsigned-aligned.apk ;
  • 8 . 簽名操作 : 使用 apksigner 為 app-unsigned-aligned.apk 文件簽名 , 生成 app-signed-aligned.apk 簽名后文件 ;

最終生成的 app-signed-aligned.apk 簽名后文件就是 dex 加密的安裝包 , 該安裝包中的 dex 文件無(wú)法被直接查看 ;



1、主函數(shù)


package kim.hsl.multiple_dex_toolsimport java.io.* import java.util.zip.*/*** 此處配置 SDK 根目錄絕對(duì)路徑* D:/001_Programs/001_Android/002_Sdk/Sdk/* Y:/001_DevelopTools/002_Android_SDK/*/ val sdkDirectory = "D:/001_Programs/001_Android/002_Sdk/Sdk/"@ExperimentalStdlibApi fun main() {/*1 . 生成 dex 文件 , 該 dex 文件中只包含解密 其它 dex 的功能編譯工程會(huì)生成 Android 依賴庫(kù)的 aar 文件生成目錄是 module/build/outputs/aar/ 目錄下前提是需要在 菜單欄 / File / Setting / Build, Execution, Deployment / Compiler設(shè)置界面中 , 勾選 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 文件對(duì)象var aarFile = File("multiple-dex-core/build/outputs/aar/multiple-dex-core-debug.aar")// 解壓上述 multiple-dex-core-debug.aar 文件到 aarUnzip 目錄中// 創(chuàng)建解壓目錄var aarUnzip = File("multiple-dex-tools/aarUnzip")// 解壓操作unZip(aarFile, aarUnzip)// 拿到 multiple-dex-core-debug.aar 中解壓出來(lái)的 classes.jar 文件var classesJarFile = File(aarUnzip, "classes.jar")// 創(chuàng)建轉(zhuǎn)換后的 dex 目的文件, 下面會(huì)開始創(chuàng)建該 dex 文件var classesDexFile = File(aarUnzip, "classes.dex")// 打印要執(zhí)行的命令println("cmd /c ${sdkDirectory}build-tools/30.0.2/dx.bat --dex --output ${classesDexFile.absolutePath} ${classesJarFile.absolutePath}")/*將 jar 包變成 dex 文件使用 dx 工具命令注意 : Windows 命令行命令之前需要加上 "cmd /c " 信息 , Linux 與 MAC 命令行不用添加*/var process = Runtime.getRuntime().exec("cmd /c ${sdkDirectory}build-tools/30.0.2/dx.bat --dex --output ${classesDexFile.absolutePath} ${classesJarFile.absolutePath}")// 等待上述命令執(zhí)行完畢process.waitFor()// 執(zhí)行結(jié)果提示if(process.exitValue() == 0){println("生成 dex 操作 , 執(zhí)行成功");} else {println("生成 dex 操作 , 執(zhí)行失敗");}/*2 . 加密 apk 中的 dex 文件*/// 解壓 apk 文件 , 獲取所有的 dex 文件// 被解壓的 apk 文件var apkFile = File("app/build/outputs/apk/debug/app-debug.apk")// 解壓的目標(biāo)文件夾var apkUnZipFile = File("app/build/outputs/apk/debug/unZipFile")// 解壓文件unZip(apkFile, apkUnZipFile)// 從被解壓的 apk 文件中找到所有的 dex 文件, 小項(xiàng)目只有 1 個(gè), 大項(xiàng)目可能有多個(gè)// 使用文件過(guò)濾器獲取后綴是 .dex 的文件var dexFiles : Array<File> = apkUnZipFile.listFiles({ file: File, s: String ->s.endsWith(".dex")})// 加密找到的 dex 文件var aes = AES(AES.DEFAULT_PWD)// 遍歷 dex 文件for(dexFile: File in dexFiles){// 讀取文件數(shù)據(jù)var bytes = getBytes(dexFile)// 加密文件數(shù)據(jù)var encryptedBytes = aes.encrypt(bytes)// 將加密后的數(shù)據(jù)寫出到指定目錄var outputFile = File(apkUnZipFile, "secret-${dexFile.name}")// 創(chuàng)建對(duì)應(yīng)輸出流var fileOutputStream = FileOutputStream(outputFile)// 將加密后的 dex 文件寫出, 然后刷寫 , 關(guān)閉該輸出流fileOutputStream.write(encryptedBytes)fileOutputStream.flush()fileOutputStream.close()// 刪除原來(lái)的文件dexFile.delete()}/*3 . 將代理 Application 中的 classes.dex 解壓到上述app/build/outputs/apk/debug/unZipFile 目錄中*/// 拷貝文件到 app/build/outputs/apk/debug/unZipFile 目錄中classesDexFile.renameTo(File(apkUnZipFile, "classes.dex"))// 壓縮打包 , 該壓縮包是未簽名的壓縮包var unSignedApk = File("app/build/outputs/apk/debug/app-unsigned.apk")// 壓縮打包操作zip(apkUnZipFile, unSignedApk)/*4 . 對(duì)齊操作*/// 對(duì)齊操作的輸出結(jié)果, 將 app-unsigned.apk 對(duì)齊, 對(duì)齊后的文件輸出到 app-unsigned-aligned.apk 中var unSignedAlignApk = File("app/build/outputs/apk/debug/app-unsigned-aligned.apk")// 打印要執(zhí)行的命令println("cmd /c ${sdkDirectory}build-tools/30.0.2/zipalign -f 4 ${unSignedApk.absolutePath} ${unSignedAlignApk.absolutePath}")/*將 app-unsigned.apk 對(duì)齊使用 zipalign 工具命令注意 : Windows 命令行命令之前需要加上 "cmd /c " 信息 , Linux 與 MAC 命令行不用添加*/process = Runtime.getRuntime().exec("cmd /c ${sdkDirectory}build-tools/30.0.2/zipalign -f 4 ${unSignedApk.absolutePath} ${unSignedAlignApk.absolutePath}")// 等待上述命令執(zhí)行完畢process.waitFor()// 執(zhí)行結(jié)果提示if(process.exitValue() == 0){println("對(duì)齊操作 執(zhí)行成功");} else {println("對(duì)齊操作 執(zhí)行失敗");}/*5 . 簽名操作*/// 簽名 apk 輸出結(jié)果, 將 app-unsigned-aligned.apk 簽名, 簽名后的文件輸出到 app-signed-aligned.apk 中var signedAlignApk = File("app/build/outputs/apk/debug/app-signed-aligned.apk")// 獲取簽名 jks 文件var jksFile = File("dex.jks")// 打印要執(zhí)行的命令println("cmd /c ${sdkDirectory}build-tools/30.0.2/apksigner sign --ks ${jksFile.absolutePath} --ks-key-alias Key0 --ks-pass pass:000000 --key-pass pass:000000 --out ${signedAlignApk.absolutePath} ${unSignedAlignApk.absolutePath}")/*將 app-unsigned.apk 對(duì)齊使用 zipalign 工具命令注意 : Windows 命令行命令之前需要加上 "cmd /c " 信息 , Linux 與 MAC 命令行不用添加*/process = Runtime.getRuntime().exec("cmd /c ${sdkDirectory}build-tools/30.0.2/apksigner sign --ks ${jksFile.absolutePath} --ks-key-alias Key0 --ks-pass pass:000000 --key-pass pass:000000 --out ${signedAlignApk.absolutePath} ${unSignedAlignApk.absolutePath}")// 打印錯(cuò)誤日志var br = BufferedReader(InputStreamReader(process.errorStream))while ( true ){var line = br.readLine()if(line == null){break}else{println(line)}}br.close()// 等待上述命令執(zhí)行完畢process.waitFor()// 執(zhí)行結(jié)果提示if(process.exitValue() == 0){println("簽名操作 執(zhí)行成功");} else {println("簽名操作 執(zhí)行失敗");}}/*** 刪除文件, 如果有目錄, 則遞歸刪除*/ 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 unZip(zip: File, dir: File) {try {// 如果存放文件目錄存在, 刪除該目錄deleteFile(dir)// 獲取 zip 壓縮包文件val zipFile = ZipFile(zip)// 獲取 zip 壓縮包中每一個(gè)文件條目val entries = zipFile.entries()// 遍歷壓縮包中的文件while (entries.hasMoreElements()) {val zipEntry = entries.nextElement()// zip 壓縮包中的文件名稱 或 目錄名稱val name = zipEntry.name// 如果 apk 壓縮包中含有以下文件 , 這些文件是 V1 簽名文件保存目錄 , 不需要解壓 , 跳過(guò)即可if (name == "META-INF/CERT.RSA" || name == "META-INF/CERT.SF" || (name== "META-INF/MANIFEST.MF")) {continue}// 如果該文件條目 , 不是目錄 , 說(shuō)明就是文件if (!zipEntry.isDirectory) {val file = File(dir, name)// 創(chuàng)建目錄if (!file.parentFile.exists()) {file.parentFile.mkdirs()}// 向剛才創(chuàng)建的目錄中寫出文件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()}}// 關(guān)閉 zip 文件zipFile.close()} catch (e: Exception) {e.printStackTrace()} }fun zip(dir: File, zip: File) {// 如果目標(biāo)壓縮包存在 , 刪除該壓縮包zip.delete()// 對(duì)輸出文件做 CRC32 校驗(yàn)val cos = CheckedOutputStream(FileOutputStream(zip), CRC32())val zos = ZipOutputStream(cos)// 壓縮文件compress(dir, zos, "")zos.flush()zos.close() }private fun compress(srcFile: File, zos: ZipOutputStream, basePath: String) {if (srcFile.isDirectory) {val files = srcFile.listFiles()for (file in files) {// zip 遞歸添加目錄中的文件compress(file, zos, basePath + srcFile.name + "/")}} else {compressFile(srcFile, zos, basePath)} }private fun compressFile(file: File, zos: ZipOutputStream, dir: String) {// 拼接完整的文件路徑名稱val fullName = dir + file.name// app/build/outputs/apk/debug/unZipFile 路徑val fileNames = fullName.split("/").toTypedArray()// 正確的文件目錄名val sb = StringBuffer()if (fileNames.size > 1) {for (i in 1 until fileNames.size) {sb.append("/")sb.append(fileNames[i])}} else {sb.append("/")}// 添加 zip 條目val entry = ZipEntry(sb.substring(1))zos.putNextEntry(entry)// 讀取 zip 條目輸出到文件中val fis = FileInputStream(file)var len: Intval data = ByteArray(2048)while (fis.read(data, 0, 2048).also { len = it } != -1) {zos.write(data, 0, len)}fis.close()zos.closeEntry() }/*** 讀取文件到數(shù)組中*/ fun getBytes(file: File): ByteArray {// 創(chuàng)建隨機(jī)方位文件對(duì)象val randomAccessFile = RandomAccessFile(file, "r")// 獲取文件大小 , 并創(chuàng)建同樣大小的數(shù)據(jù)組val buffer = ByteArray(randomAccessFile.length().toInt())// 讀取真?zhèn)€文件到數(shù)組中randomAccessFile.readFully(buffer)// 關(guān)閉文件randomAccessFile.close()return buffer }

2、加密相關(guān)工具類


package kim.hsl.multiple_dex_toolsimport java.io.File import java.io.FileInputStream import java.io.FileOutputStream import java.io.RandomAccessFile import java.util.zip.* import javax.crypto.Cipher import javax.crypto.spec.SecretKeySpecclass AES {// Kotlin 類中的靜態(tài)變量companion object{/*** 加密密鑰, 16 字節(jié)*/val DEFAULT_PWD = "kimhslmultiplede"}/*** 加密解密算法類型*/val algorithm = "AES/ECB/PKCS5Padding"/*** 加密算法, 目前本應(yīng)用中只需要加密, 不需要解密*/lateinit var encryptCipher: Cipher;/*** 解密算法*/lateinit var decryptCipher: Cipher;@ExperimentalStdlibApiconstructor(pwd: String){// 初始化加密算法encryptCipher = Cipher.getInstance(algorithm)// 初始化解密算法decryptCipher = Cipher.getInstance(algorithm)// 將密鑰字符串轉(zhuǎn)為字節(jié)數(shù)組var keyByte = pwd.toByteArray()// 創(chuàng)建密鑰val key = SecretKeySpec(keyByte, "AES")// 設(shè)置算法類型, 及密鑰encryptCipher.init(Cipher.ENCRYPT_MODE, key);// 設(shè)置算法類型, 及密鑰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}}

總結(jié)

以上是生活随笔為你收集整理的【Android 安全】DEX 加密 ( 阶段总结 | 主应用 | 代理 Application | Java 工具 | 代码示例 ) ★的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

99久久日韩精品免费热麻豆美女 | 麻豆免费精品视频 | 又黄又爽又色无遮挡免费 | 国产一区视频免费在线观看 | 狠狠干婷婷 | 精品国产乱码久久久久久天美 | 在线观看av的网站 | 国产资源免费在线观看 | 日韩va欧美va亚洲va久久 | 97av视频在线观看 | 一区二区三区动漫 | 精品人人人 | 999久久久久久久久久久 | 欧美一区二区三区免费看 | 中文字幕超清在线免费 | 成人av一二三区 | 亚洲精品视频中文字幕 | 91成人在线看 | 国产精品一区二区三区久久久 | 国产91精品看黄网站在线观看动漫 | 久久综合狠狠综合久久综合88 | 97在线观看免费高清完整版在线观看 | 亚洲欧洲精品一区二区精品久久久 | 国产尤物一区二区三区 | 波多野结衣网址 | 国产成人一二三 | 国产录像在线观看 | 黄色成人91| 亚洲成人动漫在线观看 | 色婷婷综合久久久久中文字幕1 | 国产午夜精品久久 | 久久久久久久久久久久亚洲 | 色婷婷av一区 | 久久人人艹 | 国产精品无 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 99精品乱码国产在线观看 | 国产精品观看视频 | 久热国产视频 | 日韩在线观看视频免费 | 在线观看av不卡 | 久久久三级视频 | 91视频啪| 99精品国产高清在线观看 | 韩国三级av在线 | 久久99精品国产91久久来源 | 激情综合五月网 | 久久论理 | 91tv国产成人福利 | 日韩午夜精品福利 | 中文字幕在线观看第二页 | 精品99视频 | 欧美日韩国内在线 | 中文字幕免费看 | 尤物九九久久国产精品的分类 | 在线观看视频免费大全 | 国产精品成人久久久久久久 | 一本一本久久a久久精品综合 | 欧美午夜精品久久久久久孕妇 | 日日操日日 | 久久五月婷婷丁香 | 久久免费国产电影 | 免费看日韩片 | 色婷婷狠狠五月综合天色拍 | 97在线播放| 亚洲精品在线视频网站 | 伊人伊成久久人综合网站 | 久久亚洲区 | 久久的色| 婷婷丁香激情综合 | av中文资源在线 | 久久综合桃花 | 九九久久婷婷 | 亚洲女同videos | 欧美精品久久久久久久久老牛影院 | 国产高清视频免费最新在线 | 日日干天天| 久久久影院一区二区三区 | 91免费试看 | 亚洲日日日 | 久久精品久久久久电影 | 成人av动漫在线 | 国产精品一区二区三区视频免费 | 国产高清免费在线观看 | 天天射天天操天天色 | 在线视频 成人 | 日韩欧美国产精品 | 亚洲一级特黄 | 91麻豆精品国产午夜天堂 | 国产小视频在线播放 | 国内精品在线看 | 国产无遮挡猛进猛出免费软件 | 一区二区视频欧美 | 99免在线观看免费视频高清 | 欧美激情视频一二三区 | 色中色亚洲 | 亚洲精品国产精品乱码不99热 | 又湿又紧又大又爽a视频国产 | 人人射 | 亚洲少妇激情 | 欧美激情精品久久久久久变态 | 免费人成网 | 日韩欧美国产视频 | 欧美成人精品三级在线观看播放 | 国产精品久久久久久久久久久久冷 | 91看片淫黄大片一级在线观看 | 99国产高清| 色噜噜狠狠狠狠色综合 | 九九99| av网站在线免费观看 | 国产免费视频一区二区裸体 | 99久热在线精品视频观看 | 久久久久久久免费 | 四虎成人精品永久免费av | 亚洲乱码国产乱码精品天美传媒 | 特级西西www44高清大胆图片 | 亚洲午夜久久久久久久久久久 | 欧美精品v国产精品v日韩精品 | 久久国产剧场电影 | 日韩精品中文字幕在线 | 精品亚洲免费 | 91精品伦理 | 国产成人精品女人久久久 | 国产亲近乱来精品 | 精品久久电影 | 日韩欧美网站 | 中文字幕在线观看你懂的 | 亚洲天天在线日亚洲洲精 | 欧美精品免费一区二区 | 久久丁香 | 中文字幕在线免费观看 | 日韩欧美精品免费 | 91av99| 日产乱码一二三区别免费 | 成人av片免费观看app下载 | 久久不射网站 | 国产一级视频在线 | 91亚洲精 | 成人毛片在线观看 | 97超碰香蕉| 国内精品久久久久影院男同志 | 中文字幕乱偷在线 | 国产看片免费 | 久久一二三四 | 久久视| 成人av片在线观看 | 日本中文字幕视频 | av网站免费在线 | 最新av网址在线观看 | 久久综合婷婷国产二区高清 | 91人人人| 中文字幕在线免费播放 | 国产美女视频免费观看的网站 | 在线观看黄色 | 欧美一级片在线免费观看 | 美女精品网站 | 中文字幕刺激在线 | 色婷婷视频在线观看 | 天无日天天操天天干 | 国产精品18久久久久vr手机版特色 | 久久国产高清 | 91精品成人久久 | 久久综合干 | 99久久久久国产精品免费 | 免费在线播放视频 | 日本女人在线观看 | 黄色av一区二区三区 | 97超碰.com| 精品99久久久久久 | 国产精品久久久久久久久蜜臀 | 久久伊人八月婷婷综合激情 | 国产精品3| 国产精品都在这里 | 黄污视频网站大全 | 极品国产91在线网站 | 人人艹人人 | 国内久久久 | 韩国在线一区 | 91一区二区三区在线观看 | 五月综合网站 | 伊人亚洲综合 | 国产视频亚洲 | 久久电影网站中文字幕 | 黄色av影院 | 日本黄色免费在线 | 97精品在线观看 | 99精品热| 四月婷婷在线观看 | 日本黄色大片免费 | 国产精品精 | h久久| 国产一级视频免费看 | 黄色美女免费网站 | 国产精品美女在线观看 | 香蕉国产91 | 在线观看片 | 日韩乱码中文字幕 | 中文字幕二区三区 | 国产精品专区在线观看 | a级片韩国 | 在线亚洲午夜片av大片 | 91伊人久久大香线蕉蜜芽人口 | av一本久道久久波多野结衣 | 免费观看成年人视频 | 国产色拍拍拍拍在线精品 | 国产色影院 | 99精品在线视频播放 | 免费麻豆 | 欧美日韩中文在线观看 | av在线免费在线观看 | 91看片在线免费观看 | 久久国产精品99久久久久久丝袜 | 国产一区二区视频在线播放 | 91福利区一区二区三区 | 欧美日韩中文国产 | 国产高清绿奴videos | 久久久久久久久久久国产精品 | 久爱综合 | 亚洲艳情 | 亚洲电影一级黄 | 久久视精品 | 91精品国产亚洲 | 爱爱一区| 国产欧美久久久精品影院 | 日韩av资源站 | 亚洲精品合集 | 久久成年人网站 | 欧美精品在线一区二区 | 欧美一二三区在线观看 | 91av资源网 | 国产手机视频在线 | 国产成人高清av | 国产伦理久久精品久久久久_ | 亚洲精品一区二区精华 | 免费观看一区二区三区视频 | 一本一道波多野毛片中文在线 | wwwww.国产 | 中文字幕在线色 | 免费亚洲黄色 | 超碰在线成人 | 国内成人精品视频 | av在线激情| 国产三级视频在线 | 国产精品精品久久久久久 | 探花国产在线 | 亚洲国产欧洲综合997久久, | 9ⅰ精品久久久久久久久中文字幕 | 国产精品地址 | 91免费的视频在线播放 | 九九九在线 | 奇米影视在线99精品 | 日韩有码中文字幕在线 | 91日本在线播放 | japanesexxxhd奶水 91在线精品一区二区 | 欧美激情视频一二三区 | 欧美精品亚洲精品日韩精品 | 国产精品成人一区二区三区吃奶 | 天天干天天摸天天操 | 国产精品普通话 | 欧美夫妻生活视频 | 在线免费观看羞羞视频 | 韩日电影在线 | 日韩区在线观看 | 国产免费成人 | 国产精品成人自拍 | 国产一区播放 | 91最新地址永久入口 | 高清在线一区二区 | 久久精品波多野结衣 | 久久99国产精品 | 欧美一区日韩一区 | 国精产品满18岁在线 | 久久精品首页 | 久草在线免费在线观看 | 狠狠色丁香久久婷婷综合丁香 | 国产精品av久久久久久无 | 天天射天天艹 | 日本不卡视频 | 国产97在线视频 | 午夜精品久久久久久久99婷婷 | 久久精品亚洲综合专区 | 国产在线视频资源 | 国产视频2区 | 99在线视频免费观看 | 99精品系列 | 久久久久久草 | 99久精品视频 | 免费网址你懂的 | 一级电影免费在线观看 | 欧美日韩高清国产 | 91成人免费视频 | 又黄又刺激视频 | 日韩精品一区二区不卡 | 成人毛片一区 | 久久人91精品久久久久久不卡 | 在线观看免费日韩 | 久久国产免 | 免费观看成人网 | 中文字幕在线视频一区二区 | 天天爱天天操 | 日韩极品在线 | 亚洲欧美日韩精品久久久 | 久草视频在线免费播放 | 精品久久五月天 | 美女黄频视频大全 | 69亚洲乱| 久久天天躁狠狠躁夜夜不卡公司 | 日韩深夜在线观看 | 久久99久国产精品黄毛片入口 | 999久久久国产精品 高清av免费观看 | 2021久久| 久久一区国产 | 五月婷婷香蕉 | 激情开心色| 久久综合毛片 | 国产精品久久久久亚洲影视 | 手机看片1042 | 97综合视频| 91视频麻豆视频 | 欧美a视频 | 看片黄网站 | 四虎欧美 | 中文字幕av最新 | 成人免费看片网址 | 日日骑| 国产日韩欧美在线看 | 色wwww| 日韩一区二区免费播放 | 91亚洲国产成人久久精品网站 | 国产 在线观看 | 深夜精品福利 | 亚洲国产人午在线一二区 | а天堂中文最新一区二区三区 | 国产成人久久精品77777 | 97品白浆高清久久久久久 | 91成人在线观看高潮 | av片一区| 日韩在线免费小视频 | 一区二区不卡在线观看 | 黄色视屏在线免费观看 | 丁香在线观看完整电影视频 | 插婷婷 | av在线播放快速免费阴 | 国产高清不卡在线 | 91正在播放 | 欧美精品午夜 | 日韩高清激情 | 网站在线观看日韩 | 久久婷婷色 | 国产一二三在线视频 | 成人免费 在线播放 | 成人免费观看网站 | 久草在线视频中文 | 欧美日韩视频在线一区 | 一本一本久久a久久 | 操操操综合 | 天天干天天操天天入 | 在线观看视频一区二区 | 久久99精品波多结衣一区 | 偷拍福利视频一区二区三区 | 国产日产高清dvd碟片 | 成人精品视频久久久久 | 午夜性生活片 | 国产剧情一区在线 | 久久久久久伊人 | 色婷婷综合久久久久中文字幕1 | 亚洲aⅴ在线 | 天天综合网久久综合网 | 日韩高清不卡在线 | 中文字幕日韩无 | 免费看成人a | 午夜视频福利 | 午夜影院日本 | 久久99视频精品 | 中日韩三级视频 | 91九色蝌蚪视频网站 | 中文字幕影视 | 久久久久麻豆v国产 | 亚洲精品xxx| 亚洲性xxxx| 免费视频久久 | 天堂av观看| 一区二区精品在线 | 日本中文字幕电影在线免费观看 | 国产91九色视频 | 免费久草视频 | 嫩草av在线 | 日本成人免费在线观看 | 久久天天操 | 亚洲丁香久久久 | 国产午夜一级毛片 | 日韩精品国产一区 | 黄色91免费观看 | 日韩手机视频 | 一区二区三区四区五区在线 | 国产精品毛片一区二区在线 | 亚洲成人xxx| 久草男人天堂 | 手机看国产毛片 | 色婷婷综合久久久 | 免费欧美高清视频 | 91最新网址 | 国产专区视频在线观看 | 在线看日韩 | 天天干天天射天天爽 | 免费观看成人av | 伊人六月 | 九九九视频精品 | 99自拍视频在线观看 | 久久精品欧美日韩精品 | 蜜臀91丨九色丨蝌蚪老版 | 亚洲精品国产精品乱码不99热 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 一级α片| 91网址在线看 | 日韩色爱 | 最新成人在线 | 人人爱爱 | 国产喷水在线 | 五月婷社区 | 久久综合九色综合久久久精品综合 | 国产精品一区二区在线播放 | www免费黄色 | 国产精品自拍在线 | 日本精品一 | 久久久久久久久久久电影 | 亚洲精品国产高清 | 91av在线视频免费观看 | 久久伊人五月天 | 欧美日韩国产一区二区在线观看 | 色99之美女主播在线视频 | a级黄色片视频 | 少妇18xxxx性xxxx片 | 免费看片网址 | 精品国产一区二区三区在线 | 亚洲va天堂va欧美ⅴa在线 | 激情丁香5月 | 久精品视频免费观看2 | 天天干天天操天天干 | 伊人伊成久久人综合网小说 | 狠狠五月天 | 深爱综合网 | 亚洲精品一区二区精华 | 国产不卡片 | 丁香激情婷婷 | 91大神在线观看视频 | 91aaa在线观看 | 亚洲黄色在线 | 国产欧美精品一区二区三区四区 | 日韩欧美电影在线观看 | 亚洲在线视频免费 | 黄色国产大片 | 韩国av一区 | 精品1区2区3区 | 中文字幕在线观看91 | 国产精品久久久久久久久软件 | 久草网视频 | 国产va在线观看免费 | 六月丁香激情综合 | 国产精品密入口果冻 | 精品国产一区二区在线 | 天干啦夜天干天干在线线 | 黄色小说视频在线 | 国产精品久久久久av免费 | 免费看国产黄色 | 久久免费国产电影 | 2000xxx影视| 超碰公开在线观看 | 国产精品久久久久永久免费观看 | 九九激情视频 | 国产精品igao视频网网址 | 久久免费国产精品 | 国产69精品久久99的直播节目 | 久草免费在线观看 | 男女男视频 | 免费黄色看片 | 一区二区三区免费在线观看视频 | 久久久久福利视频 | 免费在线观看av不卡 | 亚洲黄色免费在线看 | 美女黄视频免费看 | 在线视频 国产 日韩 | 日本精品视频在线观看 | 久久久夜色 | 久久美女高清视频 | 99精品影视| 国产免费美女 | 亚洲v欧美v国产v在线观看 | 国产最新精品视频 | 国产精品久久久久久久免费大片 | 国产成人精品久久久 | 国产精品成人一区二区 | 欧美国产精品一区二区 | 狠狠操操 | 欧美精品天堂 | 久操视频在线 | 欧美日韩中文字幕综合视频 | 手机成人在线电影 | 五月婷av | 日韩久久久久久久久 | 69久久久久久久 | 亚洲国产精品va在线看黑人 | 91免费视频网站在线观看 | 色五月色开心色婷婷色丁香 | 日韩激情视频在线观看 | 精精国产xxxx视频在线播放 | 国产亚洲精品久久久久久久久久 | 精品一区二区在线免费观看 | 亚洲日本激情 | 在线观看黄污 | 国内偷拍精品视频 | 中文资源在线观看 | av高清不卡 | 午夜成人免费电影 | 亚洲黄色免费 | 国产精品麻豆三级一区视频 | 最近高清中文在线字幕在线观看 | 国产麻豆精品在线观看 | 黄色大全在线观看 | 日本中出在线观看 | 成人中文字幕+乱码+中文字幕 | 黄色综合 | 久久综合狠狠综合久久狠狠色综合 | 日韩av成人在线观看 | 日日躁天天躁 | 亚洲黄色av| 亚洲无线视频 | 黄色小网站在线 | 国产免费又爽又刺激在线观看 | 国产18精品乱码免费看 | 国产亚洲精品久久久久动 | 黄色福利网站 | 六月天综合网 | 午夜精品一区二区三区在线视频 | 久久久精品久久日韩一区综合 | 免费在线观看国产精品 | 国内久久精品 | 国产麻豆精品95视频 | 亚洲自拍自偷 | 国产生活一级片 | 一区电影| 天天夜夜亚洲 | 亚洲一级在线观看 | 久久视频二区 | 国产精品久久人 | 性色av香蕉一区二区 | 久久综合视频网 | 四虎影视国产精品免费久久 | 毛片网站免费在线观看 | 西西4444www大胆视频 | 日韩欧美视频一区二区三区 | 又黄又爽又色无遮挡免费 | 日本精品一区二区 | 久人人 | 992tv在线观看网站 | 久久久久国产一区二区 | 五月丁香| 91麻豆精品国产91久久久使用方法 | 黄色影院在线观看 | 久久欧美视频 | 日韩在线免费高清视频 | 国产在线视频在线观看 | 91亚洲精品国偷拍 | 色婷婷www| 成人动漫一区二区三区 | 鲁一鲁影院 | 免费av一级电影 | 精品国产精品久久 | 91视频xxxx| 在线观看视频你懂得 | 九九久久免费视频 | 久久99深爱久久99精品 | 国产91精品久久久久久 | 亚洲精品视频在线观看视频 | 久久99久 | 国产免费视频在线 | 久久综合狠狠综合久久激情 | 91中文字幕永久在线 | 色综合 久久精品 | 国产高清免费 | 国产精品露脸在线 | 国产日韩av在线 | 久久久九九 | 夜色资源网 | 911久久香蕉国产线看观看 | 日韩欧美在线观看一区二区 | 成人午夜影院在线观看 | 久草在线费播放视频 | 免费看三级黄色片 | 日韩欧美综合视频 | 日本中文一区二区 | 国产精品一级在线 | 天天玩天天干 | 国产 日韩 在线 亚洲 字幕 中文 | 日韩二区三区 | 色资源网免费观看视频 | 狠狠色丁香婷婷综合久小说久 | 中文字幕在线影院 | 亚洲 欧美 变态 国产 另类 | 国产 欧美 在线 | 四虎在线观看网址 | 四虎在线影视 | 日本中文字幕视频 | 九九热视频在线 | 欧美日韩超碰 | 最近中文字幕在线 | 午夜视频播放 | 久久久影片 | 天天天天天天天天操 | 一区二区 精品 | 日韩精品一二三 | 国产电影黄色av | 日韩有码网站 | 久草在线综合网 | 成人久久精品视频 | av成人免费网站 | 日韩精品视频在线免费观看 | 国产呻吟在线 | 日韩午夜在线观看 | 国产精品不卡在线 | 日韩激情免费视频 | 午夜免费久久看 | 午夜男人影院 | 久久综合五月天婷婷伊人 | 成人av电影免费观看 | 高清国产在线一区 | 成人在线观看日韩 | 成人午夜影院在线观看 | 国产在线中文字幕 | 国产中文字幕在线观看 | 精品在线视频一区二区三区 | 超碰在线日本 | 色先锋av资源中文字幕 | 久久久久国产一区二区三区四区 | 一区二区三区免费在线播放 | 久久高清av | 久久精品久久久精品美女 | 精品美女在线视频 | 91九色蝌蚪在线 | 中文字幕在线播放一区 | 亚洲精品国产第一综合99久久 | 91资源在线 | 人人爽人人香蕉 | 日韩视频www | 激情偷乱人伦小说视频在线观看 | 国产精品国产三级国产不产一地 | 一区二区三区在线视频111 | 国产精品精品国产婷婷这里av | 国产xxxx做受性欧美88 | 91最新地址永久入口 | 98久久| 天天干天天干天天干天天干天天干天天干 | 热99久久精品| 天天干天天做天天操 | 日韩最新av在线 | 亚洲毛片在线观看. | 91热| 天天操天天操天天 | 在线免费黄色av | 六月丁香色婷婷 | 欧美调教网站 | 激情中文在线 | 久久躁日日躁aaaaxxxx | 中文字幕一区二区在线播放 | 国产午夜免费视频 | 成人午夜剧场在线观看 | 国产手机av在线 | 永久精品视频 | 成人欧美一区二区三区黑人麻豆 | 国内精自线一二区永久 | 亚洲精品午夜久久久 | 三级免费黄 | 91热在线 | 免费网站在线观看人 | 免费在线观看不卡av | 国产成人在线免费观看 | 黄色毛片一级片 | 久久伊人免费视频 | 精品国产三级 | 五月天婷婷综合 | 五月黄色 | 欧美日韩精品免费观看 | 国产精品系列在线播放 | 在线观看中文字幕第一页 | 久久久久久久久久久国产精品 | 国产久草在线观看 | 欧美三级在线播放 | 成人在线视频你懂的 | 亚洲欧洲久久久 | 国产区精品区 | 丁香婷婷网| 996久久国产精品线观看 | 日日夜夜精品免费视频 | 免费观看性生交大片3 | 精品国产一区二区三区免费 | 欧美成人h版| 精品毛片一区二区免费看 | 亚洲黄网站 | 久热久草| 麻豆视频免费在线 | 99久久久久久久久 | 三级黄色大片在线观看 | 国产日韩欧美在线免费观看 | 欧美色就是色 | 天天操,夜夜操 | v片在线播放 | 最新中文字幕视频 | 99久久久久免费精品国产 | 激情综合网五月婷婷 | 国产精品毛片一区二区在线看 | 久久国产精品99久久久久久丝袜 | 91精品国产91热久久久做人人 | 在线亚洲高清视频 | 天天舔天天搞 | 日韩在线观 | 亚洲一级性 | 国产成人亚洲在线电影 | 中文字幕最新精品 | 91视频在线观看大全 | 欧美国产日韩一区二区 | 欧美精品一二三 | 天天操天天射天天 | ,午夜性刺激免费看视频 | 中文字幕久久精品亚洲乱码 | 国产爽视频 | 久久精品久久久久 | 天天综合91| 亚洲精品白浆高清久久久久久 | 亚洲精品久久久久58 | 91传媒在线看 | 欧美视频18 | 中文字幕乱偷在线 | 狠狠ri| 国产一级高清视频 | 欧美日韩视频在线播放 | 日本激情动作片免费看 | 日韩精品不卡在线观看 | 亚洲激情在线观看 | 欧美日韩视频在线观看一区二区 | 狠狠色丁香婷婷综合欧美 | 色瓜| 欧美日韩伦理在线 | 日本在线视频网址 | 超碰97人人爱 | 久久爽久久爽久久av东京爽 | 亚洲一区二区视频在线播放 | 久久tv视频 | 欧美在线一 | 久青草视频 | 青青河边草观看完整版高清 | 婷婷久久五月天 | 麻豆传媒精品 | 国产最新视频在线观看 | 一区二区精品在线 | 丁五月婷婷 | 久久精品99北条麻妃 | 久久久久国产精品视频 | 成人黄色电影在线 | 中文字幕乱在线伦视频中文字幕乱码在线 | 欧美激情奇米色 | 日本久久久影视 | 91大神免费在线观看 | 国产99久久久精品 | 天天舔夜夜操 | 亚洲综合黄色 | 精品一区二区综合 | 久久精品导航 | 99久久一区 | 伊人五月天.com | 久久好看免费视频 | 国产精品欧美一区二区三区不卡 | 亚洲涩涩网| 天天草视频 | 国产第一页精品 | www色 | 激情综合网色播五月 | 日韩av区| 亚洲免费av在线 | 久久中文网 | 亚洲一级国产 | 午夜视频色 | 丁香视频在线观看 | 婷香五月| 狠狠色丁香久久婷婷综合五月 | 日本精品xxxx| 天堂入口网站 | 特级毛片网 | 精品在线你懂的 | 亚洲欧洲精品一区二区精品久久久 | 日韩在线不卡视频 | 黄色大片日本 | 天天色婷婷 | 久久网站免费 | 国产精品永久免费视频 | 国产手机在线播放 | 中文日韩在线视频 | 999国产在线 | 亚洲激情国产精品 | 69久久99精品久久久久婷婷 | 国产综合福利在线 | 国产黄色理论片 | 婷婷中文字幕在线观看 | 丁香激情综合国产 | 亚洲国内精品 | 91精品国自产在线观看 | 青草视频在线 | av黄色av | 亚州精品成人 | 久久亚洲综合国产精品99麻豆的功能介绍 | 精品国产1区2区3区 国产欧美精品在线观看 | 亚洲国产日韩av | 区一区二区三区中文字幕 | 国产中文字幕在线免费观看 | 亚洲女人天堂成人av在线 | 日日夜夜网 | 日本在线观看视频一区 | 97综合在线 | 久久久国产一区二区三区四区小说 | 色视频网站在线观看一=区 a视频免费在线观看 | 蜜臀av性久久久久av蜜臀妖精 | 草久在线播放 | www.黄色片网站 | a黄色片 | 日韩理论在线视频 | 久久综合成人 | 97超碰免费在线 | 亚洲视频电影在线 | 亚洲国产欧美在线看片xxoo | 国产精品在线看 | 国产精品婷婷午夜在线观看 | 中文字幕国语官网在线视频 | 香蕉精品视频在线观看 | 精品视频久久久 | 中文字幕在线日 | 国产99久久久国产精品免费看 | 久久不射电影网 | 国产精品视频永久免费播放 | 国产专区日韩专区 | 久久精品欧美视频 | 成年人在线 | 久久久久免费精品视频 | 视频1区2区 | 久久精品一二三区白丝高潮 | 91久久偷偷做嫩草影院 | 亚洲国产片色 | 国产伦精品一区二区三区无广告 | 久久婷亚洲五月一区天天躁 | 手机在线看片日韩 | 免费看短| 2023亚洲精品国偷拍自产在线 | 亚洲人毛片 | 国产亚洲精品久久久久久网站 | 欧美成人xxx | 黄色资源在线观看 | www.av免费观看| 欧美性春潮| 国产资源免费在线观看 | av资源在线观看 | 国产精品久久久久久久久久久免费 | 欧美精品一区在线 | 精品一二三四五区 | 911在线 | 13日本xxxxxⅹxxx20 | 成人黄色短片 | 亚洲精品美女久久久久网站 | 欧美人操人| 91mv.cool在线观看 | 五月天激情综合网 | 中文字幕色站 | 国产精品一区久久久久 | 91日韩精品视频 | 在线观看av网 | 人人玩人人爽 | 九九热在线精品视频 | 亚洲精品综合一二三区在线观看 | 日韩精品一区二区三区水蜜桃 | 欧美日韩a视频 | 国产69精品久久99不卡的观看体验 | 色天天天| 亚洲日本精品 | 久久er99热精品一区二区三区 | 久久理论电影网 | 免费黄色av电影 | 精品久久福利 | 久草视频一区 | 久久久久综合视频 | 三级免费黄色 | av在线播放亚洲 | a资源在线 | 亚洲精品中文字幕在线 | 成人av在线看 | 欧美性生活大片 | 日韩免费高清在线 | 在线а√天堂中文官网 | 日韩一级黄色大片 | 中文字幕麻豆 | 狠狠的日日 | 日韩精品一区二区三区三炮视频 | 亚洲精品动漫在线 | 中文字幕久久久精品 | 五月天天av | 成年人看片 | 激情婷婷| 久久综合国产伦精品免费 | 亚洲国产剧情av | 亚洲精品国产精品国自产观看浪潮 | 久久久久免费精品视频 | www日韩视频 | 中文字幕第一 | 久久国产影院 | 免费看黄的视频 | 色综合久久久久久久久五月 | 久久久99精品免费观看乱色 | 99精品国自产在线 | 精品影院| 亚洲自拍av在线 | 91日韩在线视频 | 精品国产成人在线影院 | 91视频在线免费下载 | 欧美a在线免费观看 | 久久精品毛片基地 | 99色在线播放 | 在线观看亚洲a | 国产视频资源 | 久草在线看片 | 丁香视频全集免费观看 | 午夜三级毛片 | 黄网站大全 | 日韩免费视频一区二区 | 韩国av免费看 | 久久在视频 | 就要干b | 国产亚洲亚洲 | 久久av福利 | 亚洲视频播放 | 中文视频在线 | 亚洲精品看片 | 国产h片在线观看 | 欧美一级特黄高清视频 | 国产91精品在线播放 | 国产精品自产拍在线观看网站 | 亚洲九九 | 怡红院久久| 国产精品亚洲人在线观看 | 亚洲综合激情网 | 四虎在线永久免费观看 | 欧美最猛性xxxxx(亚洲精品) | 国产日产欧美在线观看 | 天天搞天天干天天色 | 欧美午夜久久久 | 日韩在线免费不卡 | 国产黄色大片 | 久久视频一区二区 | 黄色字幕网 | 国产精品免费在线播放 | 免费看色视频 | 五月天高清欧美mv | 国产精品孕妇 | 婷婷在线免费视频 | 91精品欧美 | 久久久久久久福利 | 黄色大片免费网站 | 三上悠亚一区二区在线观看 | 国内精品久久久久久 | 国产一级在线看 | 欧美一区二区在线刺激视频 | 日韩精品免费在线 | 中文久久精品 | 顶级欧美色妇4khd | 狠狠久久综合 | 成人av观看 | 人人舔人人爽 | 精品视频久久久久久 | 亚洲天天在线 | 国产免费黄视频在线观看 | 久久伊人免费视频 | 久草网站在线观看 | 中文字幕免 | 中文字幕丝袜制服 | 成人精品视频久久久久 | 日本中文字幕视频 | 97碰碰视频| 欧美性色黄大片在线观看 | 黄色.com| 在线视频 一区二区 | www夜夜 | 久久一区91 | 国产日韩精品一区二区三区 | 天天操天天摸天天爽 | 国产精品观看视频 | 欧美性大战 | 国产日韩精品在线观看 | 国产精品美乳一区二区免费 | 亚洲黄a | 97福利在线 | 久久97精品| 欧美亚洲成人xxx | 国产视频欧美视频 |