一、前言
最近想爆破一个app,没有加壳,简单的使用Jadx打开查看源码,结果把我逗乐了,代码中既然都是中文,而且是一些比较奇葩的中文字句,如图所示:
瞬间感觉懵逼了,这app真会玩,我们知道因为Java语言是支持双字符的,所以可以将包名,类名,变量名,方法名定义成中文,或者其他国家的语言都可以的。所以本身这种做法是不会运行报错的,比如下面我们新建一个Java工程看一下效果:
运行是没有任何问题的。看到这里的时候觉得很好奇,所以就先没去看他的源码了,而是想着怎么实现这种混淆的功能。下面就来介绍一下这种高度混淆的原理:
二、分析混淆工具源码
首先我们知道每个正式app发布之前都会进行代码混淆,而关于混淆的知识点,可以自行搜索了解了,混淆有很多好处,优化代码,增加安全性等,而混淆一般是采用了proguard.jar工具,这个工具混淆之后的代码默认都是26个大小写字母,所以如果想把代码混淆成中文,那么就需要对这个工具下手。幸好这个工具是开源的,所以从网上搜他的源码下载下来,导入工程即可:
找到入口类Proguard,这里为了演示方便,咋们就直接模拟一个命令直接运行看效果,关于命令后面会说到。这里有一个解析命令的类功能:
这里可以看到混淆规则,也就是我们一般用到的proguard.cfg文件,后面会介绍这个文件内容。那么下面我们就不要在深入代码了,直接找到混淆代码的地方即可,可以通过包名中有obfuscate快速找到这个类:SimpleNameFactory
进入这个类查看内容,有一个生成混淆名的方法:
这里CHARACTER_COUNT=26,也就是字母的个数,再看看charAt方法:
这个方法也很简单,就是取52个字符中的顺序一个。所以newName方法的实现逻辑就是:从52个字符中依次取出字符,如果发现这个字符被使用过了,就取下一个,如果单个字符被用完了,就双字符,依次类推多字符等。所以这里还有一个全局的名称字符缓存池:
用来记录这个字符名称有没有被用过,所以通读了一遍代码,没什么难度,而且这个类还有一个测试方法:
直接运行看看效果:
看到了,会生成不同字符名。
三、修改混淆工具
所以知道了上面的代码逻辑之后,下面我们就可以动手来修改这个类,让他生成中文词语,首先去网上搜一下中文字符的范围,然后在定义一个生成五个字的词语方法即可:
这里可以看到韩文,日文的范围,所以我们不仅可以修改成中文,也可以修改成其他国家的语言,然后定义一个随机五字词语的方法:
生成不规则词句之后,修改newName方法实现:
然后我们在运行一下测试方法:
看结果,我们已经实现成功了。到这里其实我们已经将proguard.jar改造成功了,下面为了演示修改的结果,需要用一个apk做测试,我们随便弄一个apk,因为这里不想给一个工程编写脚本,然后将系统的proguard.jar工具替换成我们修改之后的proguard.jar。所以就直接拿到apk中的classes.dex文件,然后将其转化成classes.jar文件。然后直接放到这个proguard工程中运行即可。
四、运行混淆工具
下面简单看一下运行proguard工程需要准备哪些东西:
因为我们操作的是Android应用需要引用到系统api所以需要导入android.jar,然后就是混淆规则文件proguard.pro:
这里要说明就是引用第三方的jar,和输入输出jar文件路径设置,其他的设置都是正常的混淆规则,不多解释了,下面就直接用上面得到app中的dex文件转化之后的jar文件作为案例,运行proguard工程:
看到混淆之后的jar文件,和混淆的map文件了。接下来咋们在将混淆之后的jar文件打包回去,首先用dx命令将jar文件变成classes.dex文件,然后直接替换apk中原始的dex文件,在重新签名即可。最后咋们在用Jadx工具打开这个apk查看内容:
看到了,我们成功了将原来的apk混淆成中文语言的代码了,而对于这种混淆也是可以增加阅读难度的。当然这个apk安装运行也是不会报错的,这里就不演示了。
五、技术总结
到这里我们就成功的实现了,如何将一个apk混淆成功中文语言代码的功能了。下面还需要总结几点:
1、本文主要是利用proguard是开源项目,修改他的混淆代码达到我们的目的。
2、本文是将其代码改成中文语言的,而从我们分析的过程中可以知道,可以变成其他国家的语言都是可以的。
3、本文为了方便就随机生成一个五字词语,而如果你想生成一些有规则有个性的词语,可以自定义一个词语库,然后随机取即可。
4、本文为了演示方便,就没有正式的编写一个编译脚本,而是通过简单粗暴的方式混淆jar方式进行操作。
5、这种高度混淆对于反编译之后代码阅读难度有一定的增强,因为看惯了英文,一下子看中文反而不习惯了。
项目下载地址:因为proguard工具是开源的,所以我没必要上传了,大家可以自己搜索项目即可。
六、总结
本文就简单的介绍了Android中的一种高度混淆技巧,让我们的代码变得更难读懂,增加安全性。主要修改了混淆工具来实现这一功能。如果你看懂了文章,就可以自己定义属于你们项目的个性化混淆策略。最后如果阅读完了文章,一定要记得多多点赞分享,如果有打赏那就最好了!
更多内容:点击这里
关注微信公众号,最新技术干货实时推送
编码美丽技术圈
微信扫一扫进入我的"技术圈"世界
扫一扫加小编微信
添加时请注明:“编码美丽”非常感谢!