首页
社区
课程
招聘
[原创]apk文件添加AlertDialog对话框
2012-6-26 17:56 22633

[原创]apk文件添加AlertDialog对话框

2012-6-26 17:56
22633
今天研究了一下apk文件添加AlertDialog对话框,搞了一天终于搞定了,发个破文分享一下
使用到的工具:ApktoolGui v2.0 Final(http://bbs.pediy.com/showthread.php?t=148006有下载)
添加对话框的软件:合金弹头v1.8

首先添加一个最简单的应用,就是弹出一个消息框,在android中可以这样实现

new AlertDialog.Builder(self)
.setTitle("普通对话框")
.setMessage("你好,Android!")
.show();
转化成smali如下图:

具体语法解释见http://bbs.pediy.com/showthread.php?t=151769中我的回帖。
将合金弹头反编译,将上述smali代码插入MainActivity.smali中的create函数的return-void语句前面,重新编译成apk文件,安装运行

运行成功,O了。

再来点复杂点的吧
下面我们来添加一个带一个确定按钮的对话框,android代码为
new AlertDialog.Builder(this)
           .setTitle("普通对话框")
           .setMessage("你好,Android!")
           .setPositiveButton("确定",
                         new DialogInterface.OnClickListener(){
                                 public void onClick(DialogInterface dialoginterface, int i){
                                     //按钮事件
                                  }
                          })
          .show();
转换成smali语言如下:

我们看到代码中多了以下几条语句
    .line 33
    const-string v2, "\u786e\u5b9a"

    new-instance v3, Lcom/kinglau/mslug/MainActivity$5;

    invoke-direct {v3, p0}, Lcom/kinglau/mslug/MainActivity$5;-><init>(Lcom/kinglau/mslug/MainActivity;)V

    invoke-virtual {v1, v2, v3}, Landroid/app/AlertDialog$Builder;->setPositiveButton(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;

其中还调用了Lcom/kinglau/mslug/MainActivity$5中的内容。MainActivity$5.smali文件的编写如下:
.class Lcom/kinglau/mslug/MainActivity$5;
.super Ljava/lang/Object;
.source "MainActivity.java"

# interfaces
.implements Landroid/content/DialogInterface$OnClickListener;


# annotations
.annotation system Ldalvik/annotation/EnclosingMethod;
    value = Lcom/kinglau/mslug/MainActivity;->onCreate(Landroid/os/Bundle;)V
.end annotation

.annotation system Ldalvik/annotation/InnerClass;
    accessFlags = 0x0
    name = null
.end annotation


# instance fields
.field final synthetic this$0:Lcom/kinglau/mslug/MainActivity;


# direct methods
.method constructor <init>(Lcom/kinglau/mslug/MainActivity;)V
    .locals 0
    .parameter

    .prologue
    .line 1
    iput-object p1, p0, Lcom/kinglau/mslug/MainActivity$5;->this$0:Lcom/kinglau/mslug/MainActivity;

    .line 33
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    return-void
.end method


# virtual methods
.method public onClick(Landroid/content/DialogInterface;I)V
    .locals 0
    .parameter "dialog"
    .parameter "which"

    .prologue
    .line 40
    return-void
.end method

这主要是因为在监控按钮事件时定义了一个内部类,smali对每一个类都应该有一个对应的文件来实现该类的功能。因此我们添加MainActivity$5.smali就是实现监控按钮事件功能。
将smali代码插入,同时将MainActivity$5.smali文件添加到MainActivity.smali文件夹中,编译成apk,安装运行

运行成功

[培训]内核驱动高级班,冲击BAT一流互联网大厂工 作,每周日13:00-18:00直播授课

上传的附件:
收藏
点赞3
打赏
分享
最新回复 (9)
雪    币: 317
活跃值: (67)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
iltgcl 1 2012-6-26 20:10
2
0
不错,赞一个。可以用来弹出注册码.
雪    币: 335
活跃值: (218)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
peterchen 2012-6-27 12:25
3
0
还有注意注入代码时,寄存器平衡问题
雪    币: 1542
活跃值: (300)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
木羊 2012-8-3 11:51
4
0
转smali用啥工具?
雪    币: 118
活跃值: (106)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
pc小波 1 2012-8-3 12:34
5
0
apktool
雪    币: 307
活跃值: (65)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
过既冲云 1 2012-8-22 16:33
6
0
这个寄存器平衡该怎么注意啊。。貌似看多smali代码里面 只有 用寄存器,没有 看到平衡。
雪    币: 218
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
gswxy 2012-9-1 10:02
7
0
这个值得研究下。
软件重启验证不知如何解决?
雪    币: 4
活跃值: (726)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
淡然出尘 2013-12-14 10:44
8
0
额 怎么将安卓代码转化成Smali代码..
雪    币: 4
活跃值: (726)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
淡然出尘 2013-12-14 12:36
9
0






唉 虽然修改成功了
但是我现在还不明白怎么将Android代码转化成Samli代码
还有有些程序没有MainActivity怎么办..
太菜了..
上传的附件:
雪    币: 236
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
piratelzs 2014-11-7 11:09
10
0
直接用apktool。
游客
登录 | 注册 方可回帖
返回