Android代码混淆(ProGuard),资源混淆(微信 AndResGuard),SO混淆(obfuscator-llvm)

> 代码混淆
  Android编译的大致流程如下:Java Code(.java) -> Java Bytecode(.class) -> Dalvik Bytecode(classes.dex)。
 第三方的软件可以用来混淆我们的Android应用,常见的有:Proguard;DashO;Dexguard;DexProtector;ApkProtect;Shield4j;Stringer;Allitori
  通过ProGuard或者DexGuard来保护我们的代码,从而实现相对的代码安全。
  反混淆,将对应的oat文件通过ota2dex将其解包获得dex文件,之后通过dex2jar和jd-gui查看源码。

饿了么的团队提供gradle 插件,用来无伤混淆 Activity 和 View,Mess:https://github.com/eleme/Mess
Android Studio代码混淆插件- http://www.cnblogs.com/common1140/p/5569934.html
Android Studio 代码混淆- https://my.oschina.net/kooeasy/blog/479083?p=1 
Android studio 使用心得(五)---代码混淆和破解apk- https://my.oschina.net/aibenben/blog/371889/
android studio代码混淆注意问题-http://blog.csdn.net/jdsjlzx/article/details/51861460
android studio 代码混淆打包错误 The same input jar is specified twice - http://www.jianshu.com/p/b39af6175b79
Android Studio混淆模板及常用第三方混淆- http://blog.csdn.net/a120705230/article/details/51791995
Android 混淆代码总结- http://blog.csdn.net/lovexjyong/article/details/24652085
apkprotect(免费android代码混淆、加密保护工具)- http://bbs.pediy.com/showthread.php?p=1183956
【安卓安全】浅谈安卓开发代码混淆技术-- https://www.douban.com/note/565763793/
Android 混淆代码的原理与实施: http://blog.csdn.net/kepoon/article/details/7482058

proguard优化:http://developer.android.com/tools/help/proguard.html

Android混淆打包:http://blog.csdn.net/hudashi/article/details/9016805

Android混淆打包那些事儿:http://www.jianshu.com/p/44e3b127393e#

-- 在Android项目中,相应混淆文件引用,并在proguard-project文件下配置: 
# Project target.
target=android-8
proguard.config=${sdk.dir}\tools\proguard\proguard-android.txt:proguard-project.txt

-- android混淆打包- http://www.cnblogs.com/0616--ataozhijia/p/3727310.html
android 签名、混淆打包- http://blog.csdn.net/feng4656/article/details/8685335
 你不可能只做一个APP,你可能有一个宏伟的战略工程,想要在生活,服务,游戏,系统各个领域都想插足的话,你不可能只做一个APP,谷歌建议你把你所有的APP都使用同一个签名证书。
 1) App升级。 使用相同签名的升级软件可以正常覆盖老版本的软件,否则系统比较发现新版本的签名证书和老版本的签名证书不一致,不会允许新版本安装成功的。
 2) App模块化。android系统允许具有相同的App运行在同一个进程中,如果运行在同一个进程中,则他们相当于同一个App,但是你可以单独对他们升级更新,这是一种App级别的模块化思路。
 3) 允许代码和数据共享。android中提供了一个基于签名的Permission标签。通过允许的设置,我们可以实现对不同App之间的访问和共享,如下AndroidManifest.xml:

--   从ProGuard的工作流来看,ProGuard做的工作基本主要包含:压缩、优化、混淆以及最后的校验。体现到代码层面上做的事情就是:混淆类名、方法名、字段名,修改方法、字段访问性,删除方法(上例中内部类的构造方法),方法的内联,甚至是减少方法的参数(这就改变了方法签名)等等。大体可以总结为三大问题:混淆、优化、内联,其中优化相关操作,比如说改变方法签名和删除方法,我们可以把这类问题划归到内联,因为在优化后的代码里面这些方法和内联的方法一样,都消失了。

> 资源混淆

   Android资源管理框架来管理资源,而Android资源管理框架实际是由AssetManager和Resources两个类来实现的。其中,Resources类可以根据ID来查找资源,而AssetManager类根据文件名来查找资源。事实上,如果一个资源ID对应的是一个文件,那么Resources类是先根据ID来找到资源文件名称,然后再将该文件名称交给AssetManager类来打开对应的文件的。
美团Android资源混淆保护实践- http://tech.meituan.com/mt-android-resource-obfuscation.html
美团Android资源混淆保护实践- http://blog.csdn.net/easyer2012/article/details/50547480
微信Android资源混淆打包工具- http://mp.weixin.qq.com/s?__biz=MzAwNDY1ODY2OQ==&mid=208135658&idx=1&sn=ac9bd6b4927e9e82f9fa14e396183a8f#rd
微信Android资源混淆AndResGuard- https://github.com/shwenzhang/AndResGuard/blob/master/README.zh-cn.md
微信Android资源混淆AndResGuard- https://github.com/shwenzhang/AndResGuard
美团Android资源混淆保护实践- http://tech.meituan.com/mt-android-resource-obfuscation.html
 -- AAPT是Android Asset Packaging Tool,打包的流程:
 1.把"assets"和"res/raw"目录下的所有资源进行打包(会根据不同的文件后缀选择压缩或不压缩),而"res/"目录下的其他资源进行编译或者其他处理(具体处理方式视文件后缀不同而不同,例如:".xml"会编译成二进制文件,".png"文件会进行优化等等)后才进行打包;
 2.会对除了assets资源之外所有的资源赋予一个资源ID常量,并且会生成一个资源索引表resources.arsc;
 3.编译AndroidManifest.xml成二进制的XML文件;
 4.把上面3个步骤中生成结果保存在一个*.ap_文件,并把各个资源ID常量定义在一个R.java中;

  Proguard Obfuscator方式,对APK中资源文件名使用简短无意义名称进行替换,给破解者制造困难,从而做到资源的相对安全;通过上面分析,我们可以看出通过修改AAPT在生成resources.arsc和*.ap_时把资源文件的名称进行替换,从而保护资源。通过修改AAPT,我们可以在代码零修改的基础下就能做到相对的资源安全,当然安全是相对的.
  通过阅读AAPT编译资源的代码,我们发现修改AAPT在处理资源文件相关的源码是能够做到资源文件名的替换,下面是Resource.cpp中makeFileResources()的修改的代码片段:
static status_t makeFileResources(Bundle* bundle, const sp& assets,
                                      ResourceTable* table,
                                      const sp& set,
                                      const char* resType)
    {
        String8 type8(resType);
        String16 type16(resType);

        bool hasErrors = false;
        ResourceDirIterator it(set, String8(resType));
        ssize_t res;
        while ((res=it.next()) == NO_ERROR) {
            if (bundle->getVerbose()) {
                printf("    (new resource id %s from %s)\n",
                       it.getBaseName().string(), it.getFile()->getPrintableSource().string());
            }
            String16 baseName(it.getBaseName());
            const char16_t* str = baseName.string();
            const char16_t* const end = str + baseName.size();
            while (str < end) {
                if (!((*str >= 'a' && *str <= 'z')
                        || (*str >= '0' && *str <= '9')
                        || *str == '_' || *str == '.')) {
                    fprintf(stderr, "%s: Invalid file name: must contain only [a-z0-9_.]\n",
                            it.getPath().string());
                    hasErrors = true;
                }
                str++;
            }
            String8 resPath = it.getPath();
            resPath.convertToResPath();

            String8 obfuscationName;
            String8 obfuscationPath = getObfuscationName(resPath, obfuscationName);

            table->addEntry(SourcePos(it.getPath(), 0), String16(assets->getPackage()),
                            type16,
                            baseName, // String16(obfuscationName),
                            String16(obfuscationPath), // resPath
                            NULL,
                            &it.getParams());
            assets->addResource(it.getLeafName(), obfuscationPath/*resPath*/, it.getFile(), type8);
        }
        return hasErrors ? UNKNOWN_ERROR : NO_ERROR;
    }

> Android SO库混淆 so库中JNI方法混淆
Android studio 混淆打包时如何忽略依赖库中的第三方.so文件- https://blog.csdn.net/u011907407/article/details/55510379

  混淆C项目代码:obfuscator-LLVM;使用O-LLVM和NDK对Android应用进行混淆。android的native代码,也就是so和linux的c/c++代码均可使用的混淆工具ollvm的编译,混淆,反混淆,和反反混淆。相对于Dalvik虚拟机层次的混淆而言,原生语言(C/C++)组件的代码混淆选择并不多,Obfuscator-LLVM工程是一个值得关注的例外。

(1)LLVM是lowlevel virtual machine的简称,是一个编译器框架。苹果公司的Xcode 4.0之后用的都是LLVM编译器。  LLVM是lowlevel virtual machine的简称,是一个编译器框架。苹果公司的Xcode 4.0之后用的都是LLVM编译器。目的是为了增加逆向工程的难度。Obfuscator-llvm最新版本集成了LLVM-3.4编译器,可移植性很高,并且兼容LLVM支持的所有语言(C,C++, Objective-C, Ada and Fortran)和平台(x86, x86-64, PowerPC, PowerPC-64,ARM, Thumb, SPARC, Alpha, CellSPU, MIPS, MSP430, SystemZ,and XCore)。

Android应用obfuscator进行混淆- https://github.com/obfuscator-llvm/obfuscator/
参数相关的文档可以看 github 上的wiki: https://github.com/obfuscator-llvm/obfuscator/wiki
混淆器 obfuscator-llvm- https://github.com/obfuscator-llvm/obfuscator/tree/llvm-3.6.1
利用OLLVM混淆Android Native代码篇一 https://geneblue.github.io/2016/10/09/%E5%88%A9%E7%94%A8OLLVM%E6%B7%B7%E6%B7%86Android%20Native%E4%BB%A3%E7%A0%81%E7%AF%87%E4%B8%80/
使用O-LLVM和NDK对Android应用进行混淆- http://android.jobbole.com/81230/
使用obfuscator llvm 和andorid NDK(Cmake)进行代码混淆- https://blog.csdn.net/huang_yx005/article/details/76636219
Obfuscator-LLVM 可以混淆C代码- https://github.com/obfuscator-llvm/obfuscator/tree/llvm-4.0
使用O-LLVM和NDK对Android应用进行混淆- http://blog.csdn.net/asce1885/article/details/47175621
OLLVM(Obfuscator-LLVM)- https://github.com/Fuzion24/AndroidObfuscation-NDK 
OLLVM(Obfuscator-LLVM)- https://github.com/obfuscator-llvm/obfuscator 
Android代码混淆技术总结(一)- http://bobao.360.cn/learning/detail/3704.html
 

你可能感兴趣的:(安全/(反)混淆)