Android上对App进行混淆是常见的事情,目的就在于一定程序上保护app的逻辑不被逆向,同时还可以减少app的体积。
在开发中常用的混淆工具首先就要提ProGuard了,这是一款免费工具,默认已被Android IDE集成,开发者只需要适当的进行配置混淆规则就可以使用proguard来混淆app,但既然是免费软件,局限性自然也比较大,首先就是不支持字符串混淆,如果要使用字符串混淆,就需要使用它的商业版本DexGuard。
既然没有免费的字符串混淆工具,那就自己先实现一个,分析了JEB(Android反编译工具),Zelix(JAVA混淆器),BurpSuite(网络代理工具)等几款混淆效果比较好的软件,了解了它们的实现思路后,自己写了个简单的字符串混淆工具,先上效果:
可以看到,这里的字符串已经被处理成16进制了,每次执行时,会调用decode方法对字符串进行还原,decode方法也很简单
1
2
3
4
5
6
7
8
9
10
11
12
|
(str) { ByteArrayOutputStream(str.length() ); (; str.length(); ) .write((.indexOf(str.charAt()) .indexOf(str.charAt()))); [] .toByteArray(); .; .length(); (; ; ) { [] () ([] .charAt()); } String(); } |
原理很简单,那是如何实现的呢,这里的实现思路是在smali层进行处理,即在App编译生成apk后再进行处理,使用apktool将apk进行反编译,然后再对smali中字符串进行混淆。
既然是混淆,就需要遍历每个smali文件,这个很简单
1
2
3
4
5
6
7
8
9
10
11
12
13
|
(filePath) { [] File(filePath).listFiles(); () { ; } () { (.isDirectory()) { (.getPath()); } { .add(.getPath()); } } } |
使用迭代方式将每个文件添加到list中,之后就是对遍历到的文件进行处理了,直接上代码,注释写的很清楚
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
(path) { StringBuilder(); { InputStreamReader(FileInputStream(path), ); BufferedReader(); ; ((.readLine()) ) { .().matcher(); (.find()) { .group(); (.equals()) { .append(); ; } .(); .group(); .(); ; ; (.(.substring()) .startsWith()) { ; } (.startsWith() (.startsWith() .(.substring()) )) { ; } { .append(); ; } ; .append(); .append(); .append(); } { .append(); } } .close(); .close(); FileOutputStream(File(path)); .write(.toString().getBytes()); .flush(); .close(); } (e) { } } |
这里没有去考虑全局变量,有兴趣的可以一起交流下
既然要使用字符串加密,那加密方法自然不能漏:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
(str) { [] str.getBytes(); .; .length(); (; ; ) { [] () ([] .charAt()); } StringBuilder(.); (; .; ) { .append(.charAt(([] ) )); .append(.charAt(([] ) )); } .toString(); } |
插入解密smali文件,这里可以自己写个Android工程,将解密方法写入,然后打包反编译成smali即可,注意插入代码的路径要和方法中对应上,最后再使用apktool打包签名即可。
使用字符串混淆,可以更大程度上保护一些敏感信息的安全性,如加密方式,JAVA中一般使用原生加密api时会在字符串中注明类型,如”AES/CBC/PKCS5Padding”,以及一些密钥硬编码,当然想还原这种字符串混淆也并不难。
说完了字符串混淆,那字典混淆又是什么,在ProGuard中默认混淆过的效果如下:
可以看到变量名,方法名以及目录名都已经以abcd等字母替换,但这种混淆只能一定程度上提高逆向难度,可以语意还是可以慢慢对变量名等进行人工恢复的,那如何大幅度提高难度呢,就需要借助字典了,在ProGuard中,允许用户使用自定义字典,并提供了三个命令
1
2
3
|
-obfuscationdictionary dic.txt -classobfuscationdictionary dic.txt -packageobfuscationdictionary dic.txt |
那这个自定义字典的效果如何呢?如下:
正常使用中需要注意proguard-rules.pro中的配置,以免app无法运行或者运行异常。
搜索“同程安全”关注YSRC公众号,关注公众号后发送“混淆”获取文中的代码实现。
本文由 安全客 原创发布,如需转载请注明来源及本文地址。
本文地址:http://bobao.360.cn/learning/detail/3580.html0day
文章评论