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

2017-02-13 回答

一.看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,不能直接替换(因为签名不一样)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值