反编译Android APK及防止APK程序被反编译

来源:互联网 发布:2016虎扑推荐淘宝店铺 编辑:程序博客网 时间:2024/06/08 16:04

反编译Android APK及防止APK程序被反编译

 

好久没有做android逆向工程工作,感觉自己都快忘记了。好在又碰到朋友提起,帮他找了资料。也复制一份到这里,方便自己查阅(不是自己写的哦)。

 

怎么逆向工程对AndroidApk 进行反编译

googleAndroid开发是开源的,开发过程中有些时候会遇到一些功能,自己不知道该怎么做,然而别的软件里面已经有了,这个时候可以采用反编译的方式,解开其他的程序,来了解一些它的做法,同时啊,还可以借鉴别人的软件结构,资源文件;作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用的APK进行反编译查看。

此方式主要目的是为了促进开发者学习,借鉴好的代码,提升自我开发水平。请勿去破解人家的软件或其他操作

 

反编译工具包(https://yunpan.cn/cBfRvyPqJZyrW  访问密码 b2c6)

·        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.apkemanager

 

 

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

 

获取成功后便有可以查看该应用的所有资源文件了

 

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

1.             Apk反编译得到Java源代码

下载上述工具中的dex2jarjd-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 finalandroid.os.Parcelable$Creator *;

}

proguard.cfg起作用的做法很简单,就是在eclipse自动生成的default.properties文件中加上一句“proguard.config=proguard.cfg”就可以了

default.properties文件应该如下:

 

# This file is automatically generated byAndroid Tools. #Donotmodify thisfile-- YOUR CHANGES WILL BE ERASED!# # This file must becheckedinVersion Control Systems. # #Tocustomize properties usedby the Antbuildsystemuse, #"build.properties",and overridevaluesto adaptthe scriptto your #project structure. #Project target.target=android-9 proguard.config=proguard.cfg

 

转载出处“華少 CSDN博客” http://www.cnblogs.com/stephenhuashao/p/5630448.html

 

0 0
原创粉丝点击