Android安全防护之旅---带你把Apk混淆成中文语言代码

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