作家
登录

Android高级混淆和代码保护技术

作者: 来源: 2017-07-24 13:30:00 阅读 我要评论

-repackageclasses com.drakeet.purewriter.debug

须要留意的是,-repackageclasses + 你的包名 这种做法存在混淆 bug,而默认 -repackageclasses 不加包名不会出现 bug,所以初次应用此法须要进行测试,不然请退而求其次,关于这个 bug 的具体内容不多说,很赘述。

第二个实用 rules 设备项:-obfuscationdictionary

-obfuscationdictionary 后面加一个纯文本文件路径,它的感化是指定一个字典文件作为混淆字典。默认情况下我们的代码定名会被混淆成 abcdefg... 字母组合的内容,须要修改可以应用这个设备项将字典修改成乱码或中文内容。乱码定名可以令反编译者困惑人生。中订婚名则可以或许破坏一些反编译软件的┞俘常工作,并且有的中订婚名还能起到乱花侥暌不雅迷人眼的效不雅,比如 GitHub 上较为风行的某长者的话语作为字典,在此不便贴出(可能会有人身危险),各位可以自行搜刮,找不到别怪我。这些话语作为代码定名,可以令反编译者沉浸个中,无心分析代码 :P。

最后,关于混淆的内容,我们还有一块软肋,就是资本文件,Proguard 完全不会管我们的资本文件,是以如不雅资本文件名没有做保护的话,很轻易被顺藤摸瓜找到接洽关系的 Java 代码,对此,微信团队供给了一个好用的资本混淆对象,它不仅能帮你周全混淆资本文件,还能帮你缩减资本文件的┞符体体积,这个对象叫 AndResGuard,开源地址:https://github.com/shwenzhang/AndResGuard

安然

有了代码混淆还不敷,我们须要更多技能来保护我们的代码,特别是对于须要做混淆但又须要裸露很多 API 的 SDK 开辟者来说。混淆是基本,代码安然是意识。

一,不要硬编码写入字符串值,即使你不得不这么做,也至少应当另起一个类,比如叫做HardStrings,用于静态存放这些硬编码的字符串。如许反编译者只能搜刮到你这个常量类,而较难以搜刮到这些字符串常量被哪里引用。

二,在 release 混淆过程中删除 Log 代码,应用 -assumenosideeffects 这个设备项可以帮我们在编译成 APK 之前把日记代码全部删掉落,这么做不仅有助于晋升机能,并且日记代码往往会保存很多我们的意图和很多可被反编译的字符串:

  1. -assumenosideeffects class android.util.Log { 
  2.     public static boolean isLoggable(java.lang.String, int); 
  3.     public static int d(...); 
  4.     public static int w(...); 
  5.     public static int v(...); 
  6.     public static int i(...); 

三,对于你不得不留下的一些硬编码和日记内容,可以采取编码情势调换,如 你可以规定 "4001" 代表某种缺点,而不是在你的代率攀里写入这个缺点的具体描述字符串。这么做的话,你须要有个处所记下这些编码映射的内容,关于此有个技能:你可以再创建一个常量类,其内容是一堆静态字符串对象,针对膳绫擎那个例子,你可以把真正的缺点信息作为一个字符串变量的名字,而把它的值写成一个编码,如下:

  1. public static final String SHOULD_REGISTER_FIRST_ERROR = "ssrrffe"

如许当你在看没混淆的代码引用这个静态变量,你可以或许一目了然它的意思。而反编译者看到的则是:

  1. public static final String abc = "ssrrffe"

定名看不懂,值也看不懂。

起首我们要知道我们混淆代码是若何被攻破的,其实对于反编译者来说,最简单的入手点就是字符串搜刮,我们硬编码留在代率攀里的字符串值都邑在反编译过程中被原样恢复,是以这是我们重要存眷对象。避免被经由过程字符串攻破,我们应当做到以下几点:

除此之外,我专门写过一篇叫作《Android 密钥保护和 C/S 收集传输安然理论指南》 的文┞仿,感兴趣可以之后移步浏览。

四,把 AppKey 之类特别敏感的字符串内容藏在 native so 文件中。

关于字符串技能的内容差不多就如许了,能做到这些就不错了,还有一些极端做法不多说,为了阻碍黑客浏览,本身也变得异常麻烦,双刃剑,这不是我们想要的结不雅。

然后我们讲另一个混淆后代码的软肋,就是一些我们不得不 keep 的内容,如不雅是闭源 SDK 开辟者,须要 keep 的内容将会更多,几乎只如果 public 的类、变量,办法,全部要 keep,那么针对这个问题,我们该怎么办?介绍一个办法:


  推荐阅读

  1000+人推荐的30个实用的Linux命令

1.uptime敕令在Linux中,uptime敕令显示了你的体系运行了多久以及今朝登录的用户有若干,别的还显示了距离1分钟、5分钟和15分钟的负载平均值。# uptime08:16:26 up 22min, 1 user,loadave>>>详细阅读


本文标题:Android高级混淆和代码保护技术

地址:http://www.17bianji.com/lsqh/36365.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)