如何进行android 反编译

 我来答
匿名用户
2016-07-23
展开全部
一.看android的源代码

  1)将Apkd.apk 用zip解压后,出现了一个classes.dex文件
  2014/02/19 19:42
  .
  2014/02/19 19:42
  ..
  2014/02/19 15:35 1,656 AndroidManifest.xml
  2014/02/19 15:35 687,024 classes.dex
  2014/02/19 15:49
  META-INF
  2014/02/19 15:49
  res
  2014/02/19 15:35 2,200 resources.arsc
  2)进入到dex2jar目录中,运行情况如下:
  D:\developer\tools\test_apk\dex2jar-0.0.9.15>dex2jar.bat "..\Apkd(d2j)\classes.d
  ex"
  this cmd is deprecated, use the d2j-dex2jar if possible
  dex2jar version: translator-0.0.9.15
  dex2jar ..\Apkd(d2j)\classes.dex -> ..\Apkd(d2j)\classes_dex2jar.jar
  Done.
  在apk所在的目录会出现 classes_dex2jar.jar 文件。
  3) 用JD-GUI对jar包进行查看,可以查看源文件

  二.反编译apk

  1.在 下载 APKTOOL中的三个文件(aapt.exe、apktool.bat、apktool.jar)解压缩到你的Windows安装目录下,以方便使用Dos命令.
  2012/12/06 11:44 854,016 aapt.exe
  2014/02/19 17:15 277,372 Apkd.apk //示例用 apk文件
  2012/12/23 23:39 92 apktool.bat
  2013/02/03 02:37 2,655,843 apktool.jar
  2.进入到apktool.bat所在的目录,运行:
  apktool d Apkd.apk decode_dir
  反编译后,decode_dir目录下的内容如下:
  2014/02/19 17:16 716 AndroidManifest.xml
  2014/02/19 17:16 237 apktool.yml
  2014/02/19 17:18
  build
  2014/02/19 17:16
  res
  2014/02/19 17:16
  smali
  此时我可以查看原文件AndroidManifest.xml了,也是查看smali源文件(是用smali语言写的,可以对照java看)。

  三.APKTOOL的使用

  1).decode
  该命令用于进行反编译apk文件,一般用法为
  apktool d

  代表了要反编译的apk文件的路径,最好写绝对路径,比如C:\MusicPlayer.apk
  代表了反编译后的文件的存储位置,比如C:\MusicPlayer
  如果你给定的已经存在,那么输入完该命令后会提示你,并且无法执行,需要你重新修改命令加入-f指令
  apktool d –f

  这样就会强行覆盖已经存在的文件
  2).build
  该命令用于编译修改好的文件,一般用法为
  apktool b

  这里的
  就是刚才你反编译时输入的
  (如C:\MusicPlayer),输入这行命令后,如果一切正常,你会发现C:\MusicPlayer内多了2个文件夹build和dist,其中分别存储着编译过程中逐个编译的文件以及最终打包的apk文件。
  3).install-framework
  该命令用于为APKTool安装特定的framework-res.apk文件,以方便进行反编译一些与ROM相互依赖的APK文件。具体情况请看常见问题

  四.smali与java源码对照,并做出相应的修改

  java源代码:

  import android.os.Bundle;
  import android.app.Activity;
  import android.view.Menu;
  import android.widget.*;

  public class MainActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  TextView a = (TextView)this.findViewById(R.id.test) ;
  a.setText("raoliang");
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
  }

  }

  对应的smali源代码:
  .class public Lali/text/apkd/MainActivity;
  .super Landroid/app/Activity;
  .source "MainActivity.java"

  # direct methods
  .method public constructor ()V
  .locals 0

  .prologue
  .line 8
  invoke-direct {p0}, Landroid/app/Activity;->()V

  return-void
  .end method

  # virtual methods
  .method protected onCreate(Landroid/os/Bundle;)V
  .locals 2
  .parameter "savedInstanceState"

  .prologue
  .line 12
  invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V

  .line 13
  const/high16 v1, 0x7f03

  invoke-virtual {p0, v1}, Lali/text/apkd/MainActivity;->setContentView(I)V

  .line 14
  const/high16 v1, 0x7f08

  invoke-virtual {p0, v1}, Lali/text/apkd/MainActivity;->findViewById(I)Landroid/view/View;

  move-result-object v0

  check-cast v0, Landroid/widget/TextView;

  .line 15
  .local v0, a:Landroid/widget/TextView;
  const-string v1, "raoliang"

  invoke-virtual {v0, v1}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V

  .line 16
  return-void
  .end method

  .method public onCreateOptionsMenu(Landroid/view/Menu;)Z
  .locals 2
  .parameter "menu"

  .prologue
  .line 21
  invoke-virtual {p0}, Lali/text/apkd/MainActivity;->getMenuInflater()Landroid/view/MenuInflater;

  move-result-object v0

  const/high16 v1, 0x7f07

  invoke-virtual {v0, v1, p1}, Landroid/view/MenuInflater;->inflate(ILandroid/view/Menu;)V

  .line 22
  const/4 v0, 0x1

  return v0
  .end method
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式