• android黑科技系列——Apk混淆成中文语言代码


    一、前言

    最近想爆破一个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中的一种高度混淆技巧,让我们的代码变得更难读懂,增加安全性。主要修改了混淆工具来实现这一功能。如果你看懂了文章,就可以自己定义属于你们项目的个性化混淆策略。

  • 相关阅读:
    HDU 1850 Being a Good Boy in Spring Festival
    UESTC 1080 空心矩阵
    HDU 2491 Priest John's Busiest Day
    UVALive 6181
    ZOJ 2674 Strange Limit
    UVA 12532 Interval Product
    UESTC 1237 质因子分解
    UESTC 1014 Shot
    xe5 android listbox的 TMetropolisUIListBoxItem
    xe5 android tts(Text To Speech)
  • 原文地址:https://www.cnblogs.com/chenxd/p/7820245.html
Copyright © 2020-2023  润新知