
Android की classes.dex फ़ाइल की सुरक्षा के लिए उपयोग किया जाने वाला dex-vm
Dex-VM के आधार पर डाल्विक बाइटकोड चलाकर dex की सुरक्षा करना और डीकंपाइल करने की कठिनाई बढ़ाना। प्रोजेक्ट दो भागों में विभाजित है: nmm-protect एक शुद्ध Java प्रोजेक्ट है, जो dex को रूपांतरित करता है, dex में मौजूद डेटा को C स्ट्रक्चर में बदलता है, opcode को रैंडमाइज़ करके NDK प्रोजेक्ट जनरेट करता है, और कंपाइल करने के बाद सुरक्षित किया गया apk उत्पन्न करता है। nmmvm एक Android प्रोजेक्ट है, जिसमें dex-vm का कार्यान्वयन और विभिन्न डाल्विक निर्देशों के परीक्षण आदि शामिल हैं।
nmm-protect को कंपाइल न करें, आप सीधे इसका उपयोग करके प्रोजेक्ट और अंतिम apk बनाने का उदाहरण देख सकते हैं, apk प्रोसेसिंग का एक उदाहरण।
उदाहरण लिनक्स वातावरण में परीक्षण किया गया है, विंडोज़ पर भी समस्या नहीं होनी चाहिए, पहले 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
निष्पादन पूरा होने पर input.apk की निर्देशिका में एक build निर्देशिका उत्पन्न होगी, जिसमें अंतिम रूप से आउटपुट किया गया apk (build/input-protect.apk), पूर्ण c प्रोजेक्ट dex2c (cmake पर आधारित) तथा प्रसंस्करण के दौरान उत्पन्न .dex आदि शामिल होंगे।
पहली बार चलाने के बाद jar के स्थान पर tools निर्देशिका उत्पन्न होगी, जिसमें config.json है जिसे संपादित करके आप एंड्रॉइड sdk, ndk से संबंधित पथ कॉन्फ़िगर कर सकते हैं।
एक मित्र ने GUI इंटरफ़ेस बनाया है, जिससे उपयोग करना अधिक सुविधाजनक हो जाता है। जिन्हें आवश्यकता हो, वे इसे आज़मा सकते हैं, https://github.com/TimScriptov/nmmp
उत्पन्न apk को इंस्टॉल और उपयोग करने के लिए zipalign से संरेखित (नए संस्करण में apk को संभालने के लिए zipflinger का उपयोग किया गया है, अलग से 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
成功后会在build/libs生成可直接执行的fatjar।
无转换规则文件,则会转换dex里所有class里的方法(除了构造方法和静态初始化方法)。规则只支持一些简单的情况:
//支持的规则比较简单,*只是被转成正则表达式的.*,支持一些简单的继承关系
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 में libdex पर आधारित एक सरल vmResolver है, जिसका उपयोग मुख्य रूप से विकास और परीक्षण के लिए किया जाता है। जबकि nmm-protect .dex संबंधित डेटा को c स्ट्रक्चर में परिवर्तित करता है, इसमें opcode रैंडमाइज़ेशन आदि भी शामिल है, और मूल रूप से व्यावहारिक उपयोग के योग्य है।
वर्तमान में मॉड्यूल संबंधित हार्डनिंग लागू की गई है, उपयोग apk हार्डनिंग के समान है, यदि कोई समस्या हो तो issue उठा सकते हैं।
nmm-protect gpl लाइसेंस के अंतर्गत जारी किया गया है,nmm-protect licence, dex-vm भाग Apache लाइसेंस के अंतर्गत जारी किया गया है, nmmvm licence. केवल vm भाग ही apk में पैकेज किया जाएगा, nmm-protect केवल dex को परिवर्तित करता है, लाइसेंस उत्पन्न परिणाम को प्रभावित नहीं करता है।