【博主无意盗窃他人劳动成果,本文只做技术分析,无意对任何产品进行恶意攻击】
博主在对某Music APK代码做反编译学习时遇到了android的代码混淆,旨在防止应用的代码被无端
链接:https://blog.csdn.net/weixin_39020940/article/details/82952023
基于这个背景,博主想接着做一下反混淆分析,看看有没有什么办法能比较好的绕过混淆,更真实的看到源码中的设计与方案【本文只是博主自己的日记记录,不确定能否成功,毕竟博主只是业余】
我们先来看一看,android做混淆时的一些基本策略:
1、将类名按照a/b/c/d/aa/ab...等顺序重命名
2、将类的引用改为包名.类名的方式引用,避免多个a类含义重复
3、将方法名同样改为a/b/c/d..等顺序命名
4、集成android部分框架源码,同样对android框架源码做混淆
另外有两类代码的类名/方法名无法混淆
1、凡是需要在AndroidManifest.xml中去注册的所有类的类名以及从父类重写的方法名都自动不会被混淆。因此,除了Activity之外,这份规则同样也适用于Service、BroadcastReceiver和ContentProvider。
2、包含native方法的类。只要一个类中有存在native方法,它的类名就不会被混淆,native方法的方法名也不会被混淆,因为C++代码要通过包名+类名+方法名来进行交互。 但是类中的别的代码还是会被混淆的。
这里博主的想法是,对于混淆的策略1、2、3,反混淆其实就是对类名\方法名的重翻译,当然并不一定非得使用最贴近源代码的翻译,但需要具备以下几点:
1、工程内唯一
2、尽可能的贴近源码方法/类的定位
对于第一点,实践的方式比较多,但是对于第二点就比较困难了,博主的思路是:
1、Java的代码类名一般遵循 功能+设计方式的命名规范,可以通过工具识别出代码的设计方式,再通过词汇统计找出类里面非类名/方法名以外的高频词汇,拼装成类名/方法名
2、当然第一步不一定翻译出来的就是最合适的,工具需要提供能力,可以让人为统一纠正
3、针对1、2两步如果能结合机器学习,对第一步提供一个正反馈,相信工具会越来越智能,翻译效果会越来越佳
【以上只是博主个人的一些思路,并不代表业界优秀实践,也欢迎有想法的一起探讨,促进行业发展】