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

如何反编译android应用并重新打包,第1张

一看android的源代码

1)将Apkdapk 用zip解压后,出现了一个classesdex文件

2014/02/19 19:42

2014/02/19 19:42

2014/02/19 15:35 1,656 AndroidManifestxml

2014/02/19 15:35 687,024 classesdex

2014/02/19 15:49

META-INF

2014/02/19 15:49

res

2014/02/19 15:35 2,200 resourcesarsc

2)进入到dex2jar目录中,运行情况如下:

D:\developer\tools\test_apk\dex2jar-00915>dex2jarbat "\Apkd(d2j)\classesd

ex"

this cmd is deprecated, use the d2j-dex2jar if possible

dex2jar version: translator-00915

dex2jar \Apkd(d2j)\classesdex -> \Apkd(d2j)\classes_dex2jarjar

Done

在apk所在的目录会出现 classes_dex2jarjar 文件。

3) 用JD-GUI对jar包进行查看,可以查看源文件

反编译apk

1在 下载 APKTOOL中的三个文件(aaptexe、apktoolbat、apktooljar)解压缩到你的Windows安装目录下,以方便使用Dos命令

2012/12/06 11:44 854,016 aaptexe

2014/02/19 17:15 277,372 Apkdapk //示例用 apk文件

2012/12/23 23:39 92 apktoolbat

2013/02/03 02:37 2,655,843 apktooljar

2进入到apktoolbat所在的目录,运行:

apktool d Apkdapk decode_dir

反编译后,decode_dir目录下的内容如下:

2014/02/19 17:16 716 AndroidManifestxml

2014/02/19 17:16 237 apktoolyml

2014/02/19 17:18

build

2014/02/19 17:16

res

2014/02/19 17:16

smali

此时我可以查看原文件AndroidManifestxml了,也是查看smali源文件(是用smali语言写的,可以对照java看)。

三APKTOOL的使用

1)decode

该命令用于进行反编译apk文件,一般用法为

apktool d

代表了要反编译的apk文件的路径,最好写绝对路径,比如C:\MusicPlayerapk

代表了反编译后的文件的存储位置,比如C:\MusicPlayer

如果你给定的已经存在,那么输入完该命令后会提示你,并且无法执行,需要你重新修改命令加入-f指令

apktool d –f

这样就会强行覆盖已经存在的文件

2)build

该命令用于编译修改好的文件,一般用法为

apktool b

这里的

就是刚才你反编译时输入的

(如C:\MusicPlayer),输入这行命令后,如果一切正常,你会发现C:\MusicPlayer内多了2个文件夹build和dist,其中分别存储着编译过程中逐个编译的文件以及最终打包的apk文件。

3)install-framework

该命令用于为APKTool安装特定的framework-resapk文件,以方便进行反编译一些与ROM相互依赖的APK文件。具体情况请看常见问题

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

java源代码:

import androidosBundle;

import androidappActivity;

import androidviewMenu;

import androidwidget;

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

superonCreate(savedInstanceState);

setContentView(Rlayoutactivity_main);

TextView a = (TextView)thisfindViewById(Ridtest) ;

asetText("raoliang");

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present

getMenuInflater()inflate(Rmenumain, menu);

return true;

}

}

对应的smali源代码:

class public Lali/text/apkd/MainActivity;

super Landroid/app/Activity;

source "MainActivityjava"

# 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_gameapk签名:

jarsigner -verbose -keystore demokeystore Apkdapk demokeystore

最后,在安装到手机前,需要把手机中的已有版本先卸载,因为如果签名不同,是不能覆盖安装的,会提示“应用程序未安装”错误。

完整的运行情况如下:

D:\developer\tools\test_apk\new\decode\dist>keytool -genkey -alias demokeystore -keyalg RSA -validity 40000 -keystore demokeystore

输入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 demokeystore Apkdapk demokeystore

输入密钥库的口令短语:

正在添加: META-INF/MANIFESTMF

正在添加: META-INF/DEMO_KEYSF

正在添加: META-INF/DEMO_KEYRSA

正在签名: res/drawable-hdpi/ic_launcherpng

正在签名: res/drawable-mdpi/ic_launcherpng

正在签名: res/drawable-xhdpi/ic_launcherpng

正在签名: res/drawable-xxhdpi/ic_launcherpng

正在签名: res/layout/activity_mainxml

正在签名: res/menu/mainxml

正在签名: AndroidManifestxml

正在签名: classesdex

正在签名: resourcesarsc

D:\developer\tools\test_apk\new\decode\dist>

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

APK文件是用专业软件eclipse编译生成的文件包。在网上可以找到许多软件来对APK的内容进行反编译,例如:可以通过AXMLPrinter2工具和命令:java -jar AXMLPrinter2jar AndroidManifestxml 解开在apk中的AndroidManifestxml。最近,业界有一个功能强大的解包打包工具包apktool,可以在Windows下用来方便快速地对APK文件进行解包和打包,给修改和编辑工作带来许多方便。下面来介绍它的使用。1) APKtool软件包APKtool软件包有2个程序组成:apktooljar 和 aaptexe另外提供一个批处理文件:apktoolbat,其内容为:java -jar "%~dp0\apktooljar" %1 %2 %3 %4 %5 %6 %7 %8 %9运行apktoolsjar需要java环境(160版本以上)。apktooljar用于解包,apktooljar和aaptexe联合用于打包。2) APK文件的解包下面以解开Contactsapk为例。首先把Contactsapk Copy到当前工作目录下(例:Test)。在DOS下打入命令apktool d Contactsapk ABC这里“d”表示要解码。Contactsapk是要解包的APK文件。ABC是子目录名。所有解包的文件都会放在这个子目录内。3) APK文件的打包在DOS下打入命令apktool b ABC New-Contactsapk这里“b”表示要打包ABC是子目录名,是解包时产生的子目录,用来存放所有解包后的和修改后的文件。New-Contactsapk是打包后产生的新的APK文件。4) Framework框架文件在解开APK文件时,apktool需要框架文件(framework-resapk)来解码和打包。Apktool已经包含了标准的框架,所以在大多数APK文件的解包时,不需要另外提供框架文件。但是,某些制造商使用了他们自己的框架文件,为了解包,就不得不从手机中把框架文件(framework-resapk)提取出来,然后安装到计算机。安装命令是:apktool if framework-resapk 安装后就会得到:~\apktool\framework\1apk5) 解包、解包和签名批处理在实际使用时,可能对多个APK文件进行处理。方便的做法是写成批处理文件。打包和签名可以一次完成。解包批处理命令:for %%i in (apk) do java -jar apktooljar d %%i _%%i && move _%%i Modifying_Files && copy %%i Backuped_Raw_Files && @echo File [%%i] unpacking process is completed!打包和签名批处理命令:for /d %%i in () do cd && java -jar apktooljar b Modifying_Files\%%i && java -jar signapkjar testkeyx509pem testkeypk8 Modifying_Files\%%i\dist\apk %%i && ren %%i New%%i && move New%%i Modified_Signed_Files && @echo %%i Complete repacking and Signing! && cd Modifying_Files

这个确实很困难。如果是DOS程序还好办,如果是Windows程序,其反汇编的工作量相当巨大。而且这仅是反汇编,得到的只是勉强能用的汇编代码,而从汇编代码再反工程到C,真的是件很困难的事。程序简单还好办,复杂的就真是件费力的事了。放弃吧。

如果是自己写的程序,只要整个设计还记得,那就重新写一遍吧。

以上就是关于如何反编译android应用并重新打包全部的内容,包括:如何反编译android应用并重新打包、怎样反编译 Android APK、用C语言编写了一个程序,源代码和工程文件都弄丢了,只剩下.exe的二进制程序文件。怎么反编译出.c等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9839290.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存