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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android APK的加固方法

發(fā)布時間:2024/1/23 Android 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android APK的加固方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

有人的地方就有競爭,在Android的發(fā)展過程中就伴隨著逆向和安固加固的發(fā)展。逆向工作者可以通過一些非常好用的軟件,如IDA、JEB等,來加快逆向的速度;應(yīng)用開發(fā)工作者也會通過各種手段來阻止逆向工作者對自己的應(yīng)用進(jìn)行逆向。

但是往往情況下逆向是不可能做到百分百阻止的,所有只能通過其他的手段來提高自己應(yīng)用被逆向時的難度,讓逆向工作者需要(可不繞過)花費足夠多的時間才能把應(yīng)用逆向成功。在實際情況下,只要不明顯影響應(yīng)用運行速度,我們都可以采用這種思想來進(jìn)行保護(hù)。

在這種背景下,膨脹與混淆就應(yīng)運而生了,這就是我們最開始的一種保護(hù)方式。這種方式將代碼中的方法名和變量名用非常易于混淆的方式進(jìn)行命名,如0、o、O、l、I、1等組合命名方式。除了這種混淆方式外,為了提高逆向工作量,會在代碼中加入相同或者類似方法名的方法或者增加一些沒有必要的父類來達(dá)到代碼膨脹的目的。

但是這種方式不能阻止逆向工作者的腳步,后來開發(fā)者發(fā)現(xiàn)可以通過DexClassLoader這個類來進(jìn)行DEX文件的動態(tài)加載。我們一般情況下稱呼這種加固方式為加殼,由于這種是動態(tài)加載DEX文件,所以我們一般可以稱為DEX殼。但是Android 主要是由 Java 代碼編寫的,而 Java 代碼是非常容易被逆向分析的,所以漸漸地將動態(tài)加載DEX的代碼放入 so 層進(jìn)行運行,so 層的代碼主要為c/c++代碼,逆向的難度比 Java 會高很多,提高了應(yīng)用的安全性。

隨著這種加固方式的不斷普及,這種方式已經(jīng)不能阻擋大多數(shù)的逆向工作了,加固人員就需要一種新的加固方式來和逆向進(jìn)行對抗。后期不管是加固還是逆向,都將目光放在了so層的對抗,此時就發(fā)現(xiàn)了一種利用elf文件格式(Android中.so的共享庫為elf文件格式)來進(jìn)行加固的方法。

在so中,自己定義一個節(jié),在這個節(jié)中存放我們的一些關(guān)鍵功能代碼,通過elf文件格式將這部分的代碼進(jìn)行加密,然后在elf文件加載執(zhí)行初始化函數(shù)數(shù)組時,將被加密的代碼解密出來。

加殼或者其他加固的優(yōu)勢: 能在一定程度上保護(hù)自己核心代碼算法,提高破解、盜版或者二次打包的難度,還可以防范代碼注入、動態(tài)調(diào)試、內(nèi)存注入攻擊。

加殼或者其他加固的劣勢: 從理論上來說,只要加了保護(hù)都可能會影響應(yīng)用的兼容性、運行效率。

由于受Android手機的電池、CPU等硬件的限制,一般的應(yīng)用都不可能像PC上進(jìn)行強度非常大的保護(hù)。

混淆、膨脹

混淆

主題思想:用沒有意義的字符,如a、b、c或者易于混淆的字符,如0、o、O、l、I、1代替原本的有意義的類名。

參數(shù)配置: 將release下的minifyEnabled的值改為true,打開混淆;加上shrinkResources true,打開資源壓縮。

#壓縮級別0-7,Android一般為5(對代碼迭代優(yōu)化的次數(shù)) -optimizationpasses 5#不使用大小寫混合類名 -dontusemixedcaseclassnames#混淆時記錄日志 -verbose#不警告org.greenrobot.greendao.database包及其子包里面未應(yīng)用的應(yīng)用 -dontwarn org.greenrobot.greendao.database.** -dontwarn rx.** -dontwarn org.codehaus.jackson.**...... #保持jackson包以及其子包的類和類成員不被混淆 -keep class org.codehaus.jackson.** {*;} #---------重要說明------- #-keep class 類名 {*;} #-keepclassmembers class 類名{*;} #一個*表示保持了該包下的類名不被混淆; # -keep class org.codehaus.jackson.* # 二個**表示保持該包以及它包含的所有子包下的類名不被混淆 # -keep class org.codehaus.jackson.** #--------------------------------- #保持類名、類里面的方法和變量不被混淆 -keep class org.codehaus.jackson.** {*;| #不混淆類ClassTwoOne的類名以及類里面的public成員和方法 #public 可以換成其他java屬性如private、public static、final等 #還可以使<init>表示構(gòu)造方法、<methods>表示方法、<fields>表示成員, #這些前面也可以加public等java屬性限定 -keep class com.dev.demo.two.ClassTwoOne {public *; } #不混淆類型,以及里面的構(gòu)造函數(shù) -keep class com.dev.demo.ClassOne {public <init>(); } #不混淆類名,以及里面的構(gòu)造函數(shù) -keep class com.dev.demo.ClassOne {public <init>(); } #不混淆類名,以及參數(shù)為int的構(gòu)造函數(shù) -keep class com.dev.demo.two.ClassTwoTwo {public <init>(int); } #不混淆類的public修飾的方法,和private修飾的變量 -keepclassmembers class com.dev.demo.two.ClassTwoThree {public <methods>;private <fields>; }#不混淆內(nèi)部類,需要用$修飾 #不混淆內(nèi)部類ClassTwoTwoInner以及里面的全部成員 -keep class com.dev.demo.two.ClassTwoTwo$ClassTwoTwoInner{*;}

更多混淆配置參考:

https://juejin.cn/post/6844903471095742472

https://www.huaweicloud.com/articles/ae151e2f60923097cefc473bd131addf.html

膨脹

代碼混淆能在一定程度上增加逆向的難度,但是給逆向工作者增加的工作量是比較小的,代碼膨脹就能夠增加總的代碼量,讓逆向工作者必須分析全部的代碼才能得到最終的一些結(jié)果。代碼膨脹也是初始防御的方法之一,主要思想是編寫一些垃圾代碼來擴充代碼量,這樣在逆向分析時就可能會消耗攻擊者大量的時間,從而達(dá)到保護(hù)APK的目的。

膨脹代碼有很多種實現(xiàn)的思想。比如乘法改加法、加法改自加等等,只要把代碼量變大,不影響功能的實現(xiàn)就可以了。

這里自己寫了一個簡單的自動生成代碼的工程。

https://gitee.com/koifishly/function_generator

DEX殼

之前Android的主要代碼為Java代碼,但是在逆向分析中,Java代碼是很容易被分析出來的。為了解決這個問題,我們就希望在app運行起來后動態(tài)加載我們Java代碼(.dex文件)。這種方法主要利用了DexClassLoader這個類來實現(xiàn)動態(tài)加載。DexClassLoader類支持動態(tài)加載.apk或者.dex。

動態(tài)加載APK

動態(tài)加載apk簡單來說,就是將已經(jīng)編譯好的.apk文件放入到一個.dex文件中。這個.apk文件為我們真正的應(yīng)用程序,以下啊就成為這個apk為源APK; .dev文件為另外一個工程的.dex文件,這個工程主要是為了在運行時釋放出源APK,然后將流程轉(zhuǎn)到源APK執(zhí)行。

根據(jù)上面的原理圖,我們需要3個對象.

  • 源APK: 需要加殼的apk。
  • 殼APK: 將apk解密還原并執(zhí)行。
  • 加密工具: 將源apk和殼dex進(jìn)行組合成新的dex并且修正新的dex。

項目實現(xiàn)demo代碼

IDE:Android Studio 4.1.3

Android版本:4.4+?

項目源碼:nisosaikou/AndroidDEX殼?-?碼云?-?開源中國?(gitee.com)

源APK

1、正常編寫功能邏輯代碼。這里的代碼為簡單的ctf判斷代碼。

?2.新建類APP類并且這個類繼承于類Application,實現(xiàn)onCreate方法。

?3.生成一個release版本apk,把這個apk保存起來。

修改MainActivity.java的父類,使得MainActivity繼承于Activity。將文本顯示修改為運行的是源APK。

?

殼APK

Proxy.java

新建一個代理類叫Proxy,繼承于類Application。這個類用來釋放和解密原始的APK。

attachBaseContext()

重寫Application中的attachBaseContext方法。這個方法會在Activity的onCreate方法之前執(zhí)行。

方法實現(xiàn)的功能主要有:

把殼dex中包含的源apk釋放出來。

把釋放的apk進(jìn)行加密。

把源apk中的lib目錄中的文件復(fù)制到當(dāng)前程序(殼)的路徑下。

創(chuàng)建一個新的DexClassLoader,替換到父節(jié)點的DexClassLoader。

DexClassLoader繼承自BaseDexClassLoader,這個比較靈活,每個參數(shù)都可以自定義,我們一般用這個來加載自定義的apk/dex/jar文件。

代碼例子:

@Override protected void attachBaseContext(Context base) {super.attachBaseContext(base);// the getDir method will create a directory in /data/user/0(uid)/packagename/// the dx directory holds the file of the source apkFile relesaeDir = this.getDir("dx", MODE_PRIVATE);mSouceAPKLibAbsolutePath = this.getDir("lx", MODE_PRIVATE).getAbsolutePath();mSourceAPKReleaseDir = relesaeDir.getAbsolutePath();mSourceAPKAbsolutePath = mSourceAPKReleaseDir + "/" + mSouceAPKName;// create the source apk// if the source apk exist, do nothing, otherwise create the source apk file.File sourceApk = new File(mSourceAPKAbsolutePath);if (!sourceApk.exists()){try{sourceApk.createNewFile();} catch (Exception e) {Log.e(TAG, "failed to create file.");}// the source apk file is empty, you need to read source apk file from the dex// file of the shell apk and save it.byte[] shellDexData;// get dex of shell apk.shellDexData = getShellDexFileFromShellApk();// get the source apk and decrypt it.// copy the libs in the decrypted apk file to the lib directory.getSourceApkFile(shellDexData);}// Configure dynamic load environmentObject currentActivityThread = RefInvoke.invokeStaticMethod("android.app.ActivityThread", "currentActivityThread", new Class[] {}, new Object[] {});String packageName = this.getPackageName();ArrayMap mPackages = (ArrayMap) RefInvoke.getFieldOjbect("android.app.ActivityThread", currentActivityThread, "mPackages");WeakReference weakReference = (WeakReference) mPackages.get(packageName);DexClassLoader newDexClassLoader = new DexClassLoader(mSourceAPKAbsolutePath, mSourceAPKReleaseDir, mSouceAPKLibAbsolutePath, (ClassLoader) RefInvoke.getFieldOjbect("android.app.LoadedApk", weakReference.get(), "mClassLoader"));RefInvoke.setFieldOjbect("android.app.LoadedApk", "mClassLoader", weakReference.get(), newDexClassLoader); }

onCreate()

加載源apk資源

獲取mainifest.xml中記錄的源apk的啟動類名。

設(shè)置ActivityThread信息(android.app.ActivityThread->currentActivityThread)。

代碼例子:

@Override public void onCreate() {super.onCreate();// 源apk啟動類String srcAppClassName = "";// 原apk所在路徑try{ApplicationInfo applicationInfo = this.getPackageManager().getApplicationInfo(this.getPackageName(), PackageManager.GET_META_DATA);Bundle bundle = applicationInfo.metaData;if (bundle != null && bundle.containsKey(SRC_APP_MAIN_ACTIVITY)) {srcAppClassName = bundle.getString(SRC_APP_MAIN_ACTIVITY);//className 是配置在xml文件中的。}else {return;}}catch (Exception e){}//獲取ActivityThread類下AppBindData類的成員屬性 LoadedApk info;Object currentActivityThread = RefInvoke.invokeStaticMethod("android.app.ActivityThread", "currentActivityThread", new Class[] {}, new Object[] {});Object mBoundApplication = RefInvoke.getFieldOjbect("android.app.ActivityThread", currentActivityThread, "mBoundApplication");Object loadedApkInfo = RefInvoke.getFieldOjbect("android.app.ActivityThread$AppBindData", mBoundApplication, "info");// 將原來的loadedApkInfo置空RefInvoke.setFieldOjbect("android.app.LoadedApk", "mApplication", loadedApkInfo, null);// 獲取殼線程的ApplicationObject oldApplication = RefInvoke.getFieldOjbect("android.app.ActivityThread", currentActivityThread, "mInitialApplication");ArrayList<Application> mAllApplications = (ArrayList<Application>) RefInvoke.getFieldOjbect("android.app.ActivityThread", currentActivityThread, "mAllApplications");mAllApplications.remove(oldApplication);// 構(gòu)造新的Application// 1.更新 2處classNameApplicationInfo appinfo_In_LoadedApk = (ApplicationInfo) RefInvoke.getFieldOjbect("android.app.LoadedApk", loadedApkInfo, "mApplicationInfo");ApplicationInfo appinfo_In_AppBindData = (ApplicationInfo) RefInvoke.getFieldOjbect("android.app.ActivityThread$AppBindData", mBoundApplication, "appInfo");appinfo_In_LoadedApk.className = srcAppClassName;appinfo_In_AppBindData.className = srcAppClassName;// 2.注冊applicationApplication app = (Application) RefInvoke.invokeMethod("android.app.LoadedApk", "makeApplication", loadedApkInfo, new Class[] { boolean.class, Instrumentation.class }, new Object[] { false, null });//替換ActivityThread中的mInitialApplicationRefInvoke.setFieldOjbect("android.app.ActivityThread", "mInitialApplication", currentActivityThread, app);//替換之前的 內(nèi)容提供者為剛剛注冊的appArrayMap mProviderMap = (ArrayMap) RefInvoke.getFieldOjbect("android.app.ActivityThread", currentActivityThread, "mProviderMap");Iterator it = mProviderMap.values().iterator();while (it.hasNext()) {Object providerClientRecord = it.next();Object localProvider = RefInvoke.getFieldOjbect("android.app.ActivityThread$ProviderClientRecord", providerClientRecord, "mLocalProvider");RefInvoke.setFieldOjbect("android.content.ContentProvider", "mContext", localProvider, app);}app.onCreate(); }

ActivityThread功能

它管理應(yīng)用進(jìn)程的主線程的執(zhí)行(相當(dāng)于普通Java程序的main入口函數(shù)),并根據(jù)AMS的要求(通過IApplicationThread接口,AMS為Client、ActivityThread.ApplicationThread為Server)負(fù)責(zé)調(diào)度和執(zhí)行activities、broadcasts和其他操作。

在Android系統(tǒng)中,在默認(rèn)情況下,一個應(yīng)用程序內(nèi)的各個組件(如Activity、BroadcastReceiver、Service)都會在同一個進(jìn)程(Process)里執(zhí)行,且由此進(jìn)程的【主線程】負(fù)責(zé)執(zhí)行。

在Android系統(tǒng)中,如果有特別指定(通過android:process),也可以讓特定組件在不同的進(jìn)程中運行。無論組件在哪一個進(jìn)程中運行,默認(rèn)情況下,他們都由此進(jìn)程的【主線程】負(fù)責(zé)執(zhí)行。

【主線程】既要處理Activity組件的UI事件,又要處理Service后臺服務(wù)工作,通常會忙不過來。為了解決此問題,主線程可以創(chuàng)建多個子線程來處理后臺服務(wù)工作,而本身專心處理UI畫畫的事件。

類結(jié)構(gòu)參考

調(diào)用currentActivityThread方法獲取ActivityThread中的成員變量sCurrentActivityThread。

Object currentActivityThread = RefInvoke.invokeStaticMethod("android.app.ActivityThread", "currentActivityThread", new Class[] {}, new Object[] {});

?

獲取sCurrentActivityThread中的mBoundApplication。

Object mBoundApplication = RefInvoke.getFieldObject("android.app.ActivityThread", currentActivityThread, "mBoundApplication");

獲取mBoundApplication中成員變量info。

Object loadedApkInfo = RefInvoke.getFieldObject("android.app.ActivityThread$AppBindData", mBoundApplication, "info");

觀察LoadedApk這個類,能發(fā)現(xiàn)一些重要的屬性,這個下面會用到。

將info中的mApplication屬性置空。

RefInvoke.setFieldObject("android.app.LoadedApk", "mApplication", loadedApkInfo, null);

在sCurrentActivityThread下的鏈表mAllApplications中移除mInitialApplication。mInitialApplication存放初始化的應(yīng)用(當(dāng)前殼應(yīng)用),mAllApplications存放的是所有的應(yīng)用。

把當(dāng)前的應(yīng)用,從現(xiàn)有的應(yīng)用中移除掉,然后再把新構(gòu)建的加入到里面去。

Object oldApplication = RefInvoke.getFieldOjbect("android.app.ActivityThread", currentActivityThread, "mInitialApplication");ArrayList<Application> mAllApplications = (ArrayList<Application>) RefInvoke.getFieldOjbect("android.app.ActivityThread", currentActivityThread, "mAllApplications");mAllApplications.remove(oldApplication);

構(gòu)造新的Application


更新2處className。

ApplicationInfo appinfo_In_LoadedApk = (ApplicationInfo) RefInvoke.getFieldOjbect("android.app.LoadedApk", loadedApkInfo, "mApplicationInfo");ApplicationInfo appinfo_In_AppBindData = (ApplicationInfo) RefInvoke.getFieldOjbect("android.app.ActivityThread$AppBindData", mBoundApplication, "appInfo");appinfo_In_LoadedApk.className = srcAppClassName;appinfo_In_AppBindData.className = srcAppClassName;

注冊application(用LoadedApk中的makeApplication方法注冊)。

Application app = (Application) RefInvoke.invokeMethod("android.apo.LoadedApk", "makeApplication", loadedApkInfo, new Class[] { boolean.class, Instrumentation.class }, new Object[] {false, null});

?替換mInitialApplication為剛剛創(chuàng)建的app。

RefInvoke.setFieldObject("android.app.ActivityThread", "mInitialApplication",currentActivityThread, app);

更新ContentProvider。

ArrayMap mProviderMap = (ArrayMap) RefInvoke.getFieldObject("android.app.ActivityThread", currentActivityThread, "mProviderMap");Iterator it = mProviderMap.values().iterator(); while (it.hasNext()) {Object providerClientRecord = it.next();Object localProvider = RefInvoke.getFieldObject("android.app.ActivityThread$ProviderClientRecord", providerClientRecord, "mLocalProvider");RefInvoke.setFieldObject("android.content.ContentProvider", "mContext", localProvider, app); }

執(zhí)行新app的onCreate方法。

app.onCreate();

RefInvoke.java

Java反射調(diào)用的方法。

package org.koi.dexloader;import java.lang.reflect.Field; import java.lang.reflect.Method;public class RefInvoke {public static Object invokeStaticMethod(String class_name, String method_name, Class[] pareType, Object[] pareValues) {try {Class obj_class = Class.forName(class_name);Method methodd = obj_class.getMethod(method_name, pareTyple);return method.invoke(null, pareValues);} catch (Exception e) {e.printStackTrace();}return null;}public static Object getFieldObject(String class_name, Object obj, String fieldName) {try {Class obj_class = Class.forName(class_name);Field field = obj_class.getDeclaredField(fieldName);field.setAccessible(true);} catch (Exception e) {e.printStackTrace();}return null;}public static void setFieldObject(String classname, String fieldName, Object obj, Object fieldValue) {try {Class obj_class = Class.forName(classname);Field field = obj_class.getDeclaredField(fieldName);field.setAccessible(true);field.set(obj, fieldValue);} catch (Exception e) {e.printStackTrace();}}public static Object invokeMethod(String class_name, String method_name, Object obj, Class[] pareTyple, Object[] pareValues) {try {Class obj_class = Class.forName(class_name);Method method = obj_class.getMethod(method_name, pareTyple);return method.invoke(obj, pareValues);} catch (Exception e) {e.printStackTrace();}return null;}}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.koi.dexloader"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:name=".Proxy" android:theme="@style/Theme.DexLoader"> <meta-data android:name="APPLICATION_CLASS_NAME" android:value="org.koi.ctf20200802.APP"/> <activity android:name="org.koi.ctf20200802.MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>

關(guān)于資源的問題

到目前為止,源程序能夠運行起來了,但是apk在運行的時候肯定會用到相關(guān)的資源,如布局文件等等,我們并沒有介紹如何處理資源。

資源有2種大的處理方法。第一種是在殼dex解壓出源apk時,把apk中的資源復(fù)制到現(xiàn)在程序下。第二種是替換殼apk中dex文件時,順便用源apk中的資源文件替換到殼apk中。因為本文不重點討論資源的處理問題,所以采用第二種方法,直接復(fù)制替換資源即可。

Dex組合修復(fù)工具

將APK和殼DEX文件合并,生成一個新的DEX文件,并且校正新的DEX文件頭。

加殼步驟

  • src.apk: 源APK。

  • des.apk: 殼APK。

  • DexFixed.jar: Dex工具

  • classes.dex: des.apk的classes.dex。

  • res: 源APK中的文件夾。

  • resources.arsc: 源APK中的文件。

1、用DEXFixed.jar工具把src.apk和classes.dex進(jìn)行合并,生成一個新的Dex,替換到殼APK中。

2、替換殼APK中的classes.dex、res、resources.arsc。

3、apk重新簽名。

4、正常運行。

總結(jié)

dex殼是比較基礎(chǔ)的殼,只是將源APK加密后放入dex文件中,在運行時進(jìn)行釋放。我們只需要在殼程序解密出原始的APK運行后,在內(nèi)存中把dexdump下來就可以了,我們也可以用frida框架進(jìn)行脫殼。

動態(tài)加載DEX(Java)

我們在上面動態(tài)加載APK時采用了兩個工程,一個工程負(fù)責(zé)加載APK,一個負(fù)責(zé)業(yè)務(wù)流程,業(yè)務(wù)流程工程核心文件就是一個dex文件,可以考慮只將dex文件作為附件,然后進(jìn)行動態(tài)加載dex。

項目實現(xiàn)demo代碼

簡單來說,這里存放git的鏈接。

源工程

  • 新建一個簡單功能的 Android 工程。

  • 創(chuàng)建assets文件夾。

保存編譯之后apk文件中的.dex文件,把.dex文件保存到assets目錄下。dex文件重命名為origin.dex(可以重命名為任意文件名)。

刪除MainActivity.java。注意:這里只刪除源文件,不要刪除Activity。

加密DEX

新建一個Java工程實現(xiàn)一個簡單的加密。

import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream;public class Main {public static void main(String[] args) {if (args.length != 2) {System.out.println("jar : <source file> <encrypted file>");return;}String sourceFile = args[0];String encryptedFile = args[1];try {FileInputStream fis = new FileInputStream(sourceFile);BufferedInputStream bis = new BufferedInputStream(fis);FileOutputStream fos = new FileOutputStream(encryptedFile);BufferedOutputStream bos = new BufferedOutputStream(fos);byte[] buffer = new byte[10240];int acount = 0;while ((acount = bis.read(buffer)) != -1) {}bos.flush();//關(guān)閉的時候只需要關(guān)閉最外面的流就行了bos.close();bis.close();} catch (Exception e) {e.printStackTrace();}}public static byte[] encrypt(byte[] sourceData) {for (int i=0; i<sourceData.length; i++) {sourceData[i] ^= 273;}return sourceData;} }

把得到的加密文件放入剛剛創(chuàng)建的assets目錄下。

把重命名后的文件可以通過加密后再放入assets目錄下,然后再加載dex前進(jìn)行解密。

殼工程

這里殼工程就在源工程的基礎(chǔ)上修改就可以了,不需要在新建一個工程。

分別創(chuàng)建ProxyApplication.java和RefInvoke.java。這兩個類的代碼和上面基本一樣,這里就不贅述了,直接看代碼。

ProxyApplication.java

package org.koi.ctf20210813;import android.app.Application; import android.content.Context; import android.util.ArrayMap;import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.lang.ref.WeakReference;import dalvik.system.DexClassLoader;public class P extends Application {private final static String encryptedFileName = "flag";private final static String package_name = "org.koi.ctf20210813";private final static String activity_thread = "android.app.ActivityThread";private final static String current_activity_thread = "currentActivityThread";@Overrideprotected void attachBaseContext(Context base) {super.attachBaseContext(base);try {File cacheDir = getCacheDir();if (!cacheDir.exists()){cacheDir.mkdirs();}File outFile = new File(cacheDir, "out.dex");InputStream is = getAssets().open(encryptedFileName);FileOutputStream fos = new FileOutputStream(outFile);byte[] buffer = new byte[1024];int byteCount;while ((byteCount = is.read(buffer)) != -1) {buffer = decrypt(buffer);fos.write(buffer, 0, byteCount);}fos.flush();is.close();fos.close();String file_abs_path = outFile.getAbsolutePath();Object currentActivityThread = I.invokeStaticMethod(activity_thread, current_activity_thread, new Class[]{}, new Object[]{});ArrayMap mPackages = (ArrayMap)I.getFieldOjbect(activity_thread, currentActivityThread, "mPackages");WeakReference weakReference = (WeakReference) mPackages.get(package_name);ClassLoader parent = (ClassLoader)I.getFieldOjbect("android.app.LoadedApk", weakReference.get(), "mClassLoader");DexClassLoader dLoader = null;File dexOpt = base.getDir("dexOpt", base.MODE_PRIVATE);dLoader = new DexClassLoader(file_abs_path, dexOpt.getAbsolutePath(), null, parent);I.setFieldOjbect("android.app.LoadedApk", "mClassLoader", weakReference.get(), dLoader);} catch (IOException e) {e.printStackTrace();}}public static byte[] decrypt(byte[] sourceData){for (int i = 0; i < sourceData.length; i++){sourceData[i] ^= 273;}return sourceData;}@Overridepublic void onCreate() {super.onCreate();} }

DexClassLoader加載Dex文件:

DexClassLoader(dexPath, optimizedDirectory, libraryPath, parent)dexPath:目標(biāo)類所在的APK或者jar包,/.../xxx.jaroptimizedDirectory:從APK或者jar解壓出來的dex文件存放路徑libraryPath:native庫路徑,可以為nullparent:父類裝載器,一般為當(dāng)前類的裝載器、

RefInvoke.java

package org.koi.ctf20210813;import java.lang.reflect.Field; import java.lang.reflect.Method;public class I {public static Object invokeStaticMethod(String class_name, String method_name, Class[] pareTyple, Object[] pareVaules){try {Class obj_class = Class.forName(class_name);Method method = obj_class.getMethod(method_name,pareTyple);return method.invoke(null, pareVaules);} catch (Exception e) {e.printStackTrace();}return null;}public static Object getFieldOjbect(String class_name,Object obj, String filedName){try {Class obj_class = Class.forName(class_name);Field field = obj_class.getDeclaredField(filedName);field.setAccessible(true);return field.get(obj);} catch (Exception e) {e.printStackTrace();}return null;}public static void setFieldOjbect(String classname, String filedName, Object obj, Object filedVaule){try {Class obj_class = Class.forName(classname);Field field = obj_class.getDeclaredField(filedName);field.setAccessible(true);field.set(obj, filedVaule);} catch (Exception e) {e.printStackTrace();}}public static Object invokeMethod(String class_name, String method_name, Object obj ,Class[] pareTyple, Object[] pareVaules){try {Class obj_class = Class.forName(class_name);Method method = obj_class.getMethod(method_name,pareTyple);return method.invoke(obj, pareVaules);} catch (Exception e) {e.printStackTrace();}return null;} }

AndroidManifest.xml

確認(rèn)刪除MainActivity.java,然后修改AndroidManifest.xml。

這樣在執(zhí)行時能解密原來dex文件。

APK中的DEX文件中,不包含重要代碼。

動態(tài)加載DEX(SO)

在上面的基礎(chǔ)上,想到可以把ProxyApplication.java和RefInvoke.java中的主要代碼移到so中來運行,這就是我們這種殼的主要思路。和上面的實現(xiàn)方式是一樣的,只是換到lib中運行而已。

創(chuàng)建一個Android 原生工程,和上面一樣,在MainActivity中寫一些簡單代碼。把dex文件加密后放入assets文件夾中。

新建ProxyApplication類,繼承Application,把加載Dex這部分代碼提取出來放入到一個新的類AttackBaseContent中。

ProxyApplication.java

import android.app.Application; import android.content.Context;public class P extends Application {static {System.loadLibrary("ctf20210814");}@Overrideprotected void attachBaseContext(Context base) {super.attachBaseContext(base);attachBase(base);}@Overridepublic void onCreate() {super.onCreate();}public static native void attachBase(Context base); }

這里新建一個koi.cpp文件,其中有一個Java_org_koi_dexsoshell_AttachBaseContext_onAttach函數(shù),對應(yīng)Java中AttachBaseContext類下的onAttach方法。

native-lib.cpp

#include <jni.h> #include <string>// only update here #define ENCRYPTED_FILE_NAME "flag" #define DECRYPTED_FILE_NAME "ot.dex" #define PACKAGE_NAME "org.koi.ctf20210814"extern "C" JNIEXPORT void JNICALL Java_org_koi_ctf20210814_P_attachBase(JNIEnv *env, jclass clazz, jobject base) {jclass clz_File = env->FindClass("java/io/File");jclass clz_Context = env->FindClass("android/content/Context");jclass clz_AssetManager = env->FindClass("android/content/res/AssetManager");jclass clz_InputStream = env->FindClass("java/io/InputStream");jclass clz_FileOutputStream = env->FindClass("java/io/FileOutputStream");jclass clz_ActivityThread = env->FindClass("android/app/ActivityThread");jclass clz_ArrayMap = env->FindClass("android/util/ArrayMap");jclass clz_WeakReference = env->FindClass("java/lang/ref/WeakReference");jclass clz_LoadedApk = env->FindClass("android/app/LoadedApk");jclass clz_DexClassLoader = env->FindClass("dalvik/system/DexClassLoader");jmethodID mid_File_init = env->GetMethodID(clz_File, "<init>","(Ljava/io/File;Ljava/lang/String;)V");jmethodID mid_FileOutputStream_init = env->GetMethodID(clz_FileOutputStream, "<init>","(Ljava/io/File;)V");jmethodID mid_DexClassLoader_init = env->GetMethodID(clz_DexClassLoader, "<init>","(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)V");jmethodID mid_Context_getCacheDir = env->GetMethodID(clz_Context, "getCacheDir","()Ljava/io/File;");jmethodID mid_Context_getAssets = env->GetMethodID(clz_Context, "getAssets","()Landroid/content/res/AssetManager;");jmethodID mid_Context_getDir = env->GetMethodID(clz_Context, "getDir","(Ljava/lang/String;I)Ljava/io/File;");jmethodID mid_AssetManager_open = env->GetMethodID(clz_AssetManager, "open","(Ljava/lang/String;)Ljava/io/InputStream;");jmethodID mid_File_exists = env->GetMethodID(clz_File, "exists", "()Z");jmethodID mid_File_mkdirs = env->GetMethodID(clz_File, "mkdirs", "()Z");jmethodID mid_File_getAbsolutePath = env->GetMethodID(clz_File, "getAbsolutePath","()Ljava/lang/String;");jmethodID mid_InputStream_read = env->GetMethodID(clz_InputStream, "read", "([B)I");jmethodID mid_InputStream_close = env->GetMethodID(clz_InputStream, "close", "()V");jmethodID mid_InputStream_available = env->GetMethodID(clz_InputStream, "available", "()I");jmethodID mid_FileOutputStream_write = env->GetMethodID(clz_FileOutputStream, "write","([BII)V");jmethodID mid_FileOutputStream_flush = env->GetMethodID(clz_FileOutputStream, "flush", "()V");jmethodID mid_FileOutputStream_close = env->GetMethodID(clz_FileOutputStream, "close", "()V");jmethodID mid_ActivityThread_currentActivityThread = env->GetStaticMethodID(clz_ActivityThread,"currentActivityThread","()Landroid/app/ActivityThread;");jmethodID mid_ArrayMap_get = env->GetMethodID(clz_ArrayMap, "get","(Ljava/lang/Object;)Ljava/lang/Object;");jmethodID mid_WeakReference_get = env->GetMethodID(clz_WeakReference, "get","()Ljava/lang/Object;");jfieldID fid_ActivityThread_mPackages = env->GetFieldID(clz_ActivityThread, "mPackages","Landroid/util/ArrayMap;");jfieldID fid_LoadedApk_mClassLoader = env->GetFieldID(clz_LoadedApk, "mClassLoader","Ljava/lang/ClassLoader;");try {jobject cacheDir = env->CallObjectMethod(base, mid_Context_getCacheDir);if (!env->CallBooleanMethod(cacheDir, mid_File_exists)) {env->CallBooleanMethod(cacheDir, mid_File_mkdirs);}jstring str = env->NewStringUTF(DECRYPTED_FILE_NAME);jobject outFile = env->NewObject(clz_File, mid_File_init, cacheDir, str);jobject AssetManager = env->CallObjectMethod(base, mid_Context_getAssets);jstring out_file_name = env->NewStringUTF(ENCRYPTED_FILE_NAME);jobject is = env->CallObjectMethod(AssetManager, mid_AssetManager_open, out_file_name);jobject fos = env->NewObject(clz_FileOutputStream, mid_FileOutputStream_init, outFile);jint file_size = env->CallIntMethod(is, mid_InputStream_available);jbyteArray buffer = env->NewByteArray(file_size);env->CallIntMethod(is, mid_InputStream_read, buffer); //readjbyte* p_bt_ary = (jbyte*)env->GetByteArrayElements(buffer, 0);// here you can add decryption function.for (jint i = 0; i < file_size; ++i) {p_bt_ary[i] ^= 273;}env->SetByteArrayRegion(buffer, 0, file_size, p_bt_ary);env->CallVoidMethod(fos, mid_FileOutputStream_write, buffer, 0, file_size);env->DeleteLocalRef(buffer);env->CallVoidMethod(fos, mid_FileOutputStream_flush);env->CallVoidMethod(is, mid_InputStream_close);env->CallVoidMethod(fos, mid_FileOutputStream_close);jstring file_abs_path = (jstring) env->CallObjectMethod(outFile, mid_File_getAbsolutePath);jobject currentActivityThread = env->CallStaticObjectMethod(clz_ActivityThread,mid_ActivityThread_currentActivityThread);jobject mPackages = env->GetObjectField(currentActivityThread,fid_ActivityThread_mPackages);jstring package_name = env->NewStringUTF(PACKAGE_NAME);jobject weakReference = env->CallObjectMethod(mPackages, mid_ArrayMap_get, package_name);jobject loadedApk = env->CallObjectMethod(weakReference, mid_WeakReference_get);jobject parent = env->GetObjectField(loadedApk, fid_LoadedApk_mClassLoader);jstring jstr_dexOpt = env->NewStringUTF("dexOpt");jobject dexOpt = env->CallObjectMethod(base, mid_Context_getDir, jstr_dexOpt, 0);jstring dexOpt_abs_path = (jstring) env->CallObjectMethod(dexOpt, mid_File_getAbsolutePath);jstring str_null = env->NewStringUTF("");jobject dLoader = env->NewObject(clz_DexClassLoader, mid_DexClassLoader_init, file_abs_path,dexOpt_abs_path, str_null, parent);env->SetObjectField(loadedApk, fid_LoadedApk_mClassLoader, dLoader);} catch (...) {} }

這個例子中,進(jìn)行加密解密的操作,可以根據(jù)實際情況進(jìn)行修改。

JNI中有部分代碼可以提取到JNI_OnLoad或者initarray中進(jìn)行處理。

JNI中的所有字符串可以進(jìn)行一些處理,不直接暴露在源碼中。

AndroidManifest.xml

按照上面的方法進(jìn)行修改。

注意: 關(guān)閉minifyEnabled。

ELF文件殼

在學(xué)習(xí)這部分內(nèi)容之前需要熟悉ELF的文件格式。

ELF節(jié)加密

主要思想

編寫代碼時:自定義一個代碼節(jié)(.mytext)(以后要進(jìn)行加密,現(xiàn)在沒有處理),然后一個初始化函數(shù)(.init_array),在這個函數(shù)中找到elf文件加載到內(nèi)存中的地址,然后根據(jù)elf文件格式找到.mytext節(jié),對這個節(jié)的內(nèi)容進(jìn)行解密。

加密:在原始apk編譯好后,利用自己寫的代碼,把目標(biāo)lib中的.mytext進(jìn)行加密。

最后進(jìn)行簽名。

代碼

創(chuàng)建一個ndk項目。編寫一段代碼放入自定義的(代碼)節(jié).koitext中。

用__attribute__((section(".koitext")))來指定節(jié)。

#include <jni.h> #include <string>#define SECTION_NAME ".koitext"#define JNIHIDDEN __attribute__((visibility("hidden")))// save the result. int fw[40] = {13, 18, 14, 64, 11, 65, 16, 14, 20, 14, 11, 14, 18,61, 12, 13, 60, 60, 20, 62, 16, 61, 61, 64, 63, 63, 15, 18, 12, 63, 14, 64,13, 18, 14, 64, 11, 65, 16, 14}; int fs[38]; void str2ints (const char* fw, int* results); char* jstring2charAry(JNIEnv* env, jstring jstr);extern "C" JNIEXPORT __attribute__((section(SECTION_NAME))) jboolean JNICALL Java_org_koi_ctf20210821_MainActivity_checkflag(JNIEnv *env, jobject thiz, jstring flag) {char fg[]="flag{helloboy_ewri346hHeewr34dr}";str2ints(jstring2charAry(env, flag), fs);for (int i = 0; i < strlen(fg); ++i) {if(fw[i] != fs[i] )return false;}return true; }__attribute__((section(SECTION_NAME))) void str2ints (const char* fw, int* results) {for (int mX4WyHKgmwSPY1V = 0; mX4WyHKgmwSPY1V < 32; mX4WyHKgmwSPY1V++){results[mX4WyHKgmwSPY1V] = fw[mX4WyHKgmwSPY1V];}for (int _ZKdmdmEjiQ_Ouw = 0; _ZKdmdmEjiQ_Ouw < 32; _ZKdmdmEjiQ_Ouw++){results[_ZKdmdmEjiQ_Ouw] = results[_ZKdmdmEjiQ_Ouw] + 3;}for (int zbTK_I56tB0GevN = 0; zbTK_I56tB0GevN < 32; zbTK_I56tB0GevN++){results[zbTK_I56tB0GevN] = results[zbTK_I56tB0GevN] + 10;}for (int DfeXBWD6dcNPXKo = 0; DfeXBWD6dcNPXKo < 32; DfeXBWD6dcNPXKo++){results[DfeXBWD6dcNPXKo] = results[DfeXBWD6dcNPXKo] - 58;}for (int jqJhXnPQwPYi2G6 = 0; jqJhXnPQwPYi2G6 < 32; jqJhXnPQwPYi2G6++){results[jqJhXnPQwPYi2G6] = results[jqJhXnPQwPYi2G6] - 66;}for (int xA7fCVlKruHZC4Y = 0; xA7fCVlKruHZC4Y < 32; xA7fCVlKruHZC4Y++){results[xA7fCVlKruHZC4Y] = results[xA7fCVlKruHZC4Y] + 66;}for (int sGVbaq_poAxfJ3O = 0; sGVbaq_poAxfJ3O < 32; sGVbaq_poAxfJ3O++){results[sGVbaq_poAxfJ3O] = results[sGVbaq_poAxfJ3O] + 8;}for (int EIGWrEGI6UaAjH8 = 0; EIGWrEGI6UaAjH8 < 32; EIGWrEGI6UaAjH8++){results[EIGWrEGI6UaAjH8] = results[EIGWrEGI6UaAjH8] + 49;}for (int nHJAUmNRoQs5M9k = 0; nHJAUmNRoQs5M9k < 32; nHJAUmNRoQs5M9k++){results[nHJAUmNRoQs5M9k] = results[nHJAUmNRoQs5M9k] + 11;}for (int NzhuxVIobubHcRM = 0; NzhuxVIobubHcRM < 32; NzhuxVIobubHcRM++){results[NzhuxVIobubHcRM] = results[NzhuxVIobubHcRM] - 64;}for (int Wa46hlZr0UFGqFu = 0; Wa46hlZr0UFGqFu < 32; Wa46hlZr0UFGqFu++){results[Wa46hlZr0UFGqFu] = results[Wa46hlZr0UFGqFu] + 4;} }JNIHIDDEN __attribute__((section(SECTION_NAME))) char* jstring2charAry(JNIEnv* env, jstring jstr) {jclass jcls_String = env->FindClass("java/lang/String");jmethodID jmid_toCharArray = env->GetMethodID(jcls_String, "toCharArray", "()[C");jmethodID jmid_length = env->GetMethodID(jcls_String, "length", "()I");jcharArray charArray = (jcharArray)env->CallObjectMethod(jstr, jmid_toCharArray);jint len = env->CallIntMethod(jstr, jmid_length);char* pString = new char[len];pString[len] = 0;jboolean fals = false;for (int i = 0; i < len; ++i) {pString[i] = env->GetCharArrayElements(charArray, &fals)[i];}return pString; }

寫一個初始化的函數(shù),用來查找elf文件的基址以及給自定義的.koitext解密。

頭文件支持:

#include<sys/types.h> #include<unistd.h> #include <sys/mman.h> #include <elf.h> void init_native_Add() __attribute__((constructor)); unsigned long getLibAddr();// loaded so file #define SO_LIB_FILE_NAME "libctf20210821.so" void init_native_Add(){char name[15];unsigned int nblock;unsigned int nsize;unsigned long base;unsigned long text_addr;unsigned int i;Elf32_Ehdr *ehdr;Elf32_Shdr *shdr;base=getLibAddr(); //在/proc/id/maps文件中找到我們的so文件,活動so文件地址ehdr=(Elf32_Ehdr *)base;text_addr=ehdr->e_shoff+base;//加密節(jié)的地址nblock=ehdr->e_entry >>16;//加密節(jié)的大小nsize=ehdr->e_entry&0xffff;//加密節(jié)的大小printf("nblock = %d\n", nblock);//修改內(nèi)存權(quán)限if(mprotect((void *) (text_addr / PAGE_SIZE * PAGE_SIZE), 4096 * nsize, PROT_READ | PROT_EXEC | PROT_WRITE) != 0){puts("mem privilege change failed");}//進(jìn)行解密,是針對加密算法的for(i=0;i<nblock;i++){char *addr=(char*)(text_addr+i);*addr=~(*addr);}if(mprotect((void *) (text_addr / PAGE_SIZE * PAGE_SIZE), 4096 * nsize, PROT_READ | PROT_EXEC) != 0){puts("mem privilege change failed");}puts("Decrypt success"); } //獲取到SO文件加載到內(nèi)存中的起始地址,只有找到起始地址才能夠進(jìn)行解密; unsigned long getLibAddr(){unsigned long ret=0;char name[] = SO_LIB_FILE_NAME;char buf[4096];char *temp;int pid;FILE *fp;pid=getpid();sprintf(buf,"/proc/%d/maps",pid); //這個文件中保存了進(jìn)程映射的模塊信息 cap /proc/id/maps 查看fp=fopen(buf,"r");if(fp==NULL){puts("open failed");goto _error;}while (fgets(buf,sizeof(buf),fp)){if(strstr(buf,name)){temp = strtok(buf, "-"); //分割字符串,返回 - 之前的字符ret = strtoul(temp, NULL, 16); //獲取地址break;}}_error:fclose(fp);return ret; }

效果:

ida會提示elf文件錯誤。

節(jié)表解析錯誤。

附加加密代碼:

#include <stdio.h> #include <cstdint> #include <string.h>typedef uint32_t Elf32_Addr; // Program address typedef uint32_t Elf32_Off; // File offset typedef uint16_t Elf32_Half; typedef uint32_t Elf32_Word; typedef int32_t Elf32_Sword; enum {EI_MAG0 = 0, // File identification index.EI_MAG1 = 1, // File identification index.EI_MAG2 = 2, // File identification index.EI_MAG3 = 3, // File identification index.EI_CLASS = 4, // File class.EI_DATA = 5, // Data encoding.EI_VERSION = 6, // File version.EI_OSABI = 7, // OS/ABI identification.EI_ABIVERSION = 8, // ABI version.EI_PAD = 9, // Start of padding bytes.EI_NIDENT = 16 // Number of bytes in e_ident. }; struct Elf32_Ehdr {unsigned char e_ident[EI_NIDENT]; // ELF Identification bytesElf32_Half e_type; // Type of file (see ET_* below)Elf32_Half e_machine; // Required architecture for this file (see EM_*)Elf32_Word e_version; // Must be equal to 1Elf32_Addr e_entry; // Address to jump to in order to start programElf32_Off e_phoff; // Program header table's file offset, in bytesElf32_Off e_shoff; // Section header table's file offset, in bytesElf32_Word e_flags; // Processor-specific flagsElf32_Half e_ehsize; // Size of ELF header, in bytesElf32_Half e_phentsize; // Size of an entry in the program header tableElf32_Half e_phnum; // Number of entries in the program header tableElf32_Half e_shentsize; // Size of an entry in the section header tableElf32_Half e_shnum; // Number of entries in the section header tableElf32_Half e_shstrndx; // Sect hdr table index of sect name string tableunsigned char getFileClass() const { return e_ident[EI_CLASS]; }unsigned char getDataEncoding() const { return e_ident[EI_DATA]; } };// Program header for ELF32. struct Elf32_Phdr {Elf32_Word p_type; // Type of segmentElf32_Off p_offset; // File offset where segment is located, in bytesElf32_Addr p_vaddr; // Virtual address of beginning of segmentElf32_Addr p_paddr; // Physical address of beginning of segment (OS-specific)Elf32_Word p_filesz; // Num. of bytes in file image of segment (may be zero)Elf32_Word p_memsz; // Num. of bytes in mem image of segment (may be zero)Elf32_Word p_flags; // Segment flagsElf32_Word p_align; // Segment alignment constraint }; // Section header. struct Elf32_Shdr {Elf32_Word sh_name; // Section name (index into string table)Elf32_Word sh_type; // Section type (SHT_*)Elf32_Word sh_flags; // Section flags (SHF_*)Elf32_Addr sh_addr; // Address where section is to be loadedElf32_Off sh_offset; // File offset of section data, in bytesElf32_Word sh_size; // Size of section, in bytesElf32_Word sh_link; // Section type-specific header table index linkElf32_Word sh_info; // Section type-specific extra informationElf32_Word sh_addralign; // Section address alignmentElf32_Word sh_entsize; // Size of records contained within the section };long get_file_size(FILE* pf);int main() {char elf_name[64] = "C:\\Users\Koi\\Desktop\\libnative-lib.so";char want2encrypt_section_name[] = ".mytext";FILE *pf_elf = fopen(elf_name, "rb");long sz_file = get_file_size(pf_elf);char *file_buf = new char[sz_file];fread(file_buf, sz_file, 1, pf_elf);Elf32_Ehdr *ehdr = (Elf32_Ehdr *)(file_buf);//字符串節(jié)頭表的位置Elf32_Shdr *shdrstr = (Elf32_Shdr *)(file_buf + ehdr->e_shoff + sizeof(Elf32_Shdr) * ehdr->e_shstrndx);char *sh_str = (char *)(file_buf + shdrstr->sh_offset); //偏移到字符串表Elf32_Shdr *shdr = (Elf32_Shdr *)(file_buf + ehdr->e_shoff);int encrypt_foffset = 0;int encrypt_size = 0;for (int i=0; i<ehdr->e_shnum; i++, shdr++) {//根據(jù)字符串表的名稱比較if (strcmp(sh_str + shdr->sh_name, want2encrypt_section_name) == 0) {encrypt_foffset = shdr->sh_offset;encrypt_size = shdr->sh_size;break;}}char *content = (char *)(file_buf + encrypt+foffset);int block_size = 16;int nblock = encrypt_size / block_size;int nsize = encrypt_foffset / 4096 + (encrypt_foffset % 4096 == 0 ? 0 : 1);printf("base = 0x%x, length = 0x%x\n", encrypt_foffset, encrypt_size);printf("nblock = %d, nsize = %d\n", nblock, nsize);// 將節(jié)的地址和大小寫入ehdr->e_entry = (encrypt_size << 16) + nsize;ehdr->e_shoff = encrypt_foffset; //節(jié)的地址// 加密for (int i=0; i<encrypt_size; i++) {content[i] = ~content[i];}strcat(elf_name, "_m");FILE *m_elf_file = fopen(elf_name, "wb");fwrite(file_buf, sz_file, 1, m_elf_file);return 0; }long get_file_size(FILE *pf) {long cur_pos = ftell(pf);fseek(pf, 0, SEEK_END);long sz_file = ftell(pf);fseek(pf, cur_pos, SEEK_SET);return sz_file; }

總結(jié)

以上是生活随笔為你收集整理的Android APK的加固方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

亚州国产视频 | 在线日韩精品视频 | 天天干夜夜夜操天 | 99久久99久久精品国产片 | 韩日电影在线观看 | 久久99久久99精品中文字幕 | 久久久亚洲精华液 | 久草在线最新 | 在线观看91 | 日韩成人黄色 | 成人精品久久 | 欧美日韩国产综合网 | 免费在线观看av网址 | 婷婷丁香自拍 | 免费日韩 精品中文字幕视频在线 | 国产xx在线 | 极品美女被弄高潮视频网站 | 日本婷婷色| 中文字幕在线观看不卡 | 黄色小网站免费看 | 亚洲欧洲成人精品av97 | 免费男女羞羞的视频网站中文字幕 | 欧美99热 | 手机av在线不卡 | 91av欧美| 国产一级大片在线观看 | 99久久er热在这里只有精品15 | 国产99久久久精品 | 天天干天天搞天天射 | 一区二区三区视频在线 | 亚洲伊人网在线观看 | 免费av在线播放 | 亚洲伊人成综合网 | 久操视频在线观看 | 欧美日韩久久不卡 | 国产精品久久久久永久免费看 | 久久精品香蕉 | 九九久久成人 | 欧美精品一区在线发布 | 欧美大片在线观看一区 | 亚洲黄色a| 欧美91av| 93久久精品日日躁夜夜躁欧美 | 中文字幕av最新 | 久久伦理电影网 | 天天操天天干天天操天天干 | 久久久综合香蕉尹人综合网 | 999久久国精品免费观看网站 | 欧美日韩成人 | 免费日韩一级片 | 国产精品欧美久久久久久 | av 一区二区三区 | 日韩在线视频精品 | 婷婷色综| 在线免费观看国产黄色 | 丰满少妇对白在线偷拍 | 九九热1| 欧美在线视频免费 | 99热官网 | 午夜神马福利 | 91九色在线观看 | av免费网站 | 激情五月婷婷网 | 久99热 | 中文字幕一区二区三区四区 | 午夜精品一区二区三区在线视频 | 免费观看日韩av | 久久激情日本aⅴ | 美女网站在线看 | 日日干干夜夜 | 欧美日韩有码 | 97视频人人免费看 | 日韩在线观看的 | 国产精品成人久久久 | 国产精品久久久久免费观看 | 黄色av网站在线观看免费 | 97超碰国产精品 | 国产美腿白丝袜足在线av | 久久夜av | 四川妇女搡bbbb搡bbbb搡 | 波多野结衣精品在线 | 久久久99国产精品免费 | 国产精品乱码高清在线看 | 亚洲理论影院 | www.av在线.com | 天天躁天天操 | 亚洲精品乱码久久久久久9色 | 在线观看深夜视频 | 色噜噜狠狠狠狠色综合 | 久福利| 久久综合色综合88 | 日韩毛片在线一区二区毛片 | 在线视频婷婷 | 毛片一区二区 | 成人毛片一区 | 人人狠| 99精品国自产在线 | 黄色国产高清 | av网站免费线看精品 | 久久一二三四 | 手机av观看 | 一区二区三区在线观看中文字幕 | 久久久久久久久久久高潮一区二区 | 高潮毛片无遮挡高清免费 | 亚洲视频精品 | 久久国产电影院 | 啪嗒啪嗒免费观看完整版 | 午夜精品久久久久久久爽 | 毛片网站在线看 | 黄色a一级片 | 精品久久五月天 | 一级片色播影院 | 免费视频你懂的 | 亚洲精品久久视频 | 黄色网www | 99精品小视频| 69av国产| 欧美精品一区二区三区一线天视频 | 日韩在线视频观看免费 | 久久无码av一区二区三区电影网 | 日韩黄色软件 | 亚洲欧美乱综合图片区小说区 | 国产成人精品av在线观 | 婷婷色网视频在线播放 | 丁香六月天婷婷 | 人人澡超碰碰 | 国产成人一级 | 黄色av电影免费观看 | 国产成人av福利 | 九九九毛片 | 成人毛片在线观看 | 久久综合久久久久88 | 狠狠狠狠狠狠狠 | 久久99视频免费观看 | 免费国产亚洲视频 | 天天射天天干天天爽 | 天天色天天色 | 少妇bbbb搡bbbb搡bbbb | 欧美激情第八页 | 欧美激情精品久久久久久 | 青青草国产免费 | 亚洲一级黄色 | 一级黄色片在线 | 欧美日韩色婷婷 | www天天干| 中文字幕日韩有码 | 久久久久夜色 | 91污污| 免费看黄色91| 中文字幕 欧美性 | 国产在线视频在线观看 | www色 | 国产黄色一级片在线 | 免费69视频 | 91人人澡人人爽人人精品 | 在线视频电影 | aaa日本高清在线播放免费观看 | 狠狠干.com | 亚洲狠狠| 深爱激情开心 | 日日综合 | 黄色毛片观看 | 亚洲国产精品va在线 | 国产精品短视频 | 精品在线免费视频 | 在线有码中文字幕 | 天天爽夜夜操 | 日本精品在线看 | 国产精品久久久久久久久久久久冷 | 国产一级免费av | 国产一区二区视频在线播放 | 久久视频在线视频 | 亚洲女在线 | 日韩电影久久久 | 婷婷色网视频在线播放 | www.婷婷com | 亚洲精品乱码久久久久 | 国产午夜剧场 | 91久久国产自产拍夜夜嗨 | 在线最新av | 国产精品密入口果冻 | 国产99久久久久久免费看 | 久草精品视频在线播放 | 亚洲精品资源在线观看 | 日韩欧美aaa | 婷婷综合导航 | 操碰av| 国产天天爽 | 国产特级毛片aaaaaa高清 | 在线成人一区 | 欧美色图亚洲图片 | 日韩伦理片hd | 亚洲国产99 | 免费的国产精品 | 99亚洲精品在线 | 五月天亚洲综合 | 国产精品观看在线亚洲人成网 | 久久99久久99精品中文字幕 | 欧美精品视 | 五月婷婷久久丁香 | 亚洲精品视频在线免费 | 超碰人人草 | 天天色天天干天天色 | 美女视频a美女大全免费下载蜜臀 | 国产成人精品一区二区三区福利 | 日韩二三区 | 超碰av在线播放 | 日韩在线观看一区 | av动图| 久久国内免费视频 | 免费在线观看一级片 | 国产又黄又爽又猛视频日本 | 91av网站在线观看 | 丁香九月婷婷综合 | 伊人久久电影网 | 在线亚洲人成电影网站色www | 丁香六月婷婷综合 | 美女视频网| 国产传媒中文字幕 | 中文字幕亚洲在线观看 | 日韩理论在线视频 | 国产资源中文字幕 | 久久精品毛片基地 | 最近高清中文字幕 | 欧美精品三级在线观看 | 色91在线视频 | 黄色av成人在线 | 蜜臀91丨九色丨蝌蚪老版 | 九九免费精品视频在线观看 | av免费福利| 日本高清免费中文字幕 | 国产亚洲精品久久19p | 成人av电影在线播放 | 国产精品精品久久久 | 久久精品亚洲精品国产欧美 | 亚洲禁18久人片 | 96在线 | 丁香视频五月 | 欧美最猛性xxx | 久久这里只有精品视频首页 | 欧美大片第1页 | 一级黄色a视频 | 婷婷色中文字幕 | 婷婷中文字幕 | 99热这里只有精品1 av中文字幕日韩 | 国产视频一区精品 | 成人av电影免费在线观看 | 天天操天天怕 | 国产精品九九久久99视频 | 精品一区精品二区高清 | zzijzzij亚洲日本少妇熟睡 | v片在线看 | 亚洲精品国偷拍自产在线观看 | 色综合久久精品 | 国产色在线视频 | 欧美午夜精品久久久久久浪潮 | 91中文视频| 欧美精品久久久久久久 | 91久久国产自产拍夜夜嗨 | 国产精品九色 | 性色在线视频 | 亚洲三级影院 | 国产91探花 | 看片网站黄色 | 国产成人精品久久二区二区 | 天天操天天射天天添 | 日韩系列在线 | 在线视频 影院 | 碰超在线观看 | 久久高清免费 | 亚洲精品影院在线观看 | 欧美日韩中文字幕视频 | 日韩精品一区二区三区水蜜桃 | 日韩av电影中文字幕 | 人人dvd| 97色在线观看免费视频 | 中文一区二区三区在线观看 | 在线免费观看一区二区三区 | 国产一线二线三线性视频 | 91精品一区二区三区蜜臀 | 欧美日韩中文视频 | 99re8这里有精品热视频免费 | 天天玩天天干天天操 | 日韩成人邪恶影片 | 9色在线视频 | 成人黄色电影在线观看 | 国产精品免费人成网站 | 日本精品视频在线观看 | 在线一二区 | 97高清免费视频 | 成人在线视频在线观看 | 久久综合在线 | 99久热在线精品 | 国产一级在线看 | 日本精品一区二区在线观看 | 日韩视频免费 | 九九精品视频在线看 | 美女黄频网站 | 精品久久久久久亚洲 | 特级西西444www高清大视频 | 娇妻呻吟一区二区三区 | japanese黑人亚洲人4k | 丝袜精品视频 | 在线成人国产 | 免费网站在线观看成人 | 天天干夜夜操视频 | av黄色亚洲| 欧美一区二区视频97 | 91超碰在线播放 | 国产精品四虎 | 亚洲天天草 | 国产在线播放一区二区三区 | 国产日韩欧美在线一区 | 中文字幕一区二区三区四区视频 | 国产精品久久99综合免费观看尤物 | 天天射天天做 | 在线a亚洲视频播放在线观看 | 免费观看一级成人毛片 | 超碰在线亚洲 | 九九九在线观看 | 超碰97成人| 又黄又爽的免费高潮视频 | 最近最新中文字幕 | 精品免费久久久久久 | 人人爽人人爽人人片av免 | 国产精品一区二区免费在线观看 | 激情视频免费观看 | 亚洲天堂香蕉 | 日日操日日操 | 久久99免费| 日韩激情片在线观看 | 成年人免费在线观看网站 | 日韩在线欧美在线 | 99久久婷婷国产一区二区三区 | 探花视频在线观看免费版 | 久久婷婷丁香 | 亚洲日韩精品欧美一区二区 | 亚洲精品国产第一综合99久久 | 国产99久久久欧美黑人 | 国产一区二区三区四区在线 | 天海翼一区二区三区免费 | 五月黄色 | 国产 日韩 欧美 自拍 | 国产最新视频在线观看 | 成人午夜影院在线观看 | 激情xxxx | 在线精品视频在线观看高清 | 亚洲精品在线免费观看视频 | 亚洲成av人片在线观看香蕉 | 国产精品入口麻豆www | 国产成人免费高清 | 国产精品久久麻豆 | 91 在线视频 | 日韩精品第1页 | 99精品欧美一区二区 | 免费人做人爱www的视 | 九9热这里真品2 | 久久久麻豆视频 | 日韩成人一级大片 | 久久久久久久久综合 | 国产一区二区不卡视频 | 久久久久综合 | 欧美精品一区二区三区四区在线 | 日韩精品电影在线播放 | 国产精品伦一区二区三区视频 | 精品亚洲成a人在线观看 | 91视视频在线直接观看在线看网页在线看 | 一区二区三区免费在线 | 亚洲国产精品小视频 | 日韩综合一区二区三区 | 国产在线v | 在线观看亚洲精品 | 日韩 | 四虎影视精品永久在线观看 | 国产又黄又爽无遮挡 | 日韩精品一区二区三区丰满 | 九九亚洲精品 | a视频在线观看 | 国产成人一区二区精品非洲 | 91色视频 | 亚洲精品色 | 美女国内精品自产拍在线播放 | 激情丁香综合五月 | 2019国产精品| 国产香蕉视频 | 亚洲在线视频免费观看 | 97精品久久人人爽人人爽 | 深爱激情五月综合 | 三级黄色在线 | 精品久久久免费 | 婷婷伊人综合 | 亚洲va欧美va人人爽春色影视 | 亚洲精品视频在线看 | www.91av在线 | 在线观看国产高清视频 | 亚洲免费av片| 国产精品美女免费 | 在线看国产一区 | 久久久精品在线观看 | 久久婷婷精品视频 | 九九日韩 | 色婷婷视频在线观看 | 日本免费久久高清视频 | 国产黄视频在线观看 | 国产97视频| 亚洲欧美激情插 | 国产精品久久久久9999吃药 | 日韩资源在线观看 | 爱色av.com | 国产资源网 | 日韩三级视频在线看 | 精品自拍网 | 瑞典xxxx性hd极品 | 911香蕉视频 | 99精品视频在线观看 | 国产一区二区高清 | 国产精品久久久久国产精品日日 | 黄色片免费在线 | 在线综合 亚洲 欧美在线视频 | 久久久久久久av麻豆果冻 | 色先锋av资源中文字幕 | av一级片网站 | 黄色视屏免费在线观看 | 久久国产精彩视频 | 国产999精品久久久影片官网 | 黄色一区二区在线观看 | 九九在线国产视频 | 亚洲综合网 | 亚洲精品视频在线免费 | 国产人成精品一区二区三 | 精品国产乱码久久久久久浪潮 | 国产精品视频全国免费观看 | 超碰在线人人97 | 一区二区三区日韩视频在线观看 | 免费一级特黄录像 | 久久久久国产精品免费网站 | 在线 国产 亚洲 欧美 | 国产在线视频资源 | 亚洲国产精品99久久久久久久久 | 成人教育av | 91亚洲精品视频 | 91日韩在线 | 日韩精品视频免费在线观看 | 超碰公开在线 | 超碰人人在线 | 成人久久毛片 | 国产美女免费视频 | 我要色综合天天 | 日日草天天干 | 激情五月***国产精品 | 99精品在线免费在线观看 | 色偷偷男人的天堂av | 日韩av视屏在线观看 | 国产精品1区2区3区在线观看 | 99精品视频在线观看视频 | 中文av在线免费观看 | 久久久麻豆精品一区二区 | 精品免费一区 | 91看片淫黄大片在线播放 | 国产黄色美女 | 福利片视频区 | 日韩免费观看视频 | 久久久精品免费看 | 免费在线色电影 | 久久人人97超碰国产公开结果 | 成人a级免费视频 | 伊人黄 | 激情开心| 色综合婷婷 | www.成人久久| 成人h动漫精品一区二 | 国产日韩精品欧美 | 91成人在线视频观看 | 精品亚洲成a人在线观看 | 在线亚洲人成电影网站色www | 中文字幕之中文字幕 | 国产一级做a爱片久久毛片a | 综合成人在线 | 精品国产乱码久久久久久1区二区 | 国产a级片免费观看 | 日韩欧美在线播放 | 狠狠狠狠狠狠狠 | 亚洲美女视频在线观看 | 激情视频久久 | 一区二区在线影院 | 爱爱一区 | 亚洲国产精品999 | 美女网站视频免费黄 | 色婷婷综合久久久久中文字幕1 | 免费观看一区二区三区视频 | 天堂av在线网址 | 九九视频在线 | 91麻豆传媒 | 天天操,夜夜操 | 国产精品va在线观看入 | 美女国内精品自产拍在线播放 | 十八岁以下禁止观看的1000个网站 | 国产精品久久久久久久久久久久久久 | 天堂av色婷婷一区二区三区 | 久久精品成人 | 国产 中文 日韩 欧美 | 久久美女精品 | 又长又大又黑又粗欧美 | 久爱综合 | 一级黄色网址 | 久久美女精品 | 国产高清中文字幕 | 日韩理论视频 | 欧美亚洲久久 | 激情婷婷 | 97视频人人免费看 | 91资源在线播放 | 99精品久久久久久久久久综合 | 婷婷综合五月天 | 免费成人在线观看 | 国产h在线播放 | 一级黄色片在线免费观看 | 国产精品一区二区在线看 | 久久久天堂 | 激情伊人五月天久久综合 | 日韩乱码在线 | 欧美精品久久久久久久亚洲调教 | 波多野结衣在线中文字幕 | 久久久久久久网 | 日本女人的性生活视频 | 在线日本v二区不卡 | 国产在线色 | 99精品国自产在线 | 久久成人亚洲欧美电影 | 在线观影网站 | 国产黄色免费电影 | 久久不卡免费视频 | 久久综合中文色婷婷 | 日本成人黄色片 | a天堂最新版中文在线地址 久久99久久精品国产 | 国产品久精国精产拍 | 久久久免费视频播放 | 日韩欧美xxx| 国产精品毛片一区二区 | 在线免费观看黄网站 | 青青河边草免费视频 | 91精品推荐| 久久在线免费视频 | 久久国产女人 | 日韩乱码中文字幕 | 蜜臀av性久久久久蜜臀av | 日本中文字幕在线电影 | 欧洲亚洲国产视频 | 亚洲欧洲国产日韩精品 | 欧美99热 | 国产精品乱码一区二三区 | 色午夜 | 西西www4444大胆在线 | 国产精品乱码在线 | 97视频在线免费观看 | 91在线视频观看 | 日韩电影中文,亚洲精品乱码 | 97成人在线免费视频 | 黄色av一区二区三区 | 亚洲美女视频在线 | 91精品婷婷国产综合久久蝌蚪 | 天天色天天骑天天射 | japanese黑人亚洲人4k | japanesefreesex中国少妇 | 开心激情网五月天 | 久久免费av| 最近中文字幕高清字幕免费mv | 久久精精品视频 | 久久成年人网站 | 国产福利一区二区三区视频 | 99在线观看视频网站 | 97av超碰 | 免费精品视频 | 最新中文字幕 | 精品久久久网 | 亚洲男人天堂2018 | av天天色 | 日韩mv欧美mv国产精品 | 在线观看视频你懂的 | 久草视频在线播放 | 69久久99精品久久久久婷婷 | 久久精品一区二区三区四区 | 亚州av网站| 999久久国精品免费观看网站 | 国产在线2020 | 欧美一级电影片 | 国产成人99av超碰超爽 | 成人羞羞免费 | 在线播放一区 | 久久黄色美女 | 人人爽人人看 | 91看片淫黄大片在线播放 | 91男人影院 | 免费看污在线观看 | 亚色视频在线观看 | 亚洲精品午夜久久久久久久 | 99热国产在线观看 | 亚洲国产日韩一区 | 日韩一区正在播放 | 六月激情婷婷 | 天天插日日插 | 精品av在线播放 | 欧美一级日韩三级 | 久久精品这里精品 | 久精品在线| 亚洲精品在线播放视频 | 久草在线免 | 一区在线观看 | 丁香在线 | 国产精品一区欧美 | 波多野结衣一区三区 | 亚洲一级国产 | 最新国产精品拍自在线播放 | 亚洲精品在线观看中文字幕 | 91视视频在线直接观看在线看网页在线看 | 中文字幕电影网 | 超级碰碰碰碰 | 啪啪免费试看 | 国产91精品一区二区麻豆亚洲 | 国产明星视频三级a三级点| www.亚洲视频.com | 亚洲精品99久久久久中文字幕 | 狠狠干成人综合网 | 日韩网站在线 | 久草在线视频在线观看 | 中文字幕网站 | 欧美va天堂va视频va在线 | 免费福利在线视频 | 99在线观看精品 | 久久九九久久精品 | 久草在线免费资源 | 丰满少妇高潮在线观看 | 久久精品中文字幕少妇 | 成人一级视频在线观看 | 国产精品中文字幕在线播放 | 日日夜夜天天干 | 成人a级网站 | 999视频网| 日本久久中文 | 午夜av色 | 久久免费电影网 | 成人免费在线观看电影 | 国产大陆亚洲精品国产 | 999成人精品| 国产91aaa| 在线网站黄 | 中文字幕在线免费观看视频 | 国产婷婷视频在线 | 亚洲成成品网站 | 欧美性网站 | 免费一级日韩欧美性大片 | 三级视频国产 | 福利一区在线 | 亚洲精品美女 | 国产中文字幕在线免费观看 | 国产免费午夜 | 一区二区三区免费在线 | 成人小视频在线免费观看 | 中文在线字幕免费观 | 我要看黄色一级片 | 久久国产福利 | 成人黄色免费在线观看 | 日韩在线观看你懂得 | 日韩| 亚州国产精品久久久 | 在线观看黄a | 日韩有码在线观看视频 | 色网站国产精品 | 91人人澡人人爽人人精品 | 亚洲永久精品一区 | 免费av片在线 | 在线看v片成人 | 久久9999久久免费精品国产 | 九九视频免费在线观看 | 五月婷婷六月丁香在线观看 | 香蕉视频日本 | 亚洲成a人片在线www | 国内精品久久影院 | 日本高清免费中文字幕 | 欧美日韩免费一区二区三区 | 日韩精品久久久久久久电影99爱 | 1000部国产精品成人观看 | 国产群p视频 | 99这里都是精品 | 久久人人97超碰国产公开结果 | 亚洲一区二区三区毛片 | av在线网站免费观看 | 久久久久久久久久免费 | 亚洲狠狠婷婷综合久久久 | 国产又粗又猛又黄视频 | 91热爆在线观看 | 国产精品免费观看国产网曝瓜 | www.日日日.com | 日韩理论片在线 | 成人在线视频论坛 | 91成人免费视频 | 欧美无极色 | 国产一区二区久久久久 | 国产黄视频在线观看 | 综合久久精品 | 久久国产精品99精国产 | 中文字幕中文字幕在线中文字幕三区 | 蜜臀久久99精品久久久无需会员 | 久久精品第一页 | 欧美日韩视频一区二区三区 | 久久视频一区二区 | 国产成人高清 | 欧美日韩一区二区在线 | 中文字幕av播放 | 91干干干 | 久久99久久99精品免观看软件 | 最近日本韩国中文字幕 | 99在线精品视频 | 亚洲精品乱码久久久久久按摩 | 亚洲精品国久久99热 | 69国产精品成人在线播放 | 在线影院 国内精品 | 日本不卡一区二区 | 处女av在线 | a特级毛片 | 96av在线 | 国产精品久久久久久久久久ktv | 99精品视频观看 | 精品国产一区二区三区四 | 日韩欧美电影 | 国产第一页在线观看 | 六月婷色| 九九热免费视频在线观看 | 国产美女网站在线观看 | 韩国av三级 | 99视 | 国产亚洲免费观看 | 在线小视频你懂的 | 操操操综合 | 麻豆免费在线播放 | 亚洲午夜精品一区二区三区电影院 | 久久中文字幕在线视频 | 色综合天天综合 | 一区二区欧美激情 | 成人理论电影 | 亚洲精品福利在线 | 国产精品欧美一区二区 | 久久国产热视频 | 国产高清免费av | 狠狠干夜夜操 | 久久精品99国产精品 | 欧美日韩中文字幕视频 | 中文亚洲欧美日韩 | 免费在线观看亚洲视频 | 成人在线免费视频观看 | 国产精品美女久久久久久免费 | 天天色综合天天 | 婷婷久月 | 91精品视频免费看 | 国产91勾搭技师精品 | 日韩大片在线免费观看 | 久久观看免费视频 | 色国产精品一区在线观看 | 91 中文字幕 | 久久久综合色 | 手机在线中文字幕 | av免费看av | 日韩激情视频 | 精品嫩模福利一区二区蜜臀 | 中文字幕在线播出 | 国产 中文 日韩 欧美 | 免费毛片一区二区三区久久久 | 久久综合狠狠综合 | 综合国产在线 | 国产亚洲精品中文字幕 | 日韩av手机在线看 | 日韩中文字幕视频在线 | 免费网站黄色 | 国产一区免费在线观看 | 四虎永久免费在线观看 | 国产精品美女久久久久久久网站 | 精品免费一区二区三区 | 视频一区二区视频 | 日韩欧美视频一区二区三区 | 日韩av一区二区三区在线观看 | 超碰成人免费电影 | av资源免费在线观看 | 高清不卡免费视频 | www.五月天婷婷 | av色综合网| 国产精品高清免费在线观看 | 国产在线不卡一区 | 国产精品第54页 | 天天艹天天操 | 免费看v片网站 | 色黄www小说 | 色瓜| 色狠狠操 | 五月情婷婷 | 国产96在线观看 | 97超视频在线观看 | 伊人色综合久久天天 | 婷婷伊人综合亚洲综合网 | 日韩在观看线 | 久久深夜 | 国产资源免费在线观看 | 久草在线免费在线观看 | 日韩av不卡在线观看 | 久久激情视频免费观看 | 超碰在线官网 | 不卡av免费在线观看 | a√天堂中文在线 | 韩国视频一区二区三区 | 99久久激情视频 | 狠狠躁日日躁狂躁夜夜躁av | 中文字幕在线播放一区二区 | 国产九九精品视频 | 久久久久影视 | 久久久黄色免费网站 | 97精品国产一二三产区 | 在线观看视频97 | 九九热中文字幕 | 九九视频免费在线观看 | 91香蕉视频在线 | 国产精品毛片 | 涩五月婷婷 | 亚洲精品免费在线观看视频 | 日韩欧美在线免费 | 综合色天天 | 一区二区三区免费在线观看 | 五月婷婷一区 | 人人操日日干 | 九九免费在线观看 | 日韩高清av| 在线国产99 | 国产理伦在线 | 97国产精品 | 毛片99| 黄色精品视频 | 色无五月 | 免费日韩一区二区三区 | 亚洲91精品在线观看 | 久久国语 | 亚洲美女视频在线 | 久久经典国产视频 | 最近2019年日本中文免费字幕 | 日韩高清精品免费观看 | 黄色大片av | 99精品美女 | 精品国产成人av在线免 | 97成人在线视频 | 看国产黄色大片 | av成人免费在线观看 | 国产精品v欧美精品 | 黄色亚洲大片免费在线观看 | 在线观看成人一级片 | 在线观看黄 | 亚洲精品乱码久久久久久写真 | 国产一级黄色免费看 | 久久成人国产精品一区二区 | 久久手机免费观看 | 欧产日产国产69 | 国产精品久久久久久久久久新婚 | 亚洲视频 在线观看 | 久久久久免费精品国产小说色大师 | 中文字幕视频网站 | 国产黄色成人 | 日韩一级成人av | 久久91久久久久麻豆精品 | 免费av观看| 久久人91精品久久久久久不卡 | 成年人天堂com | 全黄网站| 中文字幕在线视频一区 | 国产精品v欧美精品v日韩 | 成人a视频在线观看 | 天天综合网天天综合色 | 亚洲v精品| 在线观看日韩av | 久久免费视频国产 | 久久免费视频这里只有精品 | 波多野结衣在线观看一区 | 国产最新福利 | 久久久久激情 | 97免费公开视频 | 黄色大片日本 | 在线视频免费观看 | 成人高清在线观看 | 国产91在线观 | 91精品成人久久 | 久久香蕉国产 | www.91成人| 久视频在线 | 欧洲高潮三级做爰 | 中文字幕在线看视频国产 | 欧美在线观看视频免费 | 国产91精品看黄网站在线观看动漫 | 天天天综合网 | 国精产品999国精产品岳 | 91精品资源 | 成 人 黄 色视频免费播放 | 毛片网站在线看 | 国产精品国产精品 | 亚洲va天堂va欧美ⅴa在线 | 在线观看你懂的网址 | 一区二区三区中文字幕在线 | 欧美二区三区91 | 久久久男人的天堂 | 四虎成人精品在永久免费 | 91黄色视屏| 91视频高清 | 天天狠狠 | 在线观看免费福利 | 2000xxx影视 | 国产夫妻性生活自拍 | 日韩.com | 欧美特一级 | 狠狠色狠狠色综合系列 | 欧美日韩在线免费观看视频 | 日韩视频免费 | 免费在线观看av网站 | 亚洲最大成人免费网站 | 国产人成精品一区二区三 | 久久精品站 | 天天干天天操 | 97超碰在线久草超碰在线观看 | 91精品国产91久久久久久三级 | 国产精品短视频 | www黄色| 九草在线观看 | 69视频在线播放 | 成人蜜桃视频 | 亚洲va欧美va人人爽春色影视 | 久久久久久久久久久高潮一区二区 | 久草久视频 | 精品一二三区视频 | 午夜婷婷网 | 亚洲精品视频免费在线观看 | 韩日视频在线 | 精选久久 | 久久黄色美女 | 成人国产一区二区 | 视频一区二区免费 | 久久激情五月婷婷 | 国产精品久久久影视 | 又黄又爽又刺激的视频 | 激情综合婷婷 | 国语黄色片 | 日日摸日日添夜夜爽97 | 超碰在线观看99 | 日韩精品一区二区在线观看视频 | 色婷婷骚婷婷 | 999成人免费视频 | 天天插天天操天天干 | 婷婷国产视频 | 亚洲理论片在线观看 | 808电影免费观看三年 | 天天干天天干天天射 | 91精品国产成| 久久激情五月激情 | 日本久久99| 狠狠天天 | 日日干天天插 | 国内精品久久久久久久97牛牛 | 久草av在线播放 | 五月综合在线观看 | 在线观看视频中文字幕 | 日本最新高清不卡中文字幕 | 免费麻豆网站 | 国产精品久久艹 | 亚洲欧美视频 | 久久人人添人人爽添人人88v | 国产 字幕 制服 中文 在线 | 国产乱视频| 综合网天天射 | 亚洲精品久久久久久国 | 欧美色道| 日本色小说视频 | 日韩色爱 | 欧美一区成人 | 中文字幕在线观看第三页 | 久久综合视频网 | 黄色一级大片免费看 | 久久久国产精华液 | 久草免费看 | 欧美日韩国产色综合一二三四 | 蜜臀久久99精品久久久无需会员 | 久久综合导航 | 99久久精品免费看国产麻豆 | 日日夜夜天天久久 | 丁香六月久久综合狠狠色 | 在线看成人av| 亚洲国产综合在线 | 99久久婷婷国产综合亚洲 | 91视频 - x99av | 成人国产网站 | 九色视频网站 | 婷婷久久综合网 | 正在播放国产精品 | www黄免费 | 国产999精品久久久久久绿帽 | 成人在线免费视频观看 | 婷婷六月天天 |