
يُستخدم dex-vm لحماية ملف classes.dex في أندرويد
يعتمد على dex-vm لتشغيل بايت كود dalvik وبالتالي حماية dex وزيادة صعوبة فك الترجمة العكسية. ينقسم المشروع إلى جزأين: nmm-protect وهو مشروع Java خالص، يقوم بتحويل dex، وتحويل البيانات الموجودة في dex إلى بنى C، وتوليد مشروع ndk بعشوائية opcode، وبعد الترجمة يُنتج apk مُحصَّنًا. أما nmmvm فهو مشروع أندرويد، يتضمن تنفيذ dex-vm واختبارات مختلف تعليمات dalvik وغيرها.
بدون تجميع nmm-protect، يمكنك مباشرة الاطلاع على استخدامه لتوليد المشروع وملف APK النهائي، مثال على معالجة APK.
تم اختبار المثال في بيئة Linux، ويُفترض أن Windows سيعمل أيضًا بدون مشاكل، قم أولًا بتثبيت JDK وandroid sdk وndk.
قم بتنزيل vm-protect.jar، واضبط متغيرات البيئة ANDROID_SDK_HOME وANDROID_NDK_HOME:
export ANDROID_SDK_HOME=/opt/android-sdk
export ANDROID_NDK_HOME=/opt/android-sdk/ndk/22.1.7171670
export CMAKE_PATH=/opt/android-sdk/cmake/3.18.1/ #可选,不配置的话直接使用/bin/cmake
java -jar vm-protect-xxx.jar apk input.apk convertRules.txt mapping.txt
بعد اكتمال التنفيذ، سيتم إنشاء دليل build في الدليل الذي يوجد فيه input.apk، ويحتوي على ملف apk الناتج النهائي (build/input-protect.apk)، ومشروع C الكامل dex2c (المبني على cmake)، وملفات .dex وغيرها التي تم إنشاؤها أثناء المعالجة.
بعد التشغيل الأول، سيتم إنشاء دليل tools في موقع jar، ويحتوي على config.json الذي يمكن تحريره لتكوين مسارات Android SDK وNDK ذات الصلة.
قام أحد الأصدقاء بكتابة واجهة رسومية GUI لتسهيل الاستخدام، يمكن لمن يحتاجها تجربتها، https://github.com/TimScriptov/nmmp
يجب محاذاة ملف apk الناتج باستخدام zipalign (الإصدارات الجديدة تستخدم zipflinger لمعالجة apk، لذا يمكن الاستغناء عن استخدام zipalign المنفصل) وتوقيعه باستخدام apksigner قبل أن يمكن تثبيته واستخدامه
apksigner sign --ks ~/.myapp.jks build/input-protect-align.apk
java -jar vm-protect-xxx.jar aab test.aab convertRules.txt
بعد ذلك يلزم التوقيع باستخدام jarsigner، ويمكن أيضًا دمج signflinger لإجراء التوقيع
jarsigner -keystore ~/.myapp.jks -storepass pass -keypass pass test-protect.aab keyAlias
java -jar vm-protect-xxx.jar aar testModule.aar convertRules.txt
git clone https://github.com/maoabc/nmmp.git
cd nmmp/nmm-protect
./gradlew arsc:build
./gradlew build
بعد النجاح، سيتم إنشاء fatjar قابل للتنفيذ مباشرة في build/libs.
في حال عدم وجود ملف قواعد التحويل، سيتم تحويل الطرق في جميع الفئات داخل dex (باستثناء طرق البناء وطرق التهيئة الثابتة). تدعم القواعد بعض الحالات البسيطة فقط:
//支持的规则比较简单,*只是被转成正则表达式的.*,支持一些简单的继承关系
class * extends android.app.Activity
class * implements java.io.Serializable
class my.package.AClass
class my.package.* { *; }
class * extends java.util.ArrayList {
if*;
}
class A {
}
class B extends A {
}
class C extends B {
}
//比如'class * extends A' 只会匹配B而不会再匹配C
nmmvm هو التنفيذ الفعلي لآلة dex الافتراضية، وله نقطة دخول واحدة فقط:
jvalue vmInterpret(
JNIEnv *env,
const vmCode *code,
const vmResolver *dvmResolver
);
typedef struct {
const u2 *insns; //指令
const u4 insnsSize; //指令大小
regptr_t *regs; //寄存器
u1 *reg_flags; //寄存器数据类型标记,主要标记是否为对象
const u1 *triesHandlers; //异常表
} vmCode;
typedef struct {
const vmField *(*dvmResolveField)(JNIEnv *env, u4 idx, bool isStatic);
const vmMethod *(*dvmResolveMethod)(JNIEnv *env, u4 idx, bool isStatic);
//从类型常量池取得类型名
const char *(*dvmResolveTypeUtf)(JNIEnv *env, u4 idx);
//直接返回jclass对象,本地引用需要释放引用
jclass (*dvmResolveClass)(JNIEnv *env, u4 idx);
//根据类型名得到class
jclass (*dvmFindClass)(JNIEnv *env, const char *type);
//const_string指令加载的字符串对象
jstring (*dvmConstantString)(JNIEnv *env, u4 idx);
} vmResolver;
يوفر vmCode التعليمات المطلوبة للتنفيذ وجدول الاستثناءات ومساحة السجلات، بينما يحتوي vmResolver على مجموعة من مؤشرات الدوال التي توفر الرموز وقت التشغيل، مثل field وmethod وغيرها. ومن خلال تخصيص هذين المعاملين يمكن تحقيق أساليب تحصين مختلفة، فعلى سبيل المثال يحتوي test.cpp في المشروع على vmResolver بسيط مبني على libdex، يُستخدم أساسًا للتطوير والاختبار. أما nmm-protect فيقوم بتحويل بيانات .dex ذات الصلة إلى بنى C، ويتضمن أيضًا عشوائية opcode وغيرها، وهو قابل للاستخدام العملي بشكل أساسي.
تم حاليًا تنفيذ التحصين المتعلق بالوحدات، والاستخدام مشابه لتحصين apk، وإذا واجهت أي مشكلة يمكنك فتح issue.
يُصدر nmm-protect بموجب ترخيص gpl، nmm-protect licence، ويُصدر جزء dex-vm بموجب ترخيص Apache، nmmvm licence. يتم حزم جزء vm فقط داخل apk، وnmm-protect يقوم فقط بتحويل dex، ولا يؤثر الترخيص على النتائج المُنشأة.