原文出处 反编译Android APK及防止APK程序被反编译
怎么逆向工程对Android Apk 进行反编译
google Android开发是开源的,开发过程中有些时候会遇到一些功能,自己不知道该怎么做,然而别的软件里面已经有了,这个时候可以采用反编译的方式,解开其他的程序,来了解一些它 的做法,同时啊,还可以借鉴别人的软件结构,资源文件;作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用的APK进行反编译查看。
此方式主要目的是为了促进开发者学习,借鉴好的代码,提升自我开发水平。请勿去破解人家的软件或其他操作
反编译工具包
- apktools-目前最强大的反编译工具
轻松反编译apk,解析出资源文件,xml文件,生成smali文件,还可以把修改后的文件你想生成apk。
作用:资源文件获取,可以提取出图片文件和布局文件进行使用查看
- dex2jar
将apk中的dex文件转换成为jar文件,很多人不会看smali文件,还是看java类文件比较舒服,这个时候可以借助这个工具来转成java,也是支持windows,linux,mac。
作用:将apk反编译成java源码(classes.dex转化成jar文件)
- jd-gui
查看jar文件,基本可以看到java class文件了,也是支持mac,windows,linux。
作用:查看APK中classes.dex转化成出的jar文件,即源码文件
反编译流程
一、准备好要反编译的软件
二、apk反编译得到程序的源代码、图片、XML配置、语言资源等文件
- 使用apktools进行apk反编译得到程序的源代码、图片、XML配置、语言资源等文件
将需要反编译的APK文件放到该目录下,打开命令行界面(运行-CMD) ,定位到apktool文件夹,输入以下命令:
apktool.bat d -f emanager.apk emanager
(命令中emanager.apk指的是要反编译的APK文件全名,emanager为反编译后资源文件存放的目录名称,即为:
apktool.bat d -f [apk文件 ] [输出文件夹])
- 获取成功后便有可以查看该应用的所有资源文件了
- 如果你想将反编译完的文件重新打包成apk,那你可以:输入
apktool.bat b emanager(你编译出来文件夹) 便可,这就不述说了。
三、Apk反编译得到Java源代码
- Apk反编译得到Java源代码
下载上述工具中的dex2jar和jd-gui ,解压将要反编译的APK后缀名改为.rar或则 .zip,并解压,得到其中的额
classes.dex文件
(它就是java文件编译再通过dx工具打包而成的),将获取到的classes.dex放到之前解压出来的工具dex2jar-0.0.9.15 文件夹内
,在命令行下定位到dex2jar.bat所在目录,输入dex2jar.bat classes.dex
- 目录下会生成一个
classes_dex2jar.jar
的文件,然后打开工具jd-gui文件夹里的jd-gui.exe
,之后用该工具打开之前生成的classes_dex2jar.jar文件
,便可以看到源码了,效果如下: - 被混淆过的效果图(类文件名称以及里面的方法名称都会以a,b,c....之类的样式命名):
可以看到反编译的代码和原本的代码差别不大,主要差别是原来的资源引用全都变成了数字。
即使那些代码是混淆过的,你可以得到他的大体思路对你的开发有益无害
防止APK程序被反编译
作为Android应用开发者,不得不面对一个尴尬的局面,就是自己辛辛苦苦开发的应用可以被别人很轻易的就反编译出来。
Google似乎也发现了这个问题,从SDK2.3开始我们可以看到在android-sdk-windows\tools\下面多了一个
proguard文件夹
proguard是一个java代码混淆的工具,通过proguard,别人即使反编译你的apk包,也只会看到一些让人很难看懂的代码,从而达到保护代码的作用。
- 先介绍一下什么是代码混淆:
代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为。代码混淆可以用于程序源代码,也可以用于程序编译而成的中间代码。执行代码混淆的程序被称作代码混淆器。目前已经存在许多种功能各异的代码混淆器。
将代码中的各种元素,如变量,函数,类的名字改写成无意义的名字。比如改写成单个字母,或是简短的无意义字母组合,甚至改写成“__”这样的符号,使得阅读的人无法根据名字猜测其用途。重写代码中的部分逻辑,将其变成功能上等价,但是更难理解的形式。比如将for循环改写成while循环,将循环改写成递归,精简中间变量,等等。打乱代码的格式。比如删除空格,将多行代码挤到一行中,或者将一行代码断成多行等等。
proguard.cfg
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-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
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
proguard.cfg起作用的做法很简单,就是在eclipse自动生成的default.properties文件中加上一句“proguard.config=proguard.cfg”就可以了
default.properties文件应该如下:
# 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 use,
# "build.properties", and override values to adapt the script to your
# project structure.
# Project target.
target=android-9
proguard.config=proguard.cfg
欢迎交流,进入博客网站:www.wangsong520.com进行留言交流,并且里面有更多知识分享!