DBMNG数据库管理与应用

书籍是全世界的营养品。生活里没有书籍,就好像没有阳光;智慧里没有书籍,就好像鸟儿没有翅膀。
当前位置:首页 > 移动应用 > Android

Android加壳本地native实现

本例仅在Android2.3虚拟机跑通过,如果要适配其他机型,请自行研究,这里只是抛砖引玉。

    0x00

    在Android中的Apk的加固(加壳)原理解析和实现,一文中脱壳代码都写在了java层很容易被识别出来,很多需求需要把脱壳的程序转移到native层,其实转移的思路也很简单,就是在native层通过JNI调用Java层代码。


    0x01

  1.     public class ProxyApplication extends Application {  
  2.       
  3.     @Override  
  4.     protected void attachBaseContext(Context base) {  
  5.         super.attachBaseContext(base);  
  6.         DexLoader.load("com.jltxgcy.dynamicdex");  
  7.     }  
  8.   
  9.   
  10.     @Override  
  11.     public void onCreate() {  
  12.         DexLoader.run();  
  13.     }  
  14. }  
    还记得原来这两个方法有着一大堆代码,这里仅仅有一行代码就搞定。


    我们再看来DexLoader类。


  1. public class DexLoader {  
  2.     static {  
  3.         System.loadLibrary("dexloader");  
  4.     }  
  5.   
  6.     public static native void load(String path);  
  7.   
  8.     public static native void run();  
  9. }  


    原来核心脱壳代码放在了native层。

    

    0x02

    JNI的实现如下,大家可以看到本质上就是把java层的代码通过JNI转移到native层了。


  1. static void loadApk(JNIEnv * env, jclass clazz, jstring package) {  
  2.     jclass activityThreadClazz;  
  3.     jmethodID currentActivityThreadMethodID;  
  4.     jobject activityThreadObject;  
  5.     const char *packageName;  
  6.     const char *className;  
  7.     const char *methodName;  
  8.     int codeoff;  
  9.   
  10.     jfieldID mPackagesFieldID;  
  11.     jobject mPackagesJObject;  
  12.     jclass mPackagesClazz;  
  13.     jmethodID getMethodID;  
  14.   
  15.     jobject weakReferenceJObject;  
  16.     jclass weakReferenceJClazz;  
  17.     jmethodID getweakMethodID;  
  18.   
  19.     jobject loadedApkJObject;  
  20.     jclass loadedApkJClazz;  
  21.     jfieldID mClassLoaderFieldID;  
  22.     jobject mClassLoaderJObject;  
  23.     jstring dexPath;  
  24.     jstring dexOptPath;  
  25.   
  26.     jclass dexClassLoaderClazz;  
  27.     jmethodID initDexLoaderMethod;  
  28.     jobject dexClassLoaderJObject;  
  29.   
  30.     activityThreadClazz = env->FindClass("android/app/ActivityThread");  
  31.     currentActivityThreadMethodID = env->GetStaticMethodID(activityThreadClazz, "currentActivityThread",  
  32.             "()Landroid/app/ActivityThread;");  
  33.     activityThreadObject = env->CallStaticObjectMethod(activityThreadClazz, currentActivityThreadMethodID);  
  34.     packageName = env->GetStringUTFChars(package, JNI_FALSE);  
  35.     mPackagesFieldID = env->GetFieldID(activityThreadClazz, "mPackages""Ljava/util/HashMap;");  
  36.     mPackagesJObject = env->GetObjectField(activityThreadObject, mPackagesFieldID);  
  37.     mPackagesClazz = env->GetObjectClass(mPackagesJObject);  
  38.     getMethodID = env->GetMethodID(mPackagesClazz, "get",  
  39.             "(Ljava/lang/Object;)Ljava/lang/Object;");  
  40.     weakReferenceJObject = env->CallObjectMethod(mPackagesJObject, getMethodID, package);  
  41.     weakReferenceJClazz = env->GetObjectClass(weakReferenceJObject);  
  42.     getweakMethodID = env->GetMethodID(weakReferenceJClazz, "get",  
  43.             "()Ljava/lang/Object;");  
  44.     loadedApkJObject = env->CallObjectMethod(weakReferenceJObject, getweakMethodID);  
  45.     loadedApkJClazz = env->GetObjectClass(loadedApkJObject);  
  46.     mClassLoaderFieldID = env->GetFieldID(loadedApkJClazz, "mClassLoader""Ljava/lang/ClassLoader;");  
  47.     mClassLoaderJObject = env->GetObjectField(loadedApkJObject, mClassLoaderFieldID);  
  48.     dexPath = env->NewStringUTF("/sdcard/payload_odex/ForceApkObj.apk");  
  49.     dexOptPath = env->NewStringUTF("/sdcard/payload_odex/");  
  50.     dexClassLoaderClazz = env->FindClass("dalvik/system/DexClassLoader");  
  51.     initDexLoaderMethod = env->GetMethodID(dexClassLoaderClazz, "<init>","(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)V");  
  52.     dexClassLoaderJObject = env->NewObject(dexClassLoaderClazz,initDexLoaderMethod, dexPath, dexOptPath, NULL, mClassLoaderJObject);  
  53.     env->SetObjectField(loadedApkJObject, mClassLoaderFieldID, dexClassLoaderJObject);  
  54.     ALOGD("packageName:%s", packageName);  
  55. }  
  56.   
  57. static void run(JNIEnv * env, jclass clazz) {  
  58.     jclass activityThreadClazz;  
  59.     jmethodID currentActivityThreadMethodID;  
  60.     jobject activityThreadObject;  
  61.   
  62.     jfieldID mBoundApplicationFieldID;  
  63.     jobject mBoundApplicationJObject;  
  64.     jclass mBoundApplicationClazz;  
  65.     jfieldID mInfoFieldID;  
  66.     jobject mInfoJObject;  
  67.     jclass mInfoClazz;  
  68.   
  69.     jfieldID mApplicationFieldID;  
  70.     jobject mApplicationJObject;  
  71.   
  72.     jfieldID mInitialApplicationFieldID;  
  73.     jobject mInitialApplicationJObject;  
  74.   
  75.     jfieldID mAllApplicationsFieldID;  
  76.     jobject mAllApplicationsJObject;  
  77.     jclass mAllApplicationsClazz;  
  78.     jmethodID removeMethodID;  
  79.   
  80.     jfieldID mApplicationInfoFieldID;  
  81.     jobject mApplicationInfoJObject;  
  82.     jclass mApplicationInfoClazz;  
  83.   
  84.     jfieldID mBindApplicationInfoFieldID;  
  85.     jobject mBindApplicationInfoJObject;  
  86.     jclass mBindApplicationInfoClazz;  
  87.   
  88.     jfieldID classNameFieldID;  
  89.     jfieldID mBindClassNameFieldID;  
  90.     jstring applicationName;  
  91.   
  92.     jmethodID makeApplicationMethodID;  
  93.     jobject ApplicationJObject;  
  94.     jclass ApplicationClazz;  
  95.     jmethodID onCreateMethodID;  
  96.   
  97.     activityThreadClazz = env->FindClass("android/app/ActivityThread");  
  98.     currentActivityThreadMethodID = env->GetStaticMethodID(activityThreadClazz, "currentActivityThread",  
  99.                 "()Landroid/app/ActivityThread;");  
  100.     activityThreadObject = env->CallStaticObjectMethod(activityThreadClazz, currentActivityThreadMethodID);  
  101.     mBoundApplicationFieldID = env->GetFieldID(activityThreadClazz, "mBoundApplication""Landroid/app/ActivityThread$AppBindData;");  
  102.     mBoundApplicationJObject = env->GetObjectField(activityThreadObject, mBoundApplicationFieldID);  
  103.     mBoundApplicationClazz = env->GetObjectClass(mBoundApplicationJObject);  
  104.     mInfoFieldID = env->GetFieldID(mBoundApplicationClazz, "info""Landroid/app/LoadedApk;");  
  105.     mInfoJObject = env->GetObjectField(mBoundApplicationJObject, mInfoFieldID);  
  106.     mInfoClazz = env->GetObjectClass(mInfoJObject);  
  107.     mApplicationFieldID = env->GetFieldID(mInfoClazz, "mApplication""Landroid/app/Application;");  
  108.     mApplicationJObject = env->GetObjectField(mInfoJObject, mApplicationFieldID);  
  109.     env->SetObjectField(mInfoJObject, mApplicationFieldID, NULL);  
  110.     mInitialApplicationFieldID = env->GetFieldID(activityThreadClazz, "mInitialApplication""Landroid/app/Application;");  
  111.     mInitialApplicationJObject = env->GetObjectField(activityThreadObject, mInitialApplicationFieldID);  
  112.     mAllApplicationsFieldID = env->GetFieldID(activityThreadClazz, "mAllApplications""Ljava/util/ArrayList;");  
  113.     mAllApplicationsJObject = env->GetObjectField(activityThreadObject, mAllApplicationsFieldID);  
  114.     mAllApplicationsClazz = env->GetObjectClass(mAllApplicationsJObject);  
  115.     removeMethodID = env->GetMethodID(mAllApplicationsClazz, "remove",  
  116.             "(Ljava/lang/Object;)Z");  
  117.     jboolean isTrue = env->CallBooleanMethod(mAllApplicationsJObject, removeMethodID, mInitialApplicationJObject);  
  118.     mApplicationInfoFieldID = env->GetFieldID(mInfoClazz, "mApplicationInfo""Landroid/content/pm/ApplicationInfo;");  
  119.     mApplicationInfoJObject = env->GetObjectField(mInfoJObject, mApplicationInfoFieldID);  
  120.     mApplicationInfoClazz = env->GetObjectClass(mApplicationInfoJObject);  
  121.     mBindApplicationInfoFieldID = env->GetFieldID(mBoundApplicationClazz, "appInfo""Landroid/content/pm/ApplicationInfo;");  
  122.     mBindApplicationInfoJObject = env->GetObjectField(mBoundApplicationJObject, mBindApplicationInfoFieldID);  
  123.     mBindApplicationInfoClazz = env->GetObjectClass(mBindApplicationInfoJObject);  
  124.     classNameFieldID = env->GetFieldID(mApplicationInfoClazz, "className""Ljava/lang/String;");  
  125.     mBindClassNameFieldID = env->GetFieldID(mBindApplicationInfoClazz, "className""Ljava/lang/String;");  
  126.     applicationName = env->NewStringUTF("com.example.forceapkobj.MyApplication");  
  127.     env->SetObjectField(mApplicationInfoJObject, classNameFieldID, applicationName);  
  128.     env->SetObjectField(mBindApplicationInfoJObject, mBindClassNameFieldID, applicationName);  
  129.     makeApplicationMethodID = env->GetMethodID(mInfoClazz, "makeApplication","(ZLandroid/app/Instrumentation;)Landroid/app/Application;");  
  130.     ApplicationJObject = env->CallObjectMethod(mInfoJObject, makeApplicationMethodID, JNI_FALSE, NULL);  
  131.     env->SetObjectField(activityThreadObject, mInitialApplicationFieldID, ApplicationJObject);  
  132.     ApplicationClazz = env->GetObjectClass(ApplicationJObject);  
  133.     onCreateMethodID = env->GetMethodID(ApplicationClazz, "onCreate","()V");  
  134.     env->CallVoidMethod(ApplicationJObject, onCreateMethodID);  
  135. }  
  136.   
  137. JNIEXPORT void JNICALL Java_com_jltxgcy_dynamicdex_DexLoader_load  
  138.   (JNIEnv * env, jclass clazz, jstring packageName) {  
  139.     loadApk(env, clazz, packageName);  
  140.     ALOGD("Java_com_jltxgcy_dynamicdex_DexLoader_load");  
  141. }  
  142.   
  143. JNIEXPORT void JNICALL Java_com_jltxgcy_dynamicdex_DexLoader_run  
  144.   (JNIEnv * env, jclass clazz) {  
  145.     run(env, clazz);  
  146.     ALOGD("Java_com_jltxgcy_dynamicdex_DexLoader_run");  
  147. }  
本站文章内容,部分来自于互联网,若侵犯了您的权益,请致邮件chuanghui423#sohu.com(请将#换为@)联系,我们会尽快核实后删除。
Copyright © 2006-2023 DBMNG.COM All Rights Reserved. Powered by DEVSOARTECH            豫ICP备11002312号-2

豫公网安备 41010502002439号