反编译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配置、语言资源等文件

  1. 使用apktools进行apk反编译得到程序的源代码、图片、XML配置、语言资源等文件

将需要反编译的APK文件放到该目录下,打开命令行界面(运行-CMD) ,定位到apktool文件夹,输入以下命令:

apktool.bat d -f  emanager.apk  emanager 

DOS命令

(命令中emanager.apk指的是要反编译的APK文件全名,emanager为反编译后资源文件存放的目录名称,即为:apktool.bat d -f [apk文件 ] [输出文件夹])

  • 获取成功后便有可以查看该应用的所有资源文件了
    图片
  • 如果你想将反编译完的文件重新打包成apk,那你可以:输入
    apktool.bat b emanager(你编译出来文件夹) 便可,这就不述说了。

三、Apk反编译得到Java源代码

  1. 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

DOS命令

  • 目录下会生成一个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包,也只会看到一些让人很难看懂的代码,从而达到保护代码的作用。

  1. 先介绍一下什么是代码混淆:

代码混淆(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进行留言交流,并且里面有更多知识分享!

posted @ 2016-06-30 16:33  ByteJava  阅读(6170)  评论(0编辑  收藏  举报