3月17日,网易资深安全工程师钟亚平在安卓巴士全球开发者论坛上做了《安卓APP逆向与保护》的演讲。其中就谈到了关于代码混淆的问题。现摘取部分重点介绍如下:

 

Java代码是非常容易反编译的,作为一种跨平台的、解释型语言,Java 源代码被编译成中间“字节码”存储于class文件中。由于跨平台的需要,这些字节码带有许多的语义信息,很容易被反编译成Java源代码。为了很好地保护Java源代码,开发者往往会对编译好的class文件进行混淆处理。

混淆就是对发布出去的程序进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也很难得出程序的真正语义。ProGuard就是一个混淆代码的开源项目,能够对字节码进行混淆、缩减体积、优化等处理。

Proguard处理流程图如下所示,包含压缩、优化、混淆、预检四个主要环节:

 

1. 压缩(Shrink):检测并移除代码中无用的类、字段、方法和特性(Attribute);

2. 优化(Optimize):对字节码进行优化,移除无用的指令。优化代码,非入口节点类会加上private/static/final,没有用到的参数会被删除,一些方法可能会变成内联代码;

3. 混淆(Obfuscate):使用a、b、c、d这样简短而无意义的名称,对类、字段和方法进行重命名;

4. 预检(Preveirfy):在Java平台上对处理后的代码进行预检,确保加载的class文件是可执行的。

在分享中,钟亚平展示了利用Proguard,对Dex2jar进行反编译处理后的Apk效果示例:

 

Proguard处理前
 Proguard处理后

Proguard混淆器不仅能够保护代码,而且能够精简编译后的程序大小,减少内存占用。

混淆代码逆向分析

如果想要反编译混淆代码,钟亚平分享了一个国外的工具DEGUADR,它能够通过统计的方式来解混淆。虽然这个工具的正确率达不到100%,但是能在一定程度上帮助反编译代码。

使用DEGUADR解混淆的示例:

com.xxxxx.common.util.CryptoUtil网站也提供了一种反编译服务,如下所示:

java.lang.String a(byte[]) -> encodeToString 
java.lang.String a(byte[],boolean,java.lang.String) -> a 
byte[] a(byte[],byte[]) -> encrypt 
byte[] b(byte[]) -> getKey 
byte[] b(byte[],byte[]) -> decrypt 
byte[] d(java.lang.String) -> getKey 
java.lang.String a(byte,char[]) -> a 
java.lang.String a(java.io.File) -> getHash 
java.lang.String a(java.lang.String) -> c 
java.lang.String b(java.lang.String) -> encode

 

完整演讲内容请见这里:一文了解安卓App逆向分析与保护机制

相关阅读:一文读懂加固apk的开发者是怎么想的

Android App的破解技术有哪些?如何防止反编译?

关于网易易盾的加固保护

当前安卓App加固到底该如何做到防篡改?

安卓App逆向保护作为开发工作中的重要内容,一直是网易云易盾致力于提供的应用服务。

网易云为您提iOS应用加固、 Android应用加固服务,点击均可免费体验

大公司怎么做Android代码混淆的?的更多相关文章

  1. Android 代码混淆规则

    1. Proguard介绍 Android SDK自带了混淆工具Proguard.它位于SDK根目录toolsproguard下面.ProGuard是一个免费的Java类文件收缩,优化,混淆和预校验器 ...

  2. Android代码混淆官方实现方法

    首先查看一下 “project.properties” 这个文件: # This file is automatically generated by Android Tools.# Do not m ...

  3. Android 代码混淆 混淆方案

    本篇文章:自己在混淆的时候整理出比较全面的混淆方法,比较实用,自己走过的坑,淌出来的路.请大家不要再走回头路,可能只要我们代码加混淆,一点不对就会导致项目运行崩溃等后果,有许多人发现没有打包运行好好地 ...

  4. Android代码混淆和项目宣布步骤记录器

    原本放在一起Android项目与发布的文件相混淆.我突然想到,为什么不写博客,分享.有这篇文章的情况下,. Android代码混淆及项目公布步骤记录 一.清理代码中的调试信息,如Log.System. ...

  5. Android代码混淆及项目发布方法记录

     Android代码混淆及项目发布步骤记录 本来整理了一份Android项目混淆与发布的文档,突然想到何不写篇博客,分享一下呢,如是便有了本文. Android代码混淆及项目发布步骤记录 一.清理 ...

  6. android 代码混淆及问题大集锦

    最近在需要对所开发的项目进行了代码混淆,在android studio中开启代码混淆其实还是挺方便的,不过因为代码混淆产生的问题非常多,特别是对于一些涉及到反射的第三方库经常因为名称的变化导致无法使用 ...

  7. CI Weekly #7 | Instgram/Quora 等大公司如何做持续部署?

    终于,你们期待的 flow.ci iOS 项目持续集成 开始公测了.在这几个工作日, flow.ci 做了些许「功能优化」与「问题修复」,性能和体验都在持续优化中.比如: iOS 快速入门文档更新: ...

  8. Android 代码混淆 防止反编译

    为了防止代码被反编译,因此需要加入混淆.混淆也可以通过第三方进行apk混淆,也可以用android中的proguard进行混淆. 混淆步骤: 1.配置混淆文件,名字可以随意,在这里使用proguard ...

  9. Android 代码混淆

    什么是代码混淆 Java 是一种跨平台的.解释型语言,Java 源代码编译成中间”字节码”存储于 class 文件中.由于跨平台的需要,Java 字节码中包括了很多源代码信息,如变量名.方法名,并且通 ...

随机推荐

  1. Spring cloud Hystrix的配置属性优先级和详解

    Hystrix配置属性详解 Hystrix可以配置属性的有以下类型: Execution:控制HystrixCommand.run() 的如何执行 Fallback: 控制HystrixCommand ...

  2. 42.国际化-配置package的资源文件

    转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html 同样在建立com.asm包下建立两个资源文件(package级别的资源文件名 ...

  3. 跟我学算法- tensorflow模型的保存与读取 tf.train.Saver()

    save =  tf.train.Saver() 通过save. save() 实现数据的加载 通过save.restore() 实现数据的导出 第一步: 数据的载入 import tensorflo ...

  4. Redis 主从分离

    首先配置redis.conf文件如下6个位置 cp 多个redis.conf文件 开启daemonize yes PID文件名字 端口 log文件名字 dump.rdb名字 配置: 主机不动,配置从机 ...

  5. VS2010生成的文件在别的机器上运行提示“丢失MSVCR100D.dll”<转>

    用vs2010编写的程序经常会发生的一个问题.在自己的机器上运行的好好的,但是在别的机器上就会发生没有找到MSVCR100D.dll.这是 个很头疼的问题.对于一些代码量几百行的小程序,我不可能要求其 ...

  6. JSP中系统Date的几点不符合中国时间观的地方

    正常调用系统时间的显示格式是Date date = new Date 显示出来的当前时间为Sun Nov 22 18:39:51 CST 2015 星期天的英文单词是Sun, 这个大家都是熟悉的, 这 ...

  7. 18.4Sum (Map)

    Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = tar ...

  8. IoC和DI的区别

    ------------------siwuxie095                                     IoC 和 DI 的区别         1.区别     (1)Io ...

  9. 数据库查询返回Resource id #9后的处理方式

    如果在调用PHP查询数据库,在echo后返回的是Resource id #9,可能你的输出方式是: $sql="SELECT * FROM dbname WHERE id='1'" ...

  10. Luogu 4449 于神之怒加强版

    挺套路的题,然而一开始还是想错了…… $\sum_{i = 1}^{n}\sum_{j = 1}^{m}gcd(i, j) ^ {k} = \sum_{T = 1}^{min(n, m)}\left ...