Android混淆、反编译基础教程
2015-12-16 10:54
561 查看
Android混淆、反编译基础教程
Android APK混淆
Java代码是非常容易反编译的。为了很好的保护Java源代码,我们往往会对编译好的class文件进行混淆处理。根据 SDK 的版本不同有 2 中不同的代码混淆方式,以上的 proguard.cfg 参数详解中所涉及到的信息是在较低版本 SDK 下的混淆脚本,事实上在高版本的 SDK 下混淆的原理和参数也与低版本的相差无几,只是在不同 SDK 版本的环境下引入混淆脚本的方式有所不同。具体方法如下:
低版本 SDK 下,项目中同时包含 proguard.cfg 和 project.properties 文件,则只需在 project.properties 文件末尾添加 proguard.config=proguard.cfg 再将项目 Export 即可。
高版本 SDK 下,项目中同时包含 proguard-project.txt 和 project.properties 文件,这时需要在 proguard-project.txt 文件中进行如下信息的配置,然后再将项目 Export 即可。
例如:
[code] # This file is automatically generated by Android Tools. # Do not modify this file -- YOUR CHANGES WILL BE ERASED! # # This file must be checked in Version Control Systems. # # To customize properties used by the Ant build system edit # "ant.properties", and override values to adapt the script to your # project structure. # # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt # Project target. target=android-23
这样就配置好了混淆的关联文件。下面就是开始配置混淆内容。
语法:
[code] -include {filename} 从给定的文件中读取配置参数 -basedirectory {directoryname} 指定基础目录为以后相对的档案名称 -injars {class_path} 指定要处理的应用程序jar,war,ear和目录 -outjars {class_path} 指定处理完后要输出的jar,war,ear和目录的名称 -libraryjars {classpath} 指定要处理的应用程序jar,war,ear和目录所需要的程序库文件 -dontskipnonpubliclibraryclasses 指定不去忽略非公共的库类。 -dontskipnonpubliclibraryclassmembers 指定不去忽略包可见的库类的成员。
[code]保留选项
[code] -keep {Modifier} {class_specification} 保护指定的类文件和类的成员 -keepclassmembers {modifier} {class_specification} 保护指定类的成员,如果此类受到保护他们会保护的更好 -keepclasseswithmembers {class_specification} 保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。 -keepnames {class_specification} 保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除) -keepclassmembernames {class_specification} 保护指定的类的成员的名称(如果他们不会压缩步骤中删除) -keepclasseswithmembernames {class_specification} 保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后) -printseeds {filename} 列出类和类的成员-keep选项的清单,标准输出到给定的文件
[code]压缩
[code] -dontshrink 不压缩输入的类文件 -printusage {filename} -dontwarn 如果有警告也不终止 -whyareyoukeeping {class_specification}
[code]优化
[code] -dontoptimize 不优化输入的类文件 -assumenosideeffects {class_specification} 优化时假设指定的方法,没有任何副作用 -allowaccessmodification 优化时允许访问并修改有修饰符的类和类的成员
[code]混淆
[code] -dontobfuscate 不混淆输入的类文件 -printmapping {filename} -applymapping {filename} 重用映射增加混淆 -obfuscationdictionary {filename} 使用给定文件中的关键字作为要混淆方法的名称 -overloadaggressively 混淆时应用侵入式重载 -useuniqueclassmembernames 确定统一的混淆类的成员名称来增加混淆 -flattenpackagehierarchy {package_name} 重新包装所有重命名的包并放在给定的单一包中 -repackageclass {package_name} 重新包装所有重命名的类文件中放在给定的单一包中 -dontusemixedcaseclassnames 混淆时不会产生形形色色的类名 -keepattributes {attribute_name,...} 保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses. -renamesourcefileattribute {string} 设置源文件中给定的字符串常量
混淆能提高我们代码的安全性,但同时也会导致出错,所以在混淆的时候,我们一定要明确哪些不能混淆。
(1)、 申明你所有的jar包。如-libraryjars libs/gson-2.0.jar
(2)、 系统中的不混淆的申明出来,防止变异出错。API里边的类,最好都要避免混淆。
[code] -keep public class * extends android.app.Activity -keep public class * extends android.app.Application -keep public class * extends android.app.Service -keep public class * extends android.content.BroadcastReceiver -keep public class * extends android.content.ContentProvider -keep public class * extends android.app.backup.BackupAgentHelper -keep public class * extends android.preference.Preference -keep public class com.android.vending.licensing.ILicensingService
Android APK反编译
了解反编译的都知道,反编译的过程中我们需要三个工具(下载地址),分别是:apktool 作用:资源文件获取,可以提取出图片文件和布局文件进行使用查看
dex2jar 作用:将apk反编译成java源码(classes.dex转化成jar文件)
jd-gui 作用:查看APK中classes.dex转化成出的jar文件,即源码文件
使用方式:
apktool:把apktool 解压到任意位置 执行 在dos 改目录下 执行 apktool d -f xxx.apk test ,便会把编译后的资源存入test文件夹下。注意,由于低版本的apktool对很多apk都没有效果,所以我们最好下载高版本的apktool.jar,当使用的版本大于2.0时(2.0下载),语句修改为apktool d -f xxx.apk -o test
dex2jar:首先将apk文件后缀改为zip并解压,得到其中的classes.dex,它就是java文件编译再通过dx工具打包而成的,将classes.dex复制到dex2jar.bat所在目录dex2jar-0.0.9.15 文件夹。在命令行下定位到dex2jar.bat所在目录,运行dex2jar.bat classes.dex生成
classes_dex2jar.jar之后借助工具jdgui便可以查看源码。
jd-gui:将使用dex2jar 反编译出来的classes_dex2jar.jar文件用此软件打开便可以看到源码。
下面我们***一个没有混淆的apk——TranslateDemo.apk。
1、首先使用apktool进行解压资源文件。我们下载好资源,解压工具中的apktool压缩文件,解压得到3个文件:aapt.exe,apktool.bat,apktool.jar 0
(1)、将TranslateDemo.apk拷贝到解压的apktool目录下,在cmd命令行中进入该目录(通过cd指令),然后执行apktool d -f TranslateDemo.apk test。即将资源文件解压。
(2)、将我们的apk文件后缀名改为.rar或者.zip,然后进行解压,获取classes.dex文件,拷贝至dex2jar的解压目录下,然后执行在cmd中进入dex2jar目录下,执行dex2jar.bat classes.dex指令。获取解压后的classes_dex2jar.jar文件。
(3)、通过jd-gui工具打开jar包即可查看源码。
是不是很nice,所以我们的应用一定要进行混淆,不然代码都被抄袭了。最后我们以某牛的apk做个测试。看下效果图。
作者:mr_dsw 欢迎转载,与人分享是进步的源泉!
转载请保留地址:http://blog.csdn.net/mr_dsw
相关文章推荐
- Android音频系统之AudioFlinger(二)
- Android 权限设置大全
- android ScrollView嵌套RecyclerView
- android实现之高清音频录制编码
- Android音频系统之AudioFlinger(一)
- android流媒体之云视频播放-android视频播放器SDK-视频播放不在犯困
- android aidl浅析
- Android桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果
- Android音频系统之音频框架
- Android 小数位的问题
- Android之ListView分页(手机客户端自定义数据源)获取网路数据(二)
- Android详细开发规范
- Crazy Android Note Chapter-8
- android 使程序完全退出及退回到主界面
- 通过文件的方式保存内容
- android 接收与发送超长短信说明
- android zip解压缩
- 短信(一)
- dialog中出现异常android.view.WindowManager$BadTokenException
- android.content.res.Resources$NotFoundException: Unable to find resource ID #0xffffffff