android反编译,android反编译工具mercury

怎样反编译 Android APK

APK文件是用专业软件eclipse编译生成的文件包。在网上可以找到许多软件来对APK的内容进行反编译,例如:可以通过AXMLPrinter2工具和命令:java -jar AXMLPrinter2.jar AndroidManifest.xml 解开在apk中的AndroidManifest.xml。最近,业界有一个功能强大的解包打包工具包apktool,可以在Windows下用来方便快速地对APK文件进行解包和打包,给修改和编辑工作带来许多方便。下面来介绍它的使用。1) APKtool软件包 APKtool软件包有2个程序组成:apktool.jar 和 aapt.exe 另外提供一个批处理文件:apktool.bat,其内容为: java -jar "%~dp0\apktool.jar" %1 %2 %3 %4 %5 %6 %7 %8 %9 运行apktools.jar需要java环境(1.6.0版本以上)。 apktool.jar用于解包,apktool.jar和aapt.exe联合用于打包。2) APK文件的解包 下面以解开Contacts.apk为例。首先把Contacts.apk Copy到当前工作目录下(例:Test)。在DOS下打入命令 apktool d Contacts.apk ABC 这里“d”表示要解码。Contacts.apk是要解包的APK文件。ABC是子目录名。所有解包的文件都会放在这个子目录内。3) APK文件的打包 在DOS下打入命令 apktool b ABC New-Contacts.apk 这里“b”表示要打包 ABC是子目录名,是解包时产生的子目录,用来存放所有解包后的和修改后的文件。 New-Contacts.apk是打包后产生的新的APK文件。4) Framework框架文件 在解开APK文件时,apktool需要框架文件(framework-res.apk)来解码和打包。Apktool已经包含了标准的框架,所以在大多数APK文件的解包时,不需要另外提供框架文件。但是,某些制造商使用了他们自己的框架文件,为了解包,就不得不从手机中把框架文件(framework-res.apk)提取出来,然后安装到计算机。安装命令是: apktool if framework-res.apk 安装后就会得到:~\apktool\framework\1.apk 5) 解包、解包和签名批处理在实际使用时,可能对多个APK文件进行处理。方便的做法是写成批处理文件。打包和签名可以一次完成。 解包批处理命令: for %%i in (*.apk) do java -jar apktool.jar 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 apktool.jar b Modifying_Files\%%i java -jar signapk.jar testkey.x509.pem testkey.pk8 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

创新互联主要为客户提供服务项目涵盖了网页视觉设计、VI标志设计、全网营销推广、网站程序开发、HTML5响应式重庆网站建设手机网站制作设计、微商城、网站托管及网页维护、WEB系统开发、域名注册、国内外服务器租用、视频、平面设计、SEO优化排名。设计、前端、后端三个建站步骤的完善服务体系。一人跟踪测试的建站服务标准。已经为成都PE包装袋行业客户提供了网站维护服务。

Android反编译(三)— 手动编译

PS: 最近没工作,没工作就没需求,没需求就没什么技术总结的灵感,那就没更新什么。但是两个月不更新了,要是三个月不更新就会出大事,所以这次打算做一件有意思又不难的事。

之前有发文章写过反编译,今天就来试试反编译之正编译,开玩笑的,就是试试手动编译的过程, 平时我们在项目中编译出包都是使用Gradle直接执行assemble任务就能解决,我打算试试手动模拟整个过程。当然我也是第一次这样搞,所以如果有写得不对的地方,还望指出。

众所周知,apk实质上就是一个压缩包。复习一下,我们写个最简单的Demo,然后打包,然解压,注意是解压,不是反编译,意义是不同的。

注意我这个Demo很简单,什么都不引入

然后我们看看整个出包的过程,随便从网上拿张图

然后这里我们用Android SDK给我们提供的工具来完成整个流程,工具在sdk文件夹下的build-tools文件夹下,有什么aapt.exe、dx.bat,用的就是这些

这步应该是整个流程最简单的吧,我感觉,所以从最简单的开始。

我们先看看生成的dex有什么

对比项目,我是一开始最基本的项目,什么都没动,所以只有一个MainActivity.clas,所以这里肯定是要先想办法得到BuildConfig.class和R.class。

输入命令:

aapt p -f -m -J 输出路径 -S res路径 -I android.jar路径 -M Manifest路径

下一步,我们需要BuildConfig.class

这个BuildConfig.java是由gradle在我们配置好gradle之后自己帮我们生成的,所以我们直接拿来用,然后再javac就得到class文件了

然后我们再编译我们的MainActivity.java并将它们放到同一个文件夹下, MainActivity因为引用了Android.jar和R文件,所以编译时注意点,我为此被动好好的复习了一遍javac,都是泪

最后一步,我们用dx工具就能打出dex文件了

然后执行命令就得到一个Dex文件,看看这个文件里面和上面直接打出的apk中的Dex文件有什么不同:

看图,我们上一步已经生成.dex了,那么我们需要和compiled Resource 还有 Other Resource 一起生成APK。

我们先来生成compiled Resource,也就是resources.arsc

发现之前使用aapt生成R文件的时候没写完整,当时可以加一个-F参数直接生成arsc和Manifest

导出的abc.zip里面就有resources.arsc和AndroidManifest.xml。

因为之前写漏了,所以肯定要重新编一次MainActivity.java和Dex

我们把刚才的dex文件和aapt生成的resources.arsc、AndroidManifest.xml和res放到一个文件夹里面。

PS:res文件夹也是上面aapt的命令生成的

然后我们对比这个文件夹和之前apk解压的文件夹

最后运行

看来是成功了。

再说说遇到的还有两个问题,并说下我解决问题的思路

(1)我把它们都放到一个文件夹之后,我压缩成压缩包,然后改后缀成.apk,然后发现安装不了,我就直接反编译,发现发编译失败,提示包有问题,以我多点玩包的经验,我感觉就是压缩工具出了问题,然后我去下个“好压”(这不是广告啊),然后就能正常反编译了。

(2)但是还是安装不了,再根据我多年的玩包经验,我感觉是签名问题,然后我随便给这个包上一个签名,就能正常安装得到上图的结果了。

总体来说,还真挺好玩的,这整个过程,就是翻车了几次。做完之后感觉非常牛逼,为什么这样说,因为我知道这整个过程,我就可以做到,我不经过gradle来打包,我自己写个python脚本来调用aapt和dx来打包也是能做到的。

当然上面纯属异想天开,因为这是个什么都没有的Demo所以觉得简单,要是一个真实的项目,我感觉肯定要有很多坑,别的先不说,一个项目那么多依赖关系,我这javac要搞死人。

最后如果有不对的地方,希望有大佬能够指出,毕竟能运行也不能证明完全没问题。然后我使用的build-tools是28的,不敢保证其它版本包括以后版本的玩法都一样。

如何反编译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:\developer\tools\test_apk\dex2jar-0.0.9.15dex2jar.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\distkeytool -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\distjarsigner -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,不能直接替换(因为签名不一样)

android 怎么进行反编译

下载附件解压在桌面,打开桌面Android lollipop special文件夹里点击Android lollipop special.bat文件输入apktool回车测试apktool可用性 提取ROM里的框架和ui 放在桌面Android lollipop special文件夹里点击Android lollipop special.bat文件输入apktool if framework-res.apk回车加载框架完成 反编译ui打开桌面Android lollipop special文件夹里点击Android lollipop special.bat文件输入apktool d SystemUI.apk回车反编译完成 回编译ui打开桌面Android lollipop special文件夹里点击Android lollipop special.bat文件输入apktool b SystemUI回车回编译完成

反编译Android APK的具体步骤是怎样的

反编译步骤方法:

一、apk反编译得到程序的源代码、图片、XML配置、语言资源等文件

下载上述工具中的apktool,解压得到3个文件:aapt.exe,apktool.bat,apktool.jar ,将需要反编译的APK文件放到该目录下,

打开命令行界面(运行-CMD) ,定位到apktool文件夹,输入以下命令:apktool.bat d -f  test.apk  test

(命令中test.apk指的是要反编译的APK文件全名,test为反编译后资源文件存放的目录名称,即为:apktool.bat   d  -f    [apk文件 ]   [输出文件夹])

说明获取成功,之后发现在文件夹下多了个test文件,点击便可以查看该应用的所有资源文件了。

如果想将反编译完的文件重新打包成apk,那可以:输入apktool.bat   b    test(编译出来文件夹)便可

之后在之前的test文件下便可以发现多了2个文件夹:

build

dist(里面存放着打包出来的APK文件)

二、Apk反编译得到Java源代码

下载上述工具中的dex2jar和jd-gui ,解压

将要反编译的APK后缀名改为.rar或则 .zip,并解压,得到其中的额classes.dex文件(它就是java文件编译再通过dx工具打包而成的),将获取到的classes.dex放到之前解压出来的工具dex2jar-0.0.9.15 文件夹内,

在命令行下定位到dex2jar.bat所在目录,输入dex2jar.bat   classes.dex

在改目录下会生成一个classes_dex2jar.jar的文件,然后打开工具jd-gui文件夹里的jd-gui.exe,之后用该工具打开之前生成的classes_dex2jar.jar文件,便可以看到源码了

被混淆过的效果图(类文件名称以及里面的方法名称都会以a,b,c....之类的样式命名):

三、 图形化反编译apk

上述步骤一、二讲述了命令行反编译apk,现在提供一种图形化反编译工具:Androidfby

首先,下载上述反编译工具包,打开Androidfby目录,双击Android反编译工具.exe,就可以浏览打开要反编译的apk

通过反编译,可以获知该应用用到了什么第3方的库文件,它的代码是如何编写的等等。

然而,如果该APK进行了混淆处理,那么看到的类文件名称以及里面的方法名称都会以a,b,c....之类的样式命名,所以可以想找到所想得知的界面代码可能会十分费劲,找到了代码可能看起来也会很费劲,可是一个大体的思路会获得,有了这个思路,就可以去尝试了。

Android 如何对apk文件进行反编译以及重新

第一:使用apktool直接反编译apk

第二:apk中包含的内容

第三:进入到hellodemo\smali\com\example\hello,打开MainActivity.smali。找到:

const-string v1, "\u4f60\u597d",

修改为:

const-string v1, "hello",

第四:然后在命令行输入:apktool b hellodemo hellodemo1.apk。这回重新打包成hellodemo1.apk。

第五:然后给新生成的apk进行签名。把这个apk拷贝到autosign的目录下面,然后切换过去,在命令行输入:java -jar signapk.jar testkey.x509.pem testkey.pk8 hellodemo1.apk hellodemo.apk。

第六:把生成的hellodemo.apk安装到手机,可以看到主界面上已经显示的是hello,而不再是你好。说明反编译重新打包成功!


名称栏目:android反编译,android反编译工具mercury
文章源于:http://scyanting.com/article/dscpeie.html