试一下自定义混淆字典吧

2,381 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

前言

相信屏幕前的各位Android开发者对代码混淆都不陌生,它可以增强我们的APK的安全性,通过对方法名进行重命名,从而让反编译apk后的代码可读性变差。但是实际开发中,我发现其实也就是使用abcde这些简单的字母来替换原先的方法名,这并没有让代码的可读性变得十分糟糕。设想一下,如果我们将方法名变成 contextifelseinterfaceJava关键字(这也太sao了🙈),那这个apk反编译后的代码读起来,是不是真的想要骂街了。

想法是好的,那有没有方法来具体实现呢?

实践

Google了一下,发现还真有,还很简单。因为Google工程师也考虑到了这一点,我们只需要通过指定自定义混淆字典即可完成。在我们的项目中添加一个文本文件,如dickey.txt,然后再通过在我们的proguard-rules.pro混淆规则文件中指定通过这个文本文件来混淆方法名,这样最终生成的apk包就会通过dickey.txt中的内容来重命名。

具体如下:

# 方法名等混淆指定配置
-obfuscationdictionary ../dickey.txt
# 类名混淆指定配置
-classobfuscationdictionary ../dickey.txt
# 包名混淆指定配置
-packageobfuscationdictionary ../dickey.txt

这三个方法分别用来混淆方法名、类名以及包名。

然后我们可以在dickey.txt文件编写指定我们想用来替换的字母,如:使用Java关键字来替换。

dickey.txt

if
else
int
double
float
boolean
final
finally
do
break
continue
for
class

接着我们在 app/build.gradle 文件下开启混淆,然后通过 Gradle assembleRelease 生成APK,然后通过 Android Studio 自带的 Build Analazy Apk 功能来分析刚刚生成的APK

截屏2022-05-26 下午8.46.11.png

从上图也可以看出,我们定义在dickey.txt中的字母生效了,很多方法名都被我们定义的Java关键字所替代。这样子一来,相对比默认的abcde,代码的可读性当然是下降了。你甚至可以考虑用标点符号来代替默认的abcd,或者结合你自己业务中的业务逻辑来进一步混淆,从而让你的业务逻辑代码变得更加难以琢磨,增加工作量给那些想通过反编译你apk来查看代码的人。

总结

本文算是一个Android代码混淆的小技巧,起因正是在我查看自己混淆后的代码后,发现都是默认都是采用简单的abcd字母来重命名,突发奇想,想看一下有没有自定义重命名的方法,没想到还真有,然后简单实际了一下。但是这也仅仅是增加反编译后代码的可读性难度罢了,不能再本质上提升代码安全。如果有逆向工程师真的想要拿到你的代码,我们通过这个自定义混淆字典也只是仅仅增加一下他的工作量罢了。想进一步提升apk的安全,防止被逆向,还有很长的一段路要走。

到此,文章就结束啦。

如果本文有带给你一点帮助,请帮我点个赞,十分感谢。