android apk包反编译、破解心得
来源:互联网 发布:javascript代码规范 编辑:程序博客网 时间:2024/04/19 13:35
研究Android近一个月了,总体上来说还是比较容易上手,而且相关的资源也还算丰富。然而一些觉得不错的应用,没有提供源码,想深入研究一下实现原理就只有采用反编译、破解的办法了。网上讲破解方法的文章很多,但大多是转载的,大同小异,而且不怎么完整,这里总结三种方法,供学习研究,分享如下。首先,用WinRAR解压apk包,会得到包目录、classes.dex等文件,之后按以下操作:
一、dexdump方法
dexdump是emulator自带提供的查看dex文件的工具,可使用类似这样的命令将dex文件dump到txt文件中:
D:/Program Files/android-sdk-windows-1.6_r1/platforms/android-1.6/tools>dexdump.exe -d classes.dex > spk.dump.txt
得到的文件内容,描述了类的信息,但实在是不好读啊~~~~
二、dex2jar + XJad 方法
该方法是使用dex2jar.jar包,将classes.dex文件解包成jar,在通过XJad(或者其他class反编译工具)进行java反编译。如:
1、dex2jar.bat d:/play/classes.dex
默认的输出路径同classes.dex,生成的文件名为classes.dex.dex2jar.jar
2、使用XJad反编译该jar包
之后的使用方法,大家都懂的:)
该方法的好处在于,通过XJad反编译后,大家可直接开到java源文件,缺点在于只能反编译出开发时的java文件,而开发时使用的lib包不能反编译出来。
三、AXMLPrinter2.jar + baksmali.jar + smali.jar 方法
这个方法就强大了,AXMLPrinter2是还原AndroidManifest.xml和main.xml的工具,直接打开这两个xml文件是乱码,而通过还原之后,可以很明白的看到里面的内容(我猜测还是使用了字节异或的方式加的密)。
baksmali.jar是反解析dex的工具,smali.jar则是再还原成dex的工具
操作方式如下:
1、java -jar AXMLPrinter2.jar D:/play/AndroidManifest.xml > AndroidManifest.txt
2、java -jar AXMLPrinter2.jar D:/play/res/layout/main.xml > main.txt
3、java -jar baksmali-1.2.5.jar -o classout/ d:/play/classes.dex
baksmali可解析(注意,是解析,不是反编译)原java包以及引用的lib包,解析出的文件认真看还是能看懂,比如以下片段:
- .class Lcom/paul/test/a;
- .super Landroid/view/View;
- # static fields
- .field private static final a:Landroid/graphics/Typeface;
- # instance fields
- .field private b:I
- .field private c:I
- .field private d:Z
- .field private e:J
- .field private f:I
- .field private l:[Ljava/lang/String;
- # direct methods
- .method static constructor <clinit>()V
- .registers 2
- sget-object v0, Landroid/graphics/Typeface;->SANS_SERIF:Landroid/graphics/Typeface;
- const/4 v1, 0x0
- invoke-static {v0, v1}, Landroid/graphics/Typeface;->create(Landroid/graphics/Typeface;I)Landroid/graphics/Typeface;
- move-result-object v0
- sput-object v0, Lcom/wiyun/ad/a;->a:Landroid/graphics/Typeface;
- return-void
- .end method
- #
- # other methods ..........
- #
- # virtual methods
- .method public onKeyUp(ILandroid/view/KeyEvent;)Z
- .registers 4
- const/16 v0, 0x42
- if-eq p1, v0, :cond_8
- const/16 v0, 0x17
- if-ne p1, v0, :cond_b
- :cond_8
- invoke-direct {p0}, Lcom/paul/test/a;->d()V
- :cond_b
- const/4 v0, 0x0
- invoke-virtual {p0, v0}, Lcom/paul/test/a;->setPressed(Z)V
- invoke-super {p0, p1, p2}, Landroid/view/View;->onKeyUp(ILandroid/view/KeyEvent;)Z
- move-result v0
- return v0
- .end method
认真一看,就知道:
# static fields 定义静态变量的标记
# instance fields 定义实例变量的标记
# direct methods 定义静态方法的标记
# virtual methods 定义非静态方法的标记
以onKeyUp方法为例,其中定义了处理逻辑,if-eq p1, v0, :cond_8 表示如果p1和v0相等,则执行cond_8的流程:
:cond_8
invoke-direct {p0}, Lcom/paul/test/a;->d()V
调用com.paul.test.a的d()方法
不相等: if-ne p1, v0, :cond_b 则执行cond_b的流程:
:cond_b
const/4 v0, 0x0
invoke-virtual {p0, v0}, Lcom/paul/test/a;->setPressed(Z)V
invoke-super {p0, p1, p2}, Landroid/view/View;->onKeyUp(ILandroid/view/KeyEvent;)Z
move-result v0
大概意思就是调用com.paul.test.a的setPressed方法,然后再调用父类View的onKeyUp方法
最后 return v0
该方法,能把外部引用的lib包类也解析出来,能开到包的全貌。缺点在于,解析出的smali文件并不是反编译出的java文件,可读性降低了,但仔细研究也能看出大概。
以上提到的相关工具包,均可在http://code.google.com上下载到。
- android apk包反编译、破解心得
- android apk包反编译、破解心得
- android apk包反编译、破解心得
- Android apk反编译心得
- android apk 包反编译
- apk包的破解与反编译
- Android项目APK包反编译
- Android的apk包反编译
- Apk文件破解反编译
- Apk文件破解反编译
- Apk文件破解反编译
- 反编译Android的apk包得到源码
- 反编译Android的apk包得到源码
- Android应用apk包如何反编译?
- Android apk安装包反编译过程
- Android 对打包的 apk 进行反编译
- android,解包,打包。apk反编译
- Android 安装包apk反编译方法简介
- C#的封装、继承和多态
- Android 今日收获
- Netra(DM8168)基于Rdk平台的软件框架设计
- 项目5点结构体与枚举
- 02周:项目二:结构体应用:有序的结构体数组。
- android apk包反编译、破解心得
- Servlet编程之自定义标签
- Device Tree
- QT UI编程细节(待续)
- 如何用JavaScript实现类似于ListBox功能
- 软工文档总结
- SaeMysql l类
- 02周:项目三:文件加结构体实现系统
- 讨厌的人吗