Android 反编译dex2&jd-gui&apktool教程
- 格式:docx
- 大小:12.77 KB
- 文档页数:1
android技巧:apk文件反编译以及签名打包(dex2jar&jd,apktool,apk-sign)通过dex2jar和jd我们可以反编译apk中的dex,可以比较完美的查看java源文件;通过apktool可以反编译apk中的xml等资源文件,然后通过apk-sign签名,可以制作成修改版的可发布apk文件。
1.dex2jar反编译dex文件:a.下载文件见附件:apktool-1.3.1.tar.bz2,jd-gui.zip,或点击这里下载;解压;b.把apk文件后缀名改为.zip,然后解压缩其中的class.dex文件,它是java文件编译再通过dx工具打包成的,所以现在我们就用上述提到的2个工具来逆方向导出java源文件;c.把class.dex拷贝到dex2jar.bat所在目录,运行dex2jar.bat class.dex,生成classes.dex.dex2jar.jar ;d.运行jd-gui工具(绿色无须安装),打开上面生成的jar文件,即可看到源代码;2.apktool反编译xml等资源文件:a.安装java环境,下载文件件附件:apktool-1.3.1.tar.bz2,apktool-install-windows-2.2_r01-2.tar.bz2,或点击这里下载;把这两个文件解压到同一目录下,该目录下cmd中运行apktool获得帮助信息;b.apktool d XXX.apk ABC 反编译XXX.apk到文件夹ABCc.apktool b ABC 从反编译后的文件夹ABC重建APK,输出到ABC\dist\out.apkd.这样我们就可以把远apk文件通过反编译后,然后对里面资源文件作修改,然后再重建为apk即可;3.apk-sign签名apk文件:a.下载文件件附件apk-sign.rar,解压到apk-sign文件夹;b.将XXX.apk文件解压到XXX文件夹,然后将XXX直接拖到apk-sign文件中的sign_pack.bat批处理文件上以执行,弹出cmd执行窗口,等待执行完即可;c.生成新文件夹XXX_signed中的apk文件即为已签名;apktool用法C:\Documents and Settings\Administrator>cd e:E:\C:\Documents and Settings\Administrator>e:E:\>cd android_devE:\android_dev>cd apk反编译E:\android_dev\apk反编译>apktool.batApktool v1.3.2 - a tool for reengineering Android apk filesCopyright 2010 Ryszard Wi?niewski <brut.alll@>Apache License 2.0 (/licenses/LICENSE-2.0) Usage: apktool [-v|--verbose] COMMAND [...]COMMANDs are:d[ecode] [OPTS] <file.apk> [<dir>]Decode <file.apk> to <dir>.OPTS:-s, --no-srcDo not decode sources.-r, --no-resDo not decode resources.-d, --debugDecode in debug mode. Check project page for more info.-f, --forceForce delete destination directory.-t <tag>, --frame-tag <tag>Try to use framework files tagged by <tag>.--keep-broken-resUse if there was an error and some resources were dropped, e.g.:"Invalid config flags detected. Dropping resources", but you want to decode them anyway, even with errors. You will have tofix them manually before building.b[uild] [OPTS] [<app_path>] [<out_file>]Build an apk from already decoded application located in<app_path>.It will automatically detect, whether files was changed and performneeded steps only.If you omit <app_path> then current directory will be used.If you omit <out_file> then<app_path>/dist/<name_of_original.apk>will be used.OPTS:-f, --force-allSkip changes detection and build all files.-d, --debugBuild in debug mode. Check project page for more info.if|install-framework <framework.apk> [<tag>]Install framework file to your system.For additional info, see: /p/android-apktool/ E:\android_dev\apk反编译>。
Android是个神奇的货,近两年比较火热,学习他的人也比较多,但是对于很多初学者来说比较头疼,(当然本人也很菜鸟),今天在学习一个安卓项目时,苦于找不到源代码,无奈只好下载网上现成的.apk文件,顿时好奇能不能反编译看到源代码呢?答案是肯定的!让我们行动起来!
首先,我们将文件的后缀名改为.zip。
这时候我们将可以解压这个文件,如图:
此处我们已经看到一个压缩文件了,打开它。
注意我们的重点是.dex 文件
这个classes.dex是个好东西呀!
然后,然后……
我们需要下两个软件:
dex2jar下载地址:/p/dex2jar/
JD-GUI下载地址:http://java.decompiler.free.fr/?q=jdgui
把我们刚找到的classes.dex拷贝到dex2jar的目录下吧(与dex2jar.bat在同一个目录下),然后运行dex2jar.bat classes.dex,将会生成一个文件classes_dex2jar.jar。
快OK 啦~~~~
运行jd-gui.exe 直接将classes_dex2jar.jar 拖进去吧,瞧!我们要的出来了!。
菜鸟夜谈android反编译⼯具:反编译命令提取资源(smail汇编代码):apktool d file.apk pathdex2jar反编译:dex2jar file.apk (or classes.dex)⽤jd-gui就可以打开jar看了⽤jd-gui在windows下没问题,在linux64下要装ia32的库。
⼀般代码都被混淆过。
都是abcdefg。
下⾯讲讲本⼈的⼀些⼩技巧。
本⼈最近反编译⼀个aide,菜鸟抄抄别⼈的实现。
⼀般都是从布局⼊⼿,找出相应关键的view类:如<com.aide.ui.AIDEEditorPager 。
可以在代码⽂件⾥找到AIDEEditorPager这个类,下⾯贴点代码:package com.aide.ui;import android.content.Context;import android.graphics.Rect;import android.os.Build.VERSION;import android.support.v4.view.ViewPager;import android.support.v4.view.aa;import android.util.AttributeSet;import youtInflater;import android.view.MotionEvent;import android.view.View;import mon.c;import com.aide.engine.SyntaxError;import com.aide.ui.util.k;import ng.reflect.Field;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import rg;import rh;import ri;public class AIDEEditorPagerextends ViewPagerimplements ri{private boolean DW;private f FH;private boolean Hw;private List j6 = new ArrayList();private l v5;public AIDEEditorPager(Context paramContext){super(paramContext);sG();}public AIDEEditorPager(Context paramContext, AttributeSet paramAttributeSet){super(paramContext, paramAttributeSet);sG();}private void DW(boolean paramBoolean){int i = 4;View localView1 = getRootView();int j;View localView3;if (localView1 != null){View localView2 = localView1.findViewById(2131427448);if (localView2 != null){if (!paramBoolean) {break label62;}j = 0;localView2.setVisibility(j);}localView3 = localView1.findViewById(2131427446);if (localView3 != null) {if (!paramBoolean) {break label68;}}}for (;;){localView3.setVisibility(i);return;label62:j = i;break;label68:i = 0;}}private int Hw(String paramString){for (int i = 0;; i++){if (i >= this.j6.size()) {i = -1;}while (v5(i).d_().equals(paramString)) {return i;}}}private void Sf(){postDelayed(new Runnable(){public void run(){AIDEEditorPager.DW(AIDEEditorPager.this).v5();}}, 50L);}这么乱的代码,想找到⾃⼰想要的代码真是不容易。
Android开发apk反编译和⼆次打包教程作为Android开发者,⼯作中少不了要反编译别⼈的apk,当然主要⽬的还是为了学习到更多,取彼之长,补⼰之短。
今天就来总结⼀下Android反编译和⼆次打包的⼀些知识。
⾸先声明本⽂的⽬的是为了通过例⼦讲解反编译和⼆次打包的原理和⽅法,继⽽作为后续讲解防⽌⼆次打包和App安全的依据,并不是⿎励⼤家去重新打包别⼈的App,盗取他⼈劳动成果。
本⽂⾸先介绍⼏种Android反编译⼯具的使⽤,然后实现在不需要知道源代码的情况下,仅通过修改反编译得到的smali⽂件实现修改apk逻辑功能的⽬的。
Android中常⽤的反编译⼯具有三个:dex2jar、jd-gui和apktool,这三个⼯具的作⽤如下:dex2jar:将apk中的classes.dex⽂件转换成jar⽂件。
jd-gui:查看由dex2jar转换成的jar⽂件,以界⾯的形式展⽰反编译出来的Java源代码。
apktool:反编译⽣成smali字节码⽂件,提取apk中的资源⽂件。
为了尽可能的把问题讲清楚,我们来实现⼀个很简单的例⼦。
⾸先创建⼀个⼯程DecompileDemo,在MainActivity中定义⼀个布局,其中包含⼀个Button,点击会打印⼀段⽇志。
public class MainActivity extends AppCompatActivity implements View.OnClickListener {private static final String TAG = "MainActivity";private Button btn;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);btn = (Button) findViewById(R.id.btn);btn.setOnClickListener(this);}@Overridepublic void onClick(View v) {Log.d(TAG,"Button is clicked");}}将这个⼯程编译⽣成的apk解压,取出其中的classes.dex放在dex2jar⼯具的⽬录下,然后执⾏命令会在当前⽬录下⽣成class-dex2jar.jar⽂件然后打开jd-gui,将class-dex2jar.jar⽂件拖进去,就可以看到反编译出来的源代码。
Android逆向⼯具篇—反编译⼯具的选择与使⽤作者 | 天天记⼩本⼦上的lilac 来源 | CSDN今天给⼤家介绍⼀下Android App 在Java层的逆向⼯具。
逆向⼯具的介绍在过去,当我们想要了解⼀个 app 内部运作细节时,往往先通过 ApkTool 反编译 APK,⽣成 smali 格式的反汇编代码[1],然后⼤佬和⽼⼿直接阅读 smali 代码,适当的进⾏修改、插桩、调试,经过⼀定的经验和猜想,理解程序的运⾏逻辑和加解密细节,⽐如如下的 smali 代码。
smail我们只要先这样,再那样,最后再这样,对对对,就这样,⼀个程序的加密就被破解出来了。
是不是迫不及待想来⼀次App的逆向之旅了?事实上,这种⽅式对⼩⽩实在不友好,有没有更加友好的⽅式呢?当然是有的,如果你百度或者 google 搜索逆向相关的教程和分享,很容易就会发现下⾯这三个⼯具。
在介绍⼯具之前,我们先补充⼀下APK结构的知识,我们以伊对这个社交 Apk 为例。
APK ⽂件其实是⼀种特殊的 zip 格式,我们可以直接⽤ 360 压缩或者别的压缩⼯具打开。
为了满⾜⾃⾝的功能和设计,⼏乎每⼀个都会在基础的⽂件结构上添加不少东西,但有六个部分是不变的,我们罗列和称述⼀下。
⽂件或⽬录作⽤META-INF/描述apk包信息的⽬录,主要存放了签名信息,配置信息,service注册信息res/存放apk资源⽂件的⽬录,⽐如图⽚、图标、字符串、样式、颜⾊assets/同样是存放apk资源⽂件的⽬录,但和res有差异,和我们关系不⼤resources.arsc资源索引,包含不同语⾔环境中res⽬录下所有资源的类型、名称与ID所对应的信息lib/存放so⽂件,越来越多的应⽤由C/C++编写核⼼代码,以SO⽂件的形式供上层JAVA代码调⽤,以保证安全性,这个⽬录是逆向解密关注的重点classes.dex(⼀个或数个)Android程序运⾏在Dalvik虚拟机上,⽽dex就是Dalvik虚拟机的可执⾏⽂件, 相当于Windows平台中的exe⽂件,通过反编译dex,可以获得apk源码(这个说法不很准确,但⽅便理解)AndroidManifest.xml清单⽂件,包含了App⼤量的的配置信息,⽐如包名、应⽤需要拥有的权限(打电话/录⾳/⽹络通信等等)、以及所有的界⾯和程序组件的信息,⽆法解压apk时直接打开,因为清单⽂件在apk打包过程中被编译成了⼆进制格式⽂件接下来我们介绍以下反编译⼯具,看⼀下反编译⼯具的作⽤⼯具作⽤ApkTool解析resources.arsc,AndroidManifest.xml等⽂件,反编译dex⽂件为smali源码Dex2jar将dex⽂件转化为jar⽂件Jd-gui反编译jar,查看java源码⽐如使⽤ Dex2jar+Jd-gui, 最终得到这样的结果。
详解Android的反编译和代码混淆前⾔包括以下内容1. 要反编译apk需要下⾯3个⼯具2. 反编译资源⽂件3. 反编译类⽂件4. 代码混淆要反编译apk需要下⾯3个⼯具1、apktool(资源⽂件获取)作⽤:资源⽂件获取,可以提取图⽚⽂件和布局⽂件进⾏使⽤查看2、dex2jar(源⽂件获取)作⽤:将APK反编译成java源码(classes.dex转化成jar⽂件)3、jd-gui作⽤:查看APK中classes.dex转化成的jar⽂件,即源码⽂件下⾯进⾏反编译资源⽂件和类⽂件:反编译资源⽂件资源⽂件:包括图⽚资源、布局资源、动画、样式等其他资源这样资源⽂件都可以看得到了。
反编译类⽂件⽅式⼀:反编译得到Java类1.下载并解压dex2jar-2.0,得到dex2jar-2.0⽂件夹,⾥⾯包含dex2jar.bat及其⽂件2.将apk⽂件改为xx.zip⽂件,并解压得到classes.dex⽂件,并将其复制到dex2jar-2.0⽂件夹中3⽣成⼀个classes-dex2jar.jar⽂件,使⽤jd-gui.exe打开⽣成的classes-dex2jar.jar⽂件⽅式⼆:直接使⽤smali2java⼯具什么是smali?smali是将Android字节码⽤可阅读的字符串形式表现出来的⼀种语⾔,可以称之为Android字节码的反汇编语⾔。
代码混淆只能混淆java类,不能混淆资源⽂件。
系统定义的组件不能混淆。
必须是导出的apk。
如何实现代码混淆混淆类⽂件修改module:app下的build.gradlebuildTypes {release {//是否需要混淆,默认false代表不混淆,true代表混淆minifyEnabled true//混淆需要⽤到的⼀个⼯具:proguard,对应的⼀个⽂件是:proguard-android.txt(这个⽂件在android-sdk \tools\proguard⽬录下)//proguard是⼀个压缩、优化和混淆Java字节码⽂件的免费⼯具proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}在proguard-rules.pro中添加:把下⾯代码,放⼊proguard-rules.pro⽂末:#指定代码的压缩级别-optimizationpasses 5#包明不混合⼤⼩写-dontusemixedcaseclassnames#不去忽略⾮公共的库类-dontskipnonpubliclibraryclasses#优化不优化输⼊的类⽂件-dontoptimize#预校验-dontpreverify#混淆时是否记录⽇志-verbose# 混淆时所采⽤的算法-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*#保护注解-keepattributes *Annotation*# 保持哪些类不被混淆-keep public class * extends android.app.Fragment-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#如果有引⽤v4包可以添加下⾯这⾏-keep public class * extends android.support.v4.app.Fragment#忽略警告-ignorewarning##记录⽣成的⽇志数据,gradle build时在本项⽬根⽬录输出###apk 包内所有 class 的内部结构-dump class_files.txt#未混淆的类和成员-printseeds seeds.txt#列出从 apk 中删除的代码-printusage unused.txt#混淆前后的映射-printmapping mapping.txt########记录⽣成的⽇志数据,gradle build时在本项⽬根⽬录输出-end###### #####混淆保护⾃⼰项⽬的部分代码以及引⽤的第三⽅jar包library########-libraryjars libs/umeng-analytics-v5.2.4.jar#三星应⽤市场需要添加:sdk-v1.0.0.jar,look-v1.0.1.jar#-libraryjars libs/sdk-v1.0.0.jar#-libraryjars libs/look-v1.0.1.jar#如果不想混淆 keep 掉-keep class com.lippi.recorder.iirfilterdesigner.** {*; }#友盟-keep class com.umeng.**{*;}#项⽬特殊处理代码#忽略警告-dontwarn com.lippi.recorder.utils**#保留⼀个完整的包-keep class com.lippi.recorder.utils.** {*;}-keep class com.lippi.recorder.utils.AudioRecorder{*;}#如果引⽤了v4或者v7包-dontwarn android.support.**####混淆保护⾃⼰项⽬的部分代码以及引⽤的第三⽅jar包library-end####-keep public class * extends android.view.View {public <init>(android.content.Context);public <init>(android.content.Context, android.util.AttributeSet);public <init>(android.content.Context, android.util.AttributeSet, int);public void set*(...);}#保持 native ⽅法不被混淆-keepclasseswithmembernames class * {native <methods>;}#保持⾃定义控件类不被混淆-keepclasseswithmembers class * {public <init>(android.content.Context, android.util.AttributeSet);}#保持⾃定义控件类不被混淆-keepclassmembers class * extends android.app.Activity {public void *(android.view.View);}#保持 Parcelable 不被混淆-keep class * implements android.os.Parcelable {public static final android.os.Parcelable$Creator *;}#保持 Serializable 不被混淆-keepnames class * implements java.io.Serializable#保持 Serializable 不被混淆并且enum 类也不被混淆-keepclassmembers class * implements java.io.Serializable {static final long serialVersionUID;private static final java.io.ObjectStreamField[] serialPersistentFields;!static !transient <fields>;!private <fields>;!private <methods>;private void writeObject(java.io.ObjectOutputStream);private void readObject(java.io.ObjectInputStream);ng.Object writeReplace();ng.Object readResolve();}#保持枚举 enum 类不被混淆如果混淆报错,建议直接使⽤上⾯的 -keepclassmembers class * implements java.io.Serializable即可#-keepclassmembers enum * {# public static **[] values();# public static ** valueOf(ng.String);#}-keepclassmembers class * {public void *ButtonClicked(android.view.View);}#不混淆资源类-keepclassmembers class **.R$* {public static <fields>;}#避免混淆泛型如果混淆报错建议关掉#–keepattributes Signature#移除log 测试了下没有⽤还是建议⾃⼰定义⼀个开关控制是否输出⽇志#-assumenosideeffects class android.util.Log {# public static boolean isLoggable(ng.String, int);# public static int v(...);# public static int i(...);# public static int w(...);# public static int d(...);# public static int e(...);#}#如果⽤⽤到Gson解析包的,直接添加下⾯这⼏⾏就能成功混淆,不然会报错。
Android APK反编译详解(附图)分类:Android 2011-08-28 22:42 29996人阅读评论(31) 收藏举报这段时间在学Android应用开发,在想既然是用Java开发的应该很好反编译从而得到源代码吧,google了一下,确实很简单,以下是我的实践过程。
在此郑重声明,贴出来的目的不是为了去破解人家的软件,完全是一种学习的态度,不过好像通过这种方式也可以去汉化一些外国软件。
一、反编译Apk得到Java源代码首先要下载两个工具:dex2jar和JD-GUI前者是将apk中的classes.dex转化成Jar文件,而JD-GUI是一个反编译工具,可以直接查看Jar包的源代码。
以下是下载地址:dex2jar:/files/dex2jar-0.0.7-SNAPSHOT.zipJD-GUI:/files/jdgui.zip具体步骤:首先将apk文件,将后缀改为zip,解压,得到其中的classes.dex,它就是java 文件编译再通过dx工具打包而成的;解压下载的dex2jar,将classes.dex复制到dex2jar.bat所在目录。
在命令行下定位到dex2jar.bat所在目录运行dex2jar.bat classes.dex生成classes.dex.dex2jar.jar生成jar文件的截图如下:运行JD-GUI(jd-gui.exe),打开上面生成的jar包,即可看到源代码了HelloAndroid源码(编译前的apk源码对照)如下:二、反编译apk生成程序的源代码和图片、XML配置、语言资源等文件如果是只是汉化软件,这将特别有用。
首先还是下载工具,这次用到的是apktool下载地址:/p/android-apktool/downloads/list下载:apktool1.4.1.tar.bz2和apktool-install-windows-r04-brut1.tar.bz2(两个包都下载)具体步骤:将下载的两个包解压到同一个文件夹下,应该会有三个文件:aapt.exe,apktool.bat,apktool.jar在命令行下定位到apktool.bat文件夹,输入以下命令:apktool d C:\*.apk C:\*文件夹,如下图:命令行解释:apktool d [apk文件 ] [输出文件夹]反编译的文件如下(AndroidManifest.xml为例):特别注意:你要反编译的文件一定要放在C盘的根目录里将反编译完的文件重新打包成apk,很简单,输入apktool b c:\***文件夹(你编译出来文件夹)即可,命令如下:打包apk后的文件在目录C:\HelloAndroid下,生成了两个文件夹:builddist其中,打包生成的HelloAndroid.apk,在上面的dist文件夹下,Ok注:本android反编译教程,是在Windows 7 Ultimate 64bit ,测试通过上述反编译工具包下载另外,作为应用开发者,肯定不希望自己的代码被反编译的,下一遍博客中讲述如何通过混淆代码放在反编译:Android如何防止apk程序被反编译。
1、baksmali:classes.dex反编译为smali格式(smali:smali格式编译打包为classes.dex,但由于smali格式类似汇编,比较难阅读,所以用dex2jar进行辅助)2、dex2jar:classes.dex转为jar包3、jdgui:jar反编译并阅读操作顺序:apk用zip解开,里面的classes.dex分别用baksmali处理为smali,用dex2jar 处理成jar,然后用jdgui看代码,找好java文件中要改的位置后,在smali 里找对应的位置修改,改完了用smali再编译为classes.dex,覆盖原来apk里的同名文件,最后重新签名。
注意安装时要先删除原来手机里的版本,因为签名不同。
1、apk用zip解开,得到classes.dex2、用baksmali处理为smali(只是反编译看代码就不需要这一步,修改才用) java -jar baksmali-1.4.1.jar -x classes.dex得到out目录,里面是smali文件3、用dex2jar处理classes.dex为jar包dex2jar.bat classes.dex得到classes.dex.dex2jar.jar4、用jdgui打开classes.dex.dex2jar.jar好了,可以看代码,但还不能直接修改,需要对比着来修改smali文件改好后,用java -jar smali-1.2.6.jar -o classes.dex out得到修改后的classes.dex,用这个文件替换fishing_joy_1.apk中的同名文件但这个apk是不能用的,还没有进行重新签名先用keytool生成keystorekeytool -genkey -keystore mykeystore -alias mykeystore -validity 999 把apk中的META-INF删除,再用jarsigner 签名jarsigner -verbose -keystore mykeystore -signedjar fishing_joy_1_signed.apk fishing_joy_1.apk mykeystore先卸载原来手机中安装的这个游戏,再用fishing_joy_1_signed.apk安装最后工作目录是这个样子。
安卓apk反编译查看源代码
相信很多初学者很像看看大公司比如jd,qq,淘宝手机端的商城是如何开发的,对于java开发的系统来说,大家都知道,反编译是容易的事情,如果换成android的,安装文件变成apk,那么又是什么情况了
带着好奇,我googl e了一下,分享一下:
反编译apk文件,得到其源代码的方法!!
dex2jar和JD-GUI这2个工具配合学习android太靠谱了,所以放上来给大家共享,开源的好处就是好东西大家一起分享。
dex2jar下载地址:http://laichao.googl /fil es/dex2jar-0.0.7-SNAPSHOT.zip
JD-GUI下载地址:http://cod e.googl /p/dex2jar/ 请下载最新版的,旧版本有bug
1.首先找到Android软件安装包中的classes.dex
方法是把apk文件改名为.zip,然后解压缩其中的classes.dex文件,它就是java文件编译再通过dx工具打包成的,所以现在我们就用上述提到的2个工具来逆方向导出java源文件
2.把classes.dex拷贝到dex2jar.bat所在目录。
windows系统下:
在命令行模式下定位到dex2jar.bat所在目录,运行dex2jar.bat classes.dex ,生成classes.dex.dex2jar.jar linux、Ubuntu系统下:在终端下定位到dex2jar.sh所在目录,运行
sh dex2jar.sh classes.dex
则可生成classes.dex.dex2jar.jar
3.运行JD-GUI工具(它是绿色无须安装的)
打开上面的jar文件,即可看到源代码
来源:清源教育。
息,但实在是不好读啊~~~~二、dex2jar + XJad 方法该方法是使用dex2jar.jar包,将classes.dex文件解包成jar,在通过XJad(或者其他class反编译工具)进行java反编译。
如:1、dex2jar.bat d:\play\classes.dex默认的输出路径同classes.dex,生成的文件名为classes.dex.dex2jar.jar2、使用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.txt2、java -jar AXMLPrinter2.jar D:\play\res\layout\main.xml > main.txt3、java -jar baksmali-1.2.5.jar -o classout/ d:\play\classes.dexbaksmali可解析(注意,是解析,不是反编译)原java包以及引用的lib包,解析出的文件认真看还是能看懂,比如以下片段:view plaincopy to clipboardprint?.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 2sget-object v0, Landroid/graphics/Typeface;->SANS_SERIF:Landroid/graphics/Typeface;const/4 v1, 0x0invoke-static {v0, v1},Landroid/graphics/Typeface;->create(Landroid/graphics/Typeface;I)Landroid/graphics/Typeface;move-result-object v0sput-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 4const/16 v0, 0x42if-eq p1, v0, :cond_8const/16 v0, 0x17if-ne p1, v0, :cond_b:cond_8invoke-direct {p0}, Lcom/paul/test/a;->d()V:cond_bconst/4 v0, 0x0invoke-virtual {p0, v0}, Lcom/paul/test/a;->setPressed(Z)Vinvoke-super {p0, p1, p2}, Landroid/view/View;->onKeyUp(ILandroid/view/KeyEvent;)Z move-result v0return v0.end method.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 2sget-object v0, Landroid/graphics/Typeface;->SANS_SERIF:Landroid/graphics/Typeface;const/4 v1, 0x0invoke-static {v0, v1},Landroid/graphics/Typeface;->create(Landroid/graphics/Typeface;I)Landroid/graphics/Typeface;move-result-object v0sput-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 4const/16 v0, 0x42if-eq p1, v0, :cond_8const/16 v0, 0x17if-ne p1, v0, :cond_b:cond_8invoke-direct {p0}, Lcom/paul/test/a;->d()V:cond_bconst/4 v0, 0x0invoke-virtual {p0, v0}, Lcom/paul/test/a;->setPressed(Z)Vinvoke-super {p0, p1, p2}, Landroid/view/View;->onKeyUp(ILandroid/view/KeyEvent;)Zmove-result v0return v0.end method认真一看,就知道:# static fields 定义静态变量的标记# instance fields 定义实例变量的标记# direct methods 定义静态方法的标记# virtual methods 定义非静态方法的标记以onKeyUp方法为例,其中定义了处理逻辑,if-eq p1, v0, :cond_8 表示如果p1和v0相等,则执行cond_8的流程::cond_8invoke-direct {p0}, Lcom/paul/test/a;->d()V调用com.paul.test.a的d()方法不相等:if-ne p1, v0, :cond_b 则执行cond_b的流程::cond_bconst/4 v0, 0x0invoke-virtual {p0, v0}, Lcom/paul/test/a;->setPressed(Z)Vinvoke-super {p0, p1, p2}, Landroid/view/View;->onKeyUp(ILandroid/view/KeyEvent;)Zmove-result v0大概意思就是调用com.paul.test.a的setPressed方法,然后再调用父类View的onKeyUp方法最后return v0该方法,能把外部引用的lib包类也解析出来,能开到包的全貌。
Android开发学习总结(六)——APK反编译 学习和开发Android应⽤有⼀段时间了,今天写⼀篇博客总结⼀下Android的apk⽂件反编译。
我们知道,Android应⽤开发完成之后,我们最终都会将应⽤打包成⼀个apk⽂件,然后让⽤户通过⼿机或者平板电脑下载下来进⾏安装。
正常情况下,Android应⽤打包成apk之后,就⽆法再看到开发这个应⽤时使⽤的资源⽂件以及代码了。
但是我们通过⽹上提供了⼀些⼯具,还是可以将apk进⾏反编译的,apk反编译之后,我们就可以看到开发这个应⽤使⽤的资源⽂件(图⽚)、layout、样式、相关的实现代码等,apk反编译也算是Android开发中⼀个⽐较实⽤的技巧吧,当我们对别⼈开发好的应⽤感兴趣时,我们就可以通过这种技术⼿段将别⼈打包好的apk进⾏反编译,继⽽可以看到我们感兴趣的内容,(注:反编译不是让各位开发者去对⼀个应⽤破解搞重装什么的,主要⽬的是为了促进开发者学习,借鉴好的代码,提升⾃我开发⽔平。
)下⾯就来说说如何将⼀个apk反编译出来。
⼀、准备必要⼯具 ⼯欲善其事,必先利其器,⾸先我们要下载好反编译apk时需要的相关⼯具1.1、使⽤⼯具1. apktool (资源⽂件获取)2. dex2jar(源码⽂件获取)3. jd-gui (源码查看)1.2、⼯具介绍 apktool 作⽤:资源⽂件获取,可以提取出图⽚⽂件和布局⽂件进⾏使⽤查看 dex2jar 作⽤:将apk反编译成java源码(classes.dex转化成jar⽂件) jd-gui 作⽤:查看APK中classes.dex转化成出的jar⽂件,即源码⽂件1.3 apktool下载地址: 下载好之后得到⼀个如下图所⽰的jar⽂件 dex2jar下载地址: 下载完成之后,得到⼀个如下图所⽰的压缩包 jd-gui下载地址: 下载完成之后,得到⼀个如下图所⽰的压缩包: 到此,需要使⽤到的3个相关⼯具都下载好了,在这⾥说明⼀下jd-gui的下载,我从官⽅⽹站上点击下载时会经常出现如下图所⽰的问题 但是多试⼏次⼜可以下载了,所以如果有遇到这个问题的朋友们不妨多试⼏次,或者从别的地⽅下载jd-gui,jd-gui算是做Java开发的⼀个必备⼯具了,⽤它来将class反编译成java源代码是⾮常⽅便的,⽹上搜索⼀下⼀般都可以下载到,只不过版本不⼀定是最新的。
dex2jar用法-回复dex2jar是一个非常有用的工具,可以将Android应用程序的dex文件转换为可读的Java源文件。
在本文中,我们将向您介绍dex2jar的用法,并逐步指导您如何使用该工具。
首先,我们需要确保您已经安装了dex2jar工具。
您可以从其官方网站下载最新版本,并按照说明进行安装。
一旦您安装了dex2jar,我们就可以开始使用它了。
以下是一些常见的dex2jar用法,以及它们的功能:1. 将dex文件转换为jar文件:这是最基本的使用方式。
您可以使用以下命令将dex文件转换为jar 文件:d2j-dex2jar <input-file>.dex -o <output-file>.jar其中,<input-file>.dex 是您要转换的dex文件的路径和文件名,<output-file>.jar 是您要生成的jar文件的路径和文件名。
2. 反编译jar文件为Java源文件:一旦您将dex文件转换为jar文件,您可以使用以下命令将其反编译为Java源文件:d2j-jar2dex <input-file>.jar -o <output-file>.dex这将生成一个.dex文件,其中包含与原始应用程序相同的Java源代码。
3. 将dex文件直接转换为Java源文件:如果您想直接从dex文件中提取Java源代码,可以使用以下命令:d2j-dex2jar -f <input-file>.dex -o <output-file>.jar这将直接将dex文件转换为可读的Java源文件。
4. 使用GUI界面:dex2jar还提供了一个GUI版本,用于那些不熟悉命令行界面的用户。
您可以通过运行d2j-dex2jar.sh(Linux / Mac上的脚本)或d2j-dex2jar.bat(Windows上的批处理文件)启动GUI界面。
Android开发:APK的反编译(获取代码和资源⽂件)⼀、反编译⼯具: 1、APKTool: APKTool是由GOOGLE提供的APK编译⼯具,能够完成反编译及回编译apk的⼯作。
同时,它也有着安装反编译系统apk所需要的framework-res框架,以及清理以前反编译⽂件夹等功能。
APKTool的使⽤需要java⽀持。
2、dex2jar: dex2jar 是将android的.dex⽂件转换成Java的.class⽂件的转换⼯具,如果在转换过程中有问题的话,可以试⽤下其他的版本。
3、jd-gui: JD分为JD-GUI、JD-Eclipse两种运⾏⽅式,JD-GUI是以单独的程序的⽅式运⾏,JD-Eclipse则是以⼀个Eclipse插件的⽅式运⾏。
jd-gui只能查看,不能够将那些⽂件转换成.java⽂件。
⽂件下载地址: 提取码:eeir⼆、APKTool使⽤: 下载好的apktool⽂件夹中包含以下⽂件:aapt.exe、apktool.bat、apktool.jar、cmd.exe. 1、反编译: 将要反编译的apk⽂件复制到该⽂件夹下,打开cmd.exe,进⼊cmd中,执⾏命令:apktool.bat d hotword.apk (不复制也⾏,但是执⾏命令时要使⽤绝对路径写清apk⽂件放置的精确位置) 在apktool⽂件夹下可以看到hotword⽂件夹,⾥⾯存储的有res下的资源⽂件,和各种XML⽂件: 如果你给定的apk反编译⽂件已经存在,那么输⼊完该命令后会提⽰你,并且⽆法执⾏,需要重新修改命令加⼊-f指令: 这样会强⾏覆盖已经存在的⽂件。
2、回编译: 运⾏命令: 参数b代表回编译,hotword则是apk反编译出来的⽂件夹名。
apktool.bat d –f hotword.apkapktool.bat b hotword 回编译完成会在hotword⽂件夹⽣成⼀个dist⽂件夹和⼀个build⽂件夹,dist⽂件夹⾥⾯存放的就是回编译后不带有签名的apk⽂件,build⽂件夹⾥⾯还有⼀个apk⽂件夹,⾥⾯存放的是回编译后没有打包成apk的⽂件。
dex2oat编译dex2oat是Android中的一项重要技术,它是Android操作系统中内置的一项编译器,专门用于将Android应用程序的字节码文件(即.dex文件)编译为本地的可执行文件(即.oat文件)。
它的出现给Android应用开发者带来了极大的便利,使得应用开发者可以在Android设备上更快地运行应用程序。
1. dex2oat编译简介DEX2OAT是Android开发者使用的一种编译器,它用于将Android 应用程序的字节码文件(即.dex文件)编译为本地的可执行文件(即.oat文件)。
它的出现给Android应用开发者带来了极大的便利,使得应用开发者可以在Android设备上更快地运行应用程序。
使用dex2oat编译,可以将应用程序的字节码文件编译为Android设备上运行的本地可执行代码。
由于本地可执行代码可以更快地运行,因此使用dex2oat编译可以提高应用程序的运行性能。
2. dex2oat编译工作原理为了使用dex2oat编译,首先需要用Dex将应用程序的字节码文件(.dex文件)转换为DEX格式的文件。
然后,编译器会将DEX格式的文件转换为本地的可执行文件(.oat文件)。
编译的过程主要分为三个步骤:(1)t首先,编译器会读取dex文件并将其转换为中间表示形式。
(2)t然后,编译器会对中间表示形式的文件进行优化,以致于它可以更快地运行。
(3)t最后,编译器会将优化后的文件转换为本地可执行文件。
3. dex2oat编译的优势使用dex2oat编译可以带来以下优势:(1)t降低了应用程序启动时间:dex2oat编译可以将应用程序的字节码文件转换为本地可执行文件,从而可以降低应用程序启动时间。
(2)t提高了应用程序的运行性能:dex2oat编译可以对应用程序的字节码文件进行优化,以致于它可以更快地运行,从而可以提高应用程序的运行性能。
(3)t减少了内存占用空间:dex2oat编译可以将应用程序的字节码文件转换为更小的本地可执行文件,从而可以减少内存占用空间。
dex2oat编译Android系统专为移动设备而设计,它在每个设备上对每个应用程序进行了优化,使应用程序的执行在设备上达到最佳效果。
DEX2OAT 编译器是Android系统的一个组件,它可以将APK文件中的.dex文件(Dalvik Executable)编译为ART二进制文件(Android Runtime),从而方便应用在设备上运行,同时还可以极大地提高运行速度。
DEX2OAT编译器主要由四个模块组成,分别是汇编器,编译器,资源编译器和优化器。
汇编器可以将Java字节码汇编成.dex文件,这也是Android Studio集成环境中生成APK包的第一步;编译器将.dex文件编译为.oat文件,这个文件会在设备中运行;资源编译器会将资源文件编译为Android的库文件(.so);最后,优化器将代码进行优化,以提高执行效率。
DEX2OAT编译器在Android 5.0到Android 7.0版本中出现,它使用了JIT (Just In Time)编译技术,使应用程序在设备上运行速度得到极大提升,同时也优化了存储空间的使用效率。
此外,Google使用DEX2OAT编译器来实现软件的运行形式的持续改进,改进的形式包括更少的崩溃,更稳定的性能,更快的启动时间,更少的令人恼火的通知,以及更少的耗电和资源占用。
它的关键组件包括Dalvik虚拟机(JVMTi和JIT技术),AOT(Ahead-of-Time)编译技术以及一系列新型资源优化工具。
DEX2OAT编译器在Android系统中有着重要的作用,也是Android 系统性能优化的重要手段。
它使得应用程序能够更快地运行,同时也有助于节省设备上的空间,从而提高了用户体验。
尽管有一些运行时工具可以替代DEX2OAT编译器,但是它仍然是Android系统中最好的选择。
dex2oat编译dex2oat译是Android统中,基于 Dalvik Executable (DEX)式的应用程序在 Android拟机 (ART) 上执行之前必须经过的一种编译过程。
本文将对 dex2oat译的相关知识进行介绍,比如它的工作原理、编译之后的优化效果,以及一些遇到的问题。
一、dex2oat译简介dex2oat译是 Android统中的一个很重要的编译过程。
它的职责是将基于 Dalvik Executable (DEX)式的应用程序编译成 Android 拟机 (ART)以直接运行的格式OAT式(Opaque binary blob)。
这个编译过程包括了字节码分析、优化处理、调度过程等步骤,使得程序运行效率大大提高。
二、dex2oat译的工作原理dex2oat译是基于类似 Just-In-Time(JIT)的编译模式进行的,它将基于 Dalvik Executable (DEX)式的字节码编译成 Android拟机 (ART)以直接运行的非可读格式OAT式。
整个编译过程由几个小步骤组成:1.先,dex2oat译器会把基于 DEX式的应用程序中的字节码进行分析,把代码部分分解成更小的操作。
2.后,它会对代码进行优化,通过标量替换、内联展开、重排序、代码布局和混淆等技术,提高程序运行的效率。
3.后,它会将优化之后的代码编译成 OAT式的字节码,使得应用程序可以在 Android拟机 (ART) 上直接运行。
三、dex2oat译的优化效果dex2oat译的优化效果是非常明显的,尤其是对高级语言的优化效果更加强大。
通过 dex2oat译可以把应用程序中出现的热点代码提前编译,把热点代码优先执行,使得程序运行的效率更高;它还可以优化字节码的内存布局,使得程序更加紧凑,节省内存空间;它还可以把字节码重排序,把不常用的操作放到后面,把热点代码放置在前面,使得程序的访存效率更高;它还可以对字节码进行机器码编译,使得代码运行效率更高。
Android逆向之dex2oat的实现解析⽬录简介dex2oat介绍为什么要使⽤dex2oat进⾏转换dex2oat代码1.dex2oat类定义2.OpenDexFiles函数定义3.dex2oat⼊⼝函数定义总结简介在Android系统5.0及以上系统开始逐渐丢弃Dalvik虚拟机,由于ART虚拟机对内存分配和回收都做了算法优化,降低了内存碎⽚化程度,回收时间也得以缩短,所有android系统5.0及以上都在主推ART虚拟机。
在ART虚拟机中ART则会将Dex通过dex2oat⼯具编译得到⼀个ELF⽂件,它是⼀个可执⾏的⽂件。
所以下⾯我们就针对ART的dex2oat实现进⾏做分析。
dex2oat介绍Dex2oat的全称是:dalvik excutable file to optimized art file,它是⼀个对 android系统下的dex⽂件,进⾏编译优化的程序。
通过dex2oat的编译优化,可以⼤⼤的提⾼android系统的启动的速度和使⽤⼿机过程的的流畅度。
dex2oat在安卓⼿机环境下的存放位置为/system/bin/dex2oatdex2oat在开源系统中的路径为\art\dex2oat\。
为什么要使⽤dex2oat进⾏转换在android系统中,Android 虚拟机可以识别到的是dex⽂件,App应⽤在使⽤过程中如果每次将dex⽂件加载进⾏内存,解释性执⾏字节码,效率就会变得⾮常低,从⽽影响到⽤户在使⽤安卓⼿机的体验。
通过利⽤dex2oat进⾏优化处理,那么可以在android系统运⾏之前,利⽤合适的时机将dex⽂件字节码,提前转化为虚拟机上可以执⾏运⾏的机器码,后续直接从效率更⾼的机器码中运⾏,则运⾏阶段更加流畅,优化⽤户体验。
dex2oat代码1.dex2oat类定义class Dex2Oat {public://创建函数,返回值为bool,static bool Create(Dex2Oat** p_dex2oat,Compiler::Kind compiler_kind,InstructionSet instruction_set,InstructionSetFeatures instruction_set_features,VerificationResults* verification_results,DexFileToMethodInlinerMap* method_inliner_map,size_t thread_count)SHARED_TRYLOCK_FUNCTION(true, Locks::mutator_lock_) {//判断参数传递进来的释放为空CHECK(verification_results != nullptr);CHECK(method_inliner_map != nullptr);//⽤智能指针⽅式进⾏去实例化dex2oatstd::unique_ptr<Dex2Oat> dex2oat(new Dex2Oat(&compiler_options,compiler_kind,instruction_set,instruction_set_features,verification_results,method_inliner_map,thread_count));if (!dex2oat->CreateRuntime(runtime_options, instruction_set)) {*p_dex2oat = nullptr;return false;}*p_dex2oat = dex2oat.release();return true;}//dex2oat的虚构函数,⽤于释放操作。
一.APKTool的安装
1.其实这个谈不上安装,不过如果你愿意的话可以把下载到的APKTOOL中的三个文件(aapt.exe、apktool.bat、apktool.jar)解压缩到任一目录下
2.在DOS命令下切换到APKTool解压缩目录。
3.运行下面命令:
1.decode该命令用于进行反编译apk文件,一般用法为
Apktool d <file.apk><dir>
<file.apk>代表了要反编译的apk文件的路径,最好写绝对路径,比如C:\MusicPlayer.apk
<dir>代表了反编译后的文件的存储位置,比如C:\MusicPlayer??
如果你给定的<dir>已经存在,那么输入完该命令后会提示你,并且无法执行,需要你重新修改命令加
入-f指令
apktool d –f<file.apk><dir>
这样就会强行覆盖已经存在的文件
2.build
该命令用于编译修改好的文件,一般用法为
Apktool b <dir>
这里的<dir>就是刚才你反编译时输入的<dir>(如C:\MusicPlayer),输入这行命令后,如果一切正常,你会发现C:\MusicPlayer内多了2个文件夹build和dist,其中分别存储着编译过程中逐个编译的文件以及最终打包的apk文件。
3.install-framework该命令用于为APKTool安装特定的framework-res.apk文件,以方便进行反编译一些与ROM相互依赖的APK文件。
二、dex2jar&jd-gui的使用
1.首先将apk文件后缀改为zip并解压,得到其中的classes.dex,它就是java文件编译再通过dx工具打包而成的,将classes.dex复制到dex2jar.bat所在目录dex2jar-0.0.9.15文件夹。
在命令行下定位到dex2jar.bat所在目录,运行
dex2jar.bat classes.dex 生成classes_dex2jar.jar
然后,进入jdgui文件夹双击jd-gui.exe,打开上面生成的jar包classes_dex2jar.jar,即可查看源代码。