{"id":13480431,"url":"https://github.com/maoabc/nmmp","last_synced_at":"2025-03-27T10:32:46.860Z","repository":{"id":38307595,"uuid":"369624899","full_name":"maoabc/nmmp","owner":"maoabc","description":"dex-vm used to protect the android classes.dex file","archived":false,"fork":false,"pushed_at":"2023-11-22T10:30:20.000Z","size":3177,"stargazers_count":753,"open_issues_count":59,"forks_count":264,"subscribers_count":26,"default_branch":"master","last_synced_at":"2024-08-01T17:22:02.962Z","etag":null,"topics":["android","ndk"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/maoabc.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2021-05-21T18:40:15.000Z","updated_at":"2024-07-31T10:40:15.000Z","dependencies_parsed_at":"2023-11-22T11:43:34.542Z","dependency_job_id":null,"html_url":"https://github.com/maoabc/nmmp","commit_stats":null,"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maoabc%2Fnmmp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maoabc%2Fnmmp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maoabc%2Fnmmp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maoabc%2Fnmmp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/maoabc","download_url":"https://codeload.github.com/maoabc/nmmp/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":222239317,"owners_count":16953915,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","ndk"],"created_at":"2024-07-31T17:00:39.203Z","updated_at":"2024-10-30T14:30:30.480Z","avatar_url":"https://github.com/maoabc.png","language":"C","funding_links":[],"categories":["C"],"sub_categories":[],"readme":"# nmmp\n基于dex-vm运行dalvik字节码从而对dex进行保护，增加反编译难度。\n项目分为两部分nmm-protect是纯java项目，对dex进行转换，把dex里数据转为c结构体，opcode随机化生成ndk项目,编译后生成加固后的apk。nmmvm是一个安卓项目，包含dex-vm实现及各种dalvik指令的测试等。\n# nmm-protect\n\n+ 配置ndk及环境变量\n\n不编译nmm-protect，可以直接看使用它生成项目及最后的apk，[一个对apk处理的例子](https://github.com/maoabc/nmmp/releases/download/demo/demo.zip)。\n\n例子在linux环境下测试的，windows也应该没问题,先安装好JDK及android sdk和ndk。\n\n下载[vm-protect.jar](https://github.com/maoabc/nmmp/releases/download/last/vm-protect-2023-07-08-0942.jar),配置好环境变量ANDROID_SDK_HOME、ANDROID_NDK_HOME:\n``` bash\nexport ANDROID_SDK_HOME=/opt/android-sdk\nexport ANDROID_NDK_HOME=/opt/android-sdk/ndk/22.1.7171670\nexport CMAKE_PATH=/opt/android-sdk/cmake/3.18.1/   #可选，不配置的话直接使用/bin/cmake\n```\n+ apk加固\n  \n``` bash\njava -jar vm-protect-xxx.jar apk input.apk convertRules.txt mapping.txt\n```\n执行完毕会在input.apk所在的目录下生成一个build目录，里面包含最后输出的apk(build/input-protect.apk)，完整的c项目dex2c(基于cmake)及处理过程中生成的.dex等。  \n第一次运行后会在jar位置生成tools目录，里面有config.json可以编辑它配置安卓sdk，ndk相关路径。\n\n有朋友写了个GUI界面，能更方便使用，需要的可以去试试，https://github.com/TimScriptov/nmmp\n\n生成的apk需要使用zipalign对齐（新版本已使用zipflinger处理apk,可以不用使用单独的zipalign）及apksigner签名才能安装使用\n``` bash\napksigner sign --ks ~/.myapp.jks build/input-protect-align.apk\n```\n+ aab加固\n  \n``` bash\njava -jar vm-protect-xxx.jar aab test.aab convertRules.txt\n```\n之后需要使用jarsigner签名，也可以集成signflinger进行签名\n``` bash\njarsigner -keystore ~/.myapp.jks -storepass pass -keypass pass test-protect.aab keyAlias\n```\n\n+ aar加固\n``` bash\njava -jar vm-protect-xxx.jar aar testModule.aar convertRules.txt\n```\n\n+ 下载及编译项目\n``` bash\ngit clone https://github.com/maoabc/nmmp.git\ncd nmmp/nmm-protect\n./gradlew arsc:build\n./gradlew build\n```\n成功后会在build/libs生成可直接执行的fatjar。\n+ 需要转换的类和方法规则\n\n无转换规则文件，则会转换dex里所有class里的方法（除了构造方法和静态初始化方法）。规则只支持一些简单的情况：\n``` java\n//支持的规则比较简单，*只是被转成正则表达式的.*，支持一些简单的继承关系\nclass * extends android.app.Activity\nclass * implements java.io.Serializable\nclass my.package.AClass\nclass my.package.* { *; }\nclass * extends java.util.ArrayList {\n  if*;\n}\n\n\nclass A {\n}\nclass B extends A {\n}\nclass C extends B {\n}\n//比如'class * extends A' 只会匹配B而不会再匹配C\n```\n\n\n# nmmvm\nnmmvm是dex虚拟机具体实现，入口就一个函数:\n``` c\njvalue vmInterpret(\n        JNIEnv *env,\n        const vmCode *code,\n        const vmResolver *dvmResolver\n);\n\ntypedef struct {\n    const u2 *insns;             //指令\n    const u4 insnsSize;          //指令大小\n    regptr_t *regs;                    //寄存器\n    u1 *reg_flags;               //寄存器数据类型标记,主要标记是否为对象\n    const u1 *triesHandlers;     //异常表\n} vmCode;\n\n\ntypedef struct {\n\n    const vmField *(*dvmResolveField)(JNIEnv *env, u4 idx, bool isStatic);\n\n    const vmMethod *(*dvmResolveMethod)(JNIEnv *env, u4 idx, bool isStatic);\n\n    //从类型常量池取得类型名\n    const char *(*dvmResolveTypeUtf)(JNIEnv *env, u4 idx);\n\n    //直接返回jclass对象,本地引用需要释放引用\n    jclass (*dvmResolveClass)(JNIEnv *env, u4 idx);\n\n    //根据类型名得到class\n    jclass (*dvmFindClass)(JNIEnv *env, const char *type);\n\n    //const_string指令加载的字符串对象\n    jstring (*dvmConstantString)(JNIEnv *env, u4 idx);\n\n} vmResolver;\n\n```\nvmCode提供执行所需要的指令、异常表及寄存器空间，vmResolver包含一组函数指针，提供运行时的符号，比如field，method等。通过自定义这两个参数来实现不同的加固方式，比如项目里的test.cpp有一个简单的基于libdex实现的vmResolver，它主要用于开发测试。而nmm-protect实现的是把.dex相关数据转换为c结构体，还包含了opcode随机化等，基本可实际使用。\n\n# aar模块加固\n目前已实现模块相关加固，用法同apk加固类似，如果有问题可以提issue。\n\n\n# Licences\nnmm-protect 以gpl协议发布,[nmm-protect licence](https://github.com/maoabc/nmmp/blob/master/nmm-protect/LICENSE), dex-vm部分以Apache协议发布, [nmmvm licence](https://github.com/maoabc/nmmp/blob/master/nmmvm/LICENSE). 只有vm部分会打包进apk中, nmm-protect只是转换dex,协议不影响生成的结果.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaoabc%2Fnmmp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmaoabc%2Fnmmp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaoabc%2Fnmmp/lists"}