-
-
[原创]apk文件diy之添加Toast
-
发表于:
2012-3-31 14:46
16122
-
想到以前window下,通过加汇编可以添加一个自己的MessageBox,那在android下能否实现了,花了一上午的时间,可以的,实验成功,下面我们看下具体操作方法。
1. 环境:android 2.1 ,API level 7
原程序很简单,就是打印一句话:System.out.println("onCreate");
我们要做的有2点
a.改它的打印输出为:onCreate+001
b.添加一个Toast,相应代码为:
Toast.makeText(EX05_01.this ,"Toast", Toast.LENGTH_LONG).show();
2. 我们先用ApkTool_GUI反编译,EX05_01开头的有2个,改这个
图1:
找到println,改上面的const-string即可,如图所示
图2:
重新编译,ok。在这可能有人会遇到问题。好像说是签名的什么问题,这有两个解决方法
a.我用的是AVD7,删掉这个,在重新新建个,就可以了,网上说其实只用删除某个文件即可,我没找到
b.如果上面方法不行,再建个AVD,API level 8,这下总可以了吧。
3. 接下来我们看如何添加Toast
先回忆下windows下我们是如何做的:invoke MessageBox, 0, addr szUrl, addr szPath, MB_OK
对应的汇编:
图3:
写程序参数是从左往右,汇编压栈是从右往左
MB_OK 对应0,然后是标题和内容。为什么要说这了,接下来会用的着。
我们将要添加的Toast代码为:
const-string v0, "Toast+gogo"
const/4 v1, 0x1
invoke-static {p0, v0, v1}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
move-result-object v0
invoke-virtual {v0}, Landroid/widget/Toast;->show()V
就添加在Ljava/io/PrintStream;->println(Ljava/lang/String;)V的下面
图4:
这里解释一下
a. const-string v0, "Toast+001",字串常量,对应Toast.makeText(EX05_01.this ,"Toast", Toast.LENGTH_LONG).show();的第二个参数。
b. const/4 v1, 0x1 16进制,对应Toast.LENGTH_LONG常量
c. invoke-static {p0, v0, v1}, Landroid/widget/Toast;->makeText,调用. makeText()方法, 这个很重要了
它这个参数顺序是一一对应的,这个p0解释一下,往上翻,看到这个
图5:
这个就是class.this,对了,这为什么是invoke-static?
图6:
d. move-result-object v0 调用结果返回值为v0
e. invoke-virtual {v0}, Landroid/widget/Toast;->show()V 调用show()方法
图7:
好了,到这就可以了,重新编译运行。出现了我们想要结果
图8:
在逆向看下
图9:
改后的文件: EX05_01.apk
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!