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

author author     2023-04-12     613

关键词:

参考技术A 一.看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,不能直接替换(因为签名不一样)本回答被提问者采纳

修改 classes.dex 并重新打包 .apk 文件

...发布时间】:2015-06-1606:08:27【问题描述】:我想修改我的Android应用程序的.apk文件中的classes.dex文件并创建一个新的.apk文件。我已经知道如何使用诸如apktool之类的工具来反编译.apk文件,然后重新编译它。我的问题是完全修改class... 查看详情

android反编译apk,修改资源,重新打包,签名发布

本文简单介绍apk是如何修改logo(ic_launcher),类似的资源文件修改也可以通过此方式。不过要修改class的话就要涉及到smali的学习了,这里就暂且不谈,后续有需要再做更新。一、工具介绍:apktool:用来反编... 查看详情

如何从 j2me .jar 应用程序中反编译、编辑和重新编译单个类文件

】如何从j2me.jar应用程序中反编译、编辑和重新编译单个类文件【英文标题】:Howtodecompile,editandrecompileasingleclassfilefromaj2me.jarapplication【发布时间】:2012-01-0910:06:27【问题描述】:.jar(mobile)应用程序包含许多类文件,我想从中反... 查看详情

apktool的下载,安装,反编译和重新打包(代码片段)

一.环境要求安装java1.8以上命令行运行java-version返回版本大于1.8如果没有,请安装java1.8二.下载与安装下载apktool_x.x.x.jar到本地官网下载或者镜像下载重命名下载的apktool_x.x.x.jar,改名为apktool.jar下载脚本并配置Windows写个bat脚本放在... 查看详情

apk反编译(代码片段)

学习和开发Android应用有一段时间了,今天写一篇博客总结一下Android的apk文件反编译。我们知道,Android应用开发完成之后,我们最终都会将应用打包成一个apk文件,然后让用户通过手机或者平板电脑下载下来进行安装。正常情况... 查看详情

记一次android程序反编译并二次打包的过程

...句话叫不懂攻,焉知防。前几天看到有一个问题在问Android端目前防止二次打包的方法有哪些?我想从攻击的角度来说这个问题。在分析过程中讲解每一步都有哪些防范手段。下面以一个市面上大公司的app为例,讲一... 查看详情

如何更改安卓安装包的内置文件?

怎么样可以更改安卓安装包里的内置文件?比如应用的主题图片,一些文字之类的。就拿图片来说,应用安装后不是显示的有一个正方形图片么?点它就能打开应用。我找到那张图片,然后直接用另一张图片(另外一个安装包的... 查看详情

安卓apk反编译修改重新打包签名全过程

首先明确,反编译别人apk是一件不厚道的事情。代码是程序员辛苦工作的成果,想通过这种手段不劳而获,是不对的。这也说明,代码混淆是非常重要的。本文抱着学习的态度,研究在一些特殊的情况下如果有需要,该怎么反编... 查看详情

一步一步带你反编译apk,并教你修改smali和重新打包

...t.exe,apktool.bat,apktool.jar;三个在同一目录结合使用,用来反编译apk,apk重新打包;2.dex2jar:该工具作用是将classes.dex文件,反编译出源码(如果apk未加固),反编译出文件,使用jd-gui工具进行查看;3.Auto-Sign:自动签名工具,将重新打... 查看详情

利用apktool反编译apk,并且重新签名打包

...安装好apktool。我的安装在C:UsersAdministratorDownloadsapktool反编译工具2.2.2。apk我放在c盘根目录,名字叫test.apk,cmd打开命令行。运行:apktoold-fc: est.apk当前目前便会生成一个test的目录,对应的包的文件目录。如要做啥修改,可以自行... 查看详情

反编译一款app然后重新打包(windows环境)

...自己的信息呀,咳咳,这又来送题材了,今天水一把APP反编译+回编译,文中会针对一款APP进行简单的修改信息,问问题的小伙伴还不火速右上角支持一下。MacOS跟Windows我是分开写的,怕你说平台不一致就打退堂鼓了。MacOS:https:... 查看详情

apk反编译和重新打包

...同的步骤来就可以了。在终端输入:apktooldxxx.apk,我在反编译时出现了以下错误:看提示是无法写入到这个目录/Users/xxx/Library/apktool/framework(xxx为电脑用户名),那就在/Users/xxx/Library下新建apktool文件夹,并在apktool文件夹下再新建... 查看详情

如何从 google play store 反编译一个 android 应用程序

】如何从googleplaystore反编译一个android应用程序【英文标题】:Howtodecompileanandroidappfromthegoogleplaystore【发布时间】:2017-09-3020:04:42【问题描述】:我想反编译一个可以在googleplaystore上找到的android应用程序。有人可以向我推荐一个... 查看详情

android-apk解包打包(代码片段)

title:android-apk解包打包categories:Androidtags:[android,加壳]date:2022-09-2810:29:51comments:falsemathjax:truetoc:trueandroid-apk解包打包,以下所有操作都需要在配置好java环境下进行前篇androidapk解包和打包-https://blog.csdn.net/u011435933/article/details/89555328apk... 查看详情

android逆向必备工具

Android逆向用途:软件防护:根据逆向的方法针对性的开发防护策略;算法研究:在没有源码的前提下,通过反编译,反汇编,拿到Smali代码,研究其产品的算法,实现途径;接口分析:接入一个没有源码的第三方库,无法进行调试,出现问题后,可... 查看详情

androidproguard安全加固教你如何让自己的应用程序或sdk更难被反编译--library打包成jar并且混淆(代码片段)

在android应用层开发的时候咱们技术人员都或多或少都会接触一些SDK比如so、jar等,这些都是数据类公司提供给互联网开发公司的关于技术核心类方便的东西,因为是核心所以加密加固是必不可少的工作,本博今天就向... 查看详情

反编译class文件并重新编译的方法

...可以通过以下步骤实现: 修改前的class文件:一、反编译.class文件成.java文件。  1、可以使用JavaDecompiler这个工具,直接打开对应的.class文件。然后点击菜单:File→SaveSource,将文件保存成.java文件。如下:   &... 查看详情

APK注入,重新编译android manifest

】APK注入,重新编译androidmanifest【英文标题】:APKinjection,recompilingandroidmanifest【发布时间】:2018-09-3013:33:25【问题描述】:我想要实现的目标将打包在apk中的AndroidManifest.xml从二进制形式反编译成普通的xml文件,编辑并重新编译... 查看详情