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

实验环境:

windows + jdk1.6

需要的工具:

1).反编译包apktool.jar  https://code.google.com/p/android-apktool/downloads/list

2).aapt.exe apktool.bat  https://code.google.com/p/android-apktool/downloads/list

3).显示源代码工具( java)JD-GUI http://jd.benow.ca/

4).keytool 和 jarsigner

5).将classes.dex转成jar文件  dex2jar  https://code.google.com/p/dex2jar/

一.看android的源代码

1)将Apkd.apk 用zip解压后,出现了一个classes.dex文件

2014/02/19  19:42    <DIR>          .

2014/02/19  19:42    <DIR>          ..

2014/02/19  15:35            1,656 AndroidManifest.xml

2014/02/19  15:35          687,024 classes.dex

2014/02/19  15:49    <DIR>          META-INF

2014/02/19  15:49    <DIR>          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    <DIR>          build

2014/02/19  17:16    <DIR>          res

2014/02/19  17:16    <DIR>          smali

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

三.APKTOOL的使用

1).decode

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

apktool d <file.apk> <dir>

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

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

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

apktool d –f <file.apk> <dir>

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

2).build

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

apktool b <dir>

这里的<dir>就是刚才你反编译时输入的<dir>(如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 <init>()V

    .locals 0

    .prologue

    .line 8

    invoke-direct {p0}, Landroid/app/Activity;-><init>()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

输入<demo.keystore>的主密码

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

参考 这里 http://developer.android.com/tools/publishing/app-signing.html

六.常见的问题

参考 这里吧,貌似比较不错

七.参考文档

apktool反编译详细使用教程 http://bbs.lidroid.com/forum.php?mod=viewthread&tid=102159

APKTOOL的使用心得 http://www.cnblogs.com/CuriosityWzk/archive/2012/01/06/2315150.html

Signing Your Applications http://developer.android.com/tools/publishing/app-signing.html

Smali--Dalvik虚拟机指令语言-->【android_smali语法学习一】 http://blog.csdn.net/wdaming1986/article/details/8299996

Android中的签名机制 http://wenku.baidu.com/link?url=dLZZuD8yYUXHpkb97XLW9TMJWGpe05_l2TAV7Hxy_mVwHwQ4A57x-aRUYgk1bl6ybaBZwy9NhUI_96ubEg9oehTLkTfNaVlRHsTp4ZYjx-W

http://code.google.com/p/android-apktool/wiki/FrameworkFiles

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容