APK反编译图文教程
更新时间:2016-04-15 11:21:57 作者:vipra
学会反编译比较关键,也是我们美化必须掌握的技术。学习反编译也是制作ROM的开始。ROM 主机必须是反编译器。全能,给你基础和灵感,最重要的是我们可以独立创新和思考
在学习开发的过程中,你会经常学习别人的应用是如何开发的。那些精美的动画和精致的布局可能会让你爱上它们。作为一个开发者,你可能很想知道这些效果接口是怎样的。要实现,此时可以反编译查看修改后应用的APK。以下是我参考一些文章后的简单教程详细解释。
(注:反编译并不是为开发者破解和重装应用程序,主要目的是促进开发者学习,向好的代码学习,提高自身开发水平。)
测试环境:
赢 7
使用工具:
脚本之家下载地址:
(资源文件获取)下载
(源码文件获取)下载
jd-gui(源代码视图)下载
最新正式版下载地址:
(代码)
(代码)
最新版本的jd-gui(代码)请看官方
工具介绍:
功能:资源文件获取,可以提取图像文件和布局文件供使用和查看
功能:将apk反编译成java源码(.dex成jar文件)
jd-gui
功能:查看APK中.dex转换后的jar文件,即源文件
反编译过程:
一、apk反编译得到程序的源代码、图片、XML配置、语言资源等文件
下载在上面的工具中,解压得到3个文件:aapt.exe、.bat、.jar,把需要反编译的APK文件放到这个目录下,
打开命令行界面(运行 -CMD),导航到文件夹,然后输入以下命令:.bat d -f test.apk test
(命令中的test.apk是指要反编译的APK文件全名,test是存放反编译资源文件的目录名,即:.bat d -f [apk file] [输出文件夹])
表示采集成功。后来发现文件夹里有一个测试文件。点击查看应用的所有资源文件。
如果要将反编译后的文件重新打包成apk,那么可以:输入.bat b test(你编译的文件夹),效果如下:
之后,可以在之前的测试文件下再找到两个文件夹:
建造
dist(存储打包的 APK 文件)
二、Apk反编译得到Java源码
上述工具中的下载和jd-gui,解压
将要反编译的APK后缀名改为.rar或.zip,解压得到.dex文件(就是编译好的java文件,然后用dx工具打包),把得到的.dex放到之前解压的工具——0.0.9.15文件夹,
在命令行导航到.bat所在目录,输入..dex,效果如下:
改目录下会生成一个.jar文件,然后打开工具jd-gui文件夹下的jd-gui.exe,然后用工具打开之前生成的.jar文件,就可以看到源码了编译软件下载,效果如下:
混淆效果图(类文件名和其中的方法名会以a、b、c....等命名):
三、 图形反编译apk(我没用过)
以上步骤一、2描述了apk的命令行反编译,现提供图形化反编译工具:
一、下载上面的反编译工具包,打开目录,双击反编译工具.exe,可以浏览打开要反编译的apk
通过反编译,您可以了解应用程序使用了哪些第三方库文件、其代码是如何编写的等等。
但是如果apk被混淆了,你看到的class文件名和里面的方法名会以a,b,c....风格命名,所以你可以找到你想知道的接口代码可能会很费力,而且查找代码可能看起来很费力,但会获得一个大致的概念。有了这个想法,你可以自己尝试一下。
曾经想写一个类似的名人界面布局编译软件下载,但是刚接触的时候不知道怎么写,所以反编译了。即使他的代码被混淆了,我可以看到他通过 TYPE 设置不同的 ITEM 布局是实现的。很多参考资料可能会用重写VIEW来达到效果,你可以大致了解他的开发对你的开发是无害的。
还有一个开发者辛辛苦苦开发自己的应用,被别人反编译,变成了自己的东西,所以需要混淆。
作为一个应用开发者,你不得不面对一个尴尬的局面,那就是你辛辛苦苦开发的应用,很容易被别人反编译。
好像也发现了这个问题。从SDK2.3开始,我们可以看到-sdk-\tools\下多了一个文件夹
它是一个java代码混淆工具。即使别人反编译你的apk包,也只会看到一些难以理解的代码,从而保护代码。
下面说说如何让SDK2.3下的.cfg文件生效。我们先看一下-sdk-\tools\lib\.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; } -keepclasseswithmembernames class * { public (android.content.Context, android.util.AttributeSet); } -keepclasseswithmembernames class * { public (android.content.Context, android.util.AttributeSet, int); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; }
从脚本中可以看出,继承自 , , , , 和 com.... 的基本组件都保留在混淆中。
并且保留了所有的变量名和类名,所有的类都是具有固定参数格式、枚举等的构造函数的一部分。(详情请参考
/ 中的示例和注释。)
使.cfg 工作的方法很简单,只需在自动生成的.file 中添加一句“.=.cfg”。
完整的 .file 应如下所示:
# 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
大功告成,正常的编译签名可以防止代码被反编译。
发表评论