Android混淆、反编译基础教程
来源:互联网 发布:金字塔双轨制软件 编辑:程序博客网 时间:2024/06/06 02:41
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 即可。
例如:
# 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
这样就配置好了混淆的关联文件。下面就是开始配置混淆内容。
语法:
-include {filename} 从给定的文件中读取配置参数 -basedirectory {directoryname} 指定基础目录为以后相对的档案名称 -injars {class_path} 指定要处理的应用程序jar,war,ear和目录 -outjars {class_path} 指定处理完后要输出的jar,war,ear和目录的名称 -libraryjars {classpath} 指定要处理的应用程序jar,war,ear和目录所需要的程序库文件 -dontskipnonpubliclibraryclasses 指定不去忽略非公共的库类。 -dontskipnonpubliclibraryclassmembers 指定不去忽略包可见的库类的成员。
保留选项
-keep {Modifier} {class_specification} 保护指定的类文件和类的成员 -keepclassmembers {modifier} {class_specification} 保护指定类的成员,如果此类受到保护他们会保护的更好 -keepclasseswithmembers {class_specification} 保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。 -keepnames {class_specification} 保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除) -keepclassmembernames {class_specification} 保护指定的类的成员的名称(如果他们不会压缩步骤中删除) -keepclasseswithmembernames {class_specification} 保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后) -printseeds {filename} 列出类和类的成员-keep选项的清单,标准输出到给定的文件
压缩
-dontshrink 不压缩输入的类文件 -printusage {filename} -dontwarn 如果有警告也不终止 -whyareyoukeeping {class_specification}
优化
-dontoptimize 不优化输入的类文件 -assumenosideeffects {class_specification} 优化时假设指定的方法,没有任何副作用 -allowaccessmodification 优化时允许访问并修改有修饰符的类和类的成员
混淆
-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里边的类,最好都要避免混淆。
-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混淆、反编译基础教程
- Android混淆、反编译基础教程
- Android代码混淆 反编译
- Android反编译与混淆
- Android 签名 混淆 反编译
- android混淆和反编译
- Android混淆编译、反混淆、反编译
- Android 代码混淆防止反编译
- android项目反编译和混淆
- android工程混淆和反编译
- Android 混淆打包与反编译
- Android 代码混淆 防止反编译
- Android代码混淆及反编译
- Android 混淆打包,阻止反编译
- Android apk 反编译和混淆
- android代码混淆和反编译
- Android开发反编译与混淆
- android 反编译---and---混淆代码
- Android实战 - 音心播放器 (MusicActivity-音乐播放页面界面实现)
- Objective-c语言_可变字典
- Unity质量设置 Quality Settings
- Android学习之位图BitMap
- Jsoup解析HTML实例及文档方法详解
- Android混淆、反编译基础教程
- Spring中@Autowired注解、@Resource注解的区别
- c语言基础
- (Bitmap OOM) BitmapFactory.nativeDecodeStream
- Ⅰ.20 如何创建和访问应用程序的绑定
- [leetcode] 118. Pascal's Triangle 解题报告
- C# 版本号字符串进行比对大小
- snaprintf
- jQuery插件开发模式