风气网

如何反编译android应用并重新打包

2024-09-20来自:本站整理
如何反编译android应用并重新打包

一.看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:\developeroolsest_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

  通过对比可以看到,常量是没有必变的,可以根据的smali的语法,进行相应的修改

  五.3、打包、签名和安装修改后的apk

  修改完了,就可以打包回apk了。执行以下命令:
  apktool b decode_dir
  在mygame目录下的dist在会看到打包好的apk。
  当然,现在一般是无法安装的,因为apk还没有签名。下面就来签名。签名需要keystore文件,我已经有专用的keystore了,如果还没有,请参阅这里进行生成。
  执行以下命令为重新编译的my_game.apk签名:
  jarsigner -verbose -keystore demo.keystore Apkd.apk demo.keystore
  最后,在安装到手机前,需要把手机中的已有版本先卸载,因为如果签名不同,是不能覆盖安装的,会提示“应用程序未安装”错误。
  完整的运行情况如下:

  D:\developeroolsest_apk
ew\decode\dist>keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore
  输入keystore密码:
  再次输入新密码:
  您的名字与姓氏是什么?
  [Unknown]: rao
  您的组织单位名称是什么?
  [Unknown]: rao
  您的组织名称是什么?
  [Unknown]:
  您所在的城市或区域名称是什么?
  [Unknown]:
  您所在的州或省份名称是什么?
  [Unknown]:
  该单位的两字母国家代码是什么
  [Unknown]:
  CN=rao, OU=rao, O=Unknown, L=Unknown, ST=Unknown, C=Unknown 正确吗?
  [否]: y

  输入的主密码
  (如果和 keystore 密码相同,按回车):

  D:\developeroolsest_apk
ew\decode\dist>jarsigner -verbose -keystore demo.keystore Apkd.apk demo.keystore
  输入密钥库的口令短语:
  正在添加: META-INF/MANIFEST.MF
  正在添加: META-INF/DEMO_KEY.SF
  正在添加: META-INF/DEMO_KEY.RSA
  正在签名: res/drawable-hdpi/ic_launcher.png
  正在签名: res/drawable-mdpi/ic_launcher.png
  正在签名: res/drawable-xhdpi/ic_launcher.png
  正在签名: res/drawable-xxhdpi/ic_launcher.png
  正在签名: res/layout/activity_main.xml
  正在签名: res/menu/main.xml
  正在签名: AndroidManifest.xml
  正在签名: classes.dex
  正在签名: resources.arsc

  D:\developeroolsest_apk
ew\decode\dist>
  到此为止,修改后的apk可以正常的安装了,不过,在安装之前,必须要先卸载以前的apk,不能直接替换(因为签名不一样)

一.看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:\developeroolsest_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;
  }

一.看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

  通过对比可以看到,常量是没有必变的,可以根据的smali的语法,进行相应的修改

  五.3、打包、签名和安装修改后的apk

  修改完了,就可以打包回apk了。执行以下命令:
  apktool b decode_dir
  在mygame目录下的dist在会看到打包好的apk。
  当然,现在一般是无法安装的,因为apk还没有签名。下面就来签名。签名需要keystore文件,我已经有专用的keystore了,如果还没有,请参阅这里进行生成。
  执行以下命令为重新编译的my_game.apk签名:
  jarsigner -verbose -keystore demo.keystore Apkd.apk demo.keystore
  最后,在安装到手机前,需要把手机中的已有版本先卸载,因为如果签名不同,是不能覆盖安装的,会提示“应用程序未安装”错误。
  完整的运行情况如下:

  D:\developer\tools\test_apk\new\decode\dist>keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore
  输入keystore密码:
  再次输入新密码:
  您的名字与姓氏是什么?
  [Unknown]: rao
  您的组织单位名称是什么?
  [Unknown]: rao
  您的组织名称是什么?
  [Unknown]:
  您所在的城市或区域名称是什么?
  [Unknown]:
  您所在的州或省份名称是什么?
  [Unknown]:
  该单位的两字母国家代码是什么
  [Unknown]:
  CN=rao, OU=rao, O=Unknown, L=Unknown, ST=Unknown, C=Unknown 正确吗?
  [否]: y

  输入的主密码
  (如果和 keystore 密码相同,按回车):

  D:\developer\tools\test_apk\new\decode\dist>jarsigner -verbose -keystore demo.keystore Apkd.apk demo.keystore
  输入密钥库的口令短语:
  正在添加: META-INF/MANIFEST.MF
  正在添加: META-INF/DEMO_KEY.SF
  正在添加: META-INF/DEMO_KEY.RSA
  正在签名: res/drawable-hdpi/ic_launcher.png
  正在签名: res/drawable-mdpi/ic_launcher.png
  正在签名: res/drawable-xhdpi/ic_launcher.png
  正在签名: res/drawable-xxhdpi/ic_launcher.png
  正在签名: res/layout/activity_main.xml
  正在签名: res/menu/main.xml
  正在签名: AndroidManifest.xml
  正在签名: classes.dex
  正在签名: resources.arsc

  D:\developer\tools\test_apk\new\decode\dist>
  到此为止,修改后的apk可以正常的安装了,不过,在安装之前,必须要先卸载以前的apk,不能直接替换(因为签名不一样)

  • [蒙科荣15550031660] - smali语法指令?
    奚苇清::如何反编译android应用并重新打包1、可以用apktool对apk进行反编译并重新打包,方法如下:首先我们新建一个android项目,里面只有一个MainActivity,而且主界面只会显示一个字符串:你好。2、第一:反编译apk,然后根据自己需求更改,再重新打包回去。用到的工具:apktool.zip第二:将重新打包的apk进行签名。
  • [蒙科荣15550031660] - Android反编译:Apktool、dex2jar、JD-GUI的使用
    奚苇清::接下来是准备工作(以Mac版为例),然后使用Apktool反编译APK文件以获取资源文件,最后使用dex2jar将.dex文件反编译成.jar文件。在JD-GUI的使用过程中,只需打开JD-GUI.app,将经过dex2jar反编译后的.jar文件拖动到JD-GUI中,即可查看反编译后的Java代码。需要注意的是,由于作者可能对代码进行了混淆...
  • [蒙科荣15550031660] - Android反编译介绍
    奚苇清::以"HelloAndroid.apk"为例,首先在命令行中定位到Apktool文件夹,输入java -jar apktool.bat d HelloAndroid.apk,解包后,我们会看到资源和smali文件,但加固处理的app可能无法完全反编译。查看与回编译 apk其实是一个zip文件,通过解压后,我们可以处理classes.dex。接着,用d2j-dex2jar.sh将其转换...
  • [蒙科荣15550031660] - 如何反编译android应用并重新打包
    奚苇清::反编译android步骤入下:第一:使用apktool直接反编译apk 第二:apk中包含的内容 第三:进入到hellodemo\\smali\\com\\example\\hello,打开MainActivity.smali。找到:const-string v1, "\你\好",修改为:const-string v1, "hello",第四:然后在命令行输入:apktool b hellodemo hellodemo1....
  • [蒙科荣15550031660] - 如何反编译android应用并重新打包
    奚苇清::3.启动控制台,输入apktool,回车可查看到apktool工具常用指令 4.新建一个文件夹,用于存放apk及待解压的文件,这里笔者将文件夹建在D:\\apk目录,同时放入用于测试的android app包(test.apk)5.控制台输入:apktool d D:\\apk\\test.apk D:\\apk\\test 进行反编译操作 中句话中“D:\\apk\\test.apk...
  • [蒙科荣15550031660] - Android 反编译指南
    奚苇清::获取Apk文件内容首先,Apktool是常用的工具之一,用于将Apk文件反编译。直接修改扩展名为.zip同样可以解压资源文件,但AndroidManifest.xml等XML文件会呈现乱码。使用Apktool则能较好恢复文件内容。安装和使用ApktoolWindows用户需确认安装成功,添加Apktool.jar和.bat文件路径至环境变量。Mac OS用户则会看到安装...
  • [蒙科荣15550031660] - 如何反编译android应用以及重编译,签名和对齐优化
    奚苇清::反编译和重编译工具apktool:Google Code下载,按平台下载(一个apktool-install-<platform>-<ver>-tar.bz2,一个apktool<ver>.tar.bz2,下载完成后解压至.\\workspace\\apktoolbox\\bin 密钥文件,共4组。test\/shared\/media\/platform,从android source中获取,分别对应不同共享用户ID时签名所需(查看...
  • [蒙科荣15550031660] - Android APK+Dex文件反编译及回编译工具工具说明
    奚苇清::首先,ApkTool v1.5.0是一个强大的APK文件反编译工具,它能够直接处理APK文件,同时对其内部的DEX文件进行反编译。这一工具为开发者提供了深入理解应用内部结构的机会。对于DEX文件的反编译,Baksmali\/Smali v1.4.0是一个专门的工具,它专注于DEX文件的反编译,与ApkTool可以配合使用,便于开发者查看...
  • [蒙科荣15550031660] - Android APK 反编译方法
    奚苇清::介绍Android APK 反编译方法,需要的工具的具体用法 首先下载这三个软件,网上有很多资源,这里就不附加下载链接了 然后解压(注意apktool的两个文件解压到一个文件夹)。把需要反编译的APK放到apktool文件夹下,然后打开Cmd(运行),进入apktool文件夹下 输入 apktool d apk名字,注意apk名字需要带有后缀...
  • [蒙科荣15550031660] - Android系统中的反编译和加壳有哪些技术
    奚苇清::二、反编译技术1.使用反编译工具:市面上有很多反编译工具,能够对APK程序包进行还原,获取程序的源代码和资源文件。2.使用调试工具:诸如xposed、substrate、IDC等调试工具,能够获取正在执行的应用程序的信息,包括变量、方法和逻辑,从而进一步获取应用程序的核心代码。综上所述,为了保证Android应用程序的...
  • 首页 热门
    返回顶部
    风记网