0x00 前言
不知所以然,请看
以及java系列:
内容
1.两个按钮时smali 逻辑
2.逆向增加按钮逻辑功能
3.制作一个辅助的python工具
扩展内容
Android 动态加载控件
环境
Android Studio
Android Killer
Submit Text
0x01 双按钮逻辑
我们直接在原来的demo上改了。
1. 布局增加按钮
我们增加一个逻辑为清楚我们输入框的内容的按钮。
2.绑定控件
3.增加逻辑
4.生成apk测试
5.结束语
这里只是做一个简单的复习
0x01 双按钮反编译
1.反编译
2.观察结构
这里我们发现有两个mainActivity
l了,就猜测是不是一个逻辑对应一个
l
了
,
就
猜
测
是
不
是
一
个
逻
辑
对
应
一
个
,我们来看看
3. 第一个$
.class Lcom/example/hanlei/first_demo/MainActivity$1;
.super Ljava/lang/Object;
.source "MainActivity.java"
# interfaces
.implements Landroid/view/View$OnClickListener;
# annotations
.annotation system Ldalvik/annotation/EnclosingMethod;
value = Lcom/example/hanlei/first_demo/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/example/hanlei/first_demo/MainActivity;
# direct methods
.method constructor <init>(Lcom/example/hanlei/first_demo/MainActivity;)V
.locals 0
.param p1, "this$0" # Lcom/example/hanlei/first_demo/MainActivity;
.prologue
.line 23
iput-object p1, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity;
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
# virtual methods
.method public onClick(Landroid/view/View;)V
.locals 2
.param p1, "v" # Landroid/view/View;
.prologue
.line 26
iget-object v0, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity;
# getter for: Lcom/example/hanlei/first_demo/MainActivity;->out:Landroid/widget/TextView;
invoke-static {v0}, Lcom/example/hanlei/first_demo/MainActivity;->access$100(Lcom/example/hanlei/first_demo/MainActivity;)Landroid/widget/TextView;
move-result-object v0
iget-object v1, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity;
# getter for: Lcom/example/hanlei/first_demo/MainActivity;->in:Landroid/widget/EditText;
invoke-static {v1}, Lcom/example/hanlei/first_demo/MainActivity;->access$000(Lcom/example/hanlei/first_demo/MainActivity;)Landroid/widget/EditText;
move-result-object v1
invoke-virtual {v1}, Landroid/widget/EditText;->getText()Landroid/text/Editable;
move-result-object v1
invoke-virtual {v1}, Ljava/lang/Object;->toString()Ljava/lang/String;
move-result-object v1
invoke-virtual {v0, v1}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
.line 27
return-void
.end method
这个就是第一个按钮的逻辑,我们的重点是第二个按钮,
4.第二个$
.class Lcom/example/hanlei/first_demo/MainActivity$2;
.super Ljava/lang/Object;
.source "MainActivity.java"
# interfaces
.implements Landroid/view/View$OnClickListener;
# annotations
.annotation system Ldalvik/annotation/EnclosingMethod;
value = Lcom/example/hanlei/first_demo/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/example/hanlei/first_demo/MainActivity;
# direct methods
.method constructor <init>(Lcom/example/hanlei/first_demo/MainActivity;)V
.locals 0
.param p1, "this$0" # Lcom/example/hanlei/first_demo/MainActivity;
.prologue
.line 29
iput-object p1, p0, Lcom/example/hanlei/first_demo/MainActivity$2;->this$0:Lcom/example/hanlei/first_demo/MainActivity;
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
# virtual methods
.method public onClick(Landroid/view/View;)V
.locals 2
.param p1, "v" # Landroid/view/View;
.prologue
.line 32
iget-object v0, p0, Lcom/example/hanlei/first_demo/MainActivity$2;->this$0:Lcom/example/hanlei/first_demo/MainActivity;
# getter for: Lcom/example/hanlei/first_demo/MainActivity;->in:Landroid/widget/EditText;
invoke-static {v0}, Lcom/example/hanlei/first_demo/MainActivity;->access$000(Lcom/example/hanlei/first_demo/MainActivity;)Landroid/widget/EditText;
move-result-object v0
const-string v1, ""
invoke-virtual {v0, v1}, Landroid/widget/EditText;->setText(Ljava/lang/CharSequence;)V
.line 33
iget-object v0, p0, Lcom/example/hanlei/first_demo/MainActivity$2;->this$0:Lcom/example/hanlei/first_demo/MainActivity;
# getter for: Lcom/example/hanlei/first_demo/MainActivity;->out:Landroid/widget/TextView;
invoke-static {v0}, Lcom/example/hanlei/first_demo/MainActivity;->access$100(Lcom/example/hanlei/first_demo/MainActivity;)Landroid/widget/TextView;
move-result-object v0
const-string v1, ""
invoke-virtual {v0, v1}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
.line 34
return-void
.end method
4.1 第一个部分
这个是$2的内容
这个是$1的内容
这里我们发现除了名字之外其他的都一样。
4.2 第二个部分
这个是$1的代码
# instance fields
.field final synthetic this$0:Lcom/example/hanlei/first_demo/MainActivity;
# direct methods
.method constructor <init>(Lcom/example/hanlei/first_demo/MainActivity;)V
.locals 0
.param p1, "this$0" # Lcom/example/hanlei/first_demo/MainActivity;
.prologue
.line 23
iput-object p1, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity;
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
这个是第二个$的代码
# instance fields
.field final synthetic this$0:Lcom/example/hanlei/first_demo/MainActivity;
# direct methods
.method constructor <init>(Lcom/example/hanlei/first_demo/MainActivity;)V
.locals 0
.param p1, "this$0" # Lcom/example/hanlei/first_demo/MainActivity;
.prologue
.line 29
iput-object p1, p0, Lcom/example/hanlei/first_demo/MainActivity$2;->this$0:Lcom/example/hanlei/first_demo/MainActivity;
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
这里我们发现两个的内容还是一样的。
第三个部分onClick
首先来看相同的部分
$1代码
.locals 2
.param p1, "v" # Landroid/view/View;
$2代码
.locals 2
.param p1, "v" # Landroid/view/View;
调用控件方式
调用TextView
iget-object v0, p0, Lcom/example/hanlei/first_demo/MainActivity$2;->this$0:Lcom/example/hanlei/first_demo/MainActivity;
# getter for: Lcom/example/hanlei/first_demo/MainActivity;->out:Landroid/widget/TextView;
invoke-static {v0}, Lcom/example/hanlei/first_demo/MainActivity;->access$100(Lcom/example/hanlei/first_demo/MainActivity;)Landroid/widget/TextView;
move-result-object v0
调用EditText
iget-object v0, p0, Lcom/example/hanlei/first_demo/MainActivity$2;->this$0:Lcom/example/hanlei/first_demo/MainActivity;
# getter for: Lcom/example/hanlei/first_demo/MainActivity;->in:Landroid/widget/EditText;
invoke-static {v0}, Lcom/example/hanlei/first_demo/MainActivity;->access$000(Lcom/example/hanlei/first_demo/MainActivity;)Landroid/widget/EditText;
move-result-object v0
调用set方法
invoke-virtual {v0, v1}, Landroid/widget/EditText;->setText(Ljava/lang/CharSequence;)V
调用get方法
invoke-virtual {v1}, Landroid/widget/EditText;->getText()Landroid/text/Editable;
调用逻辑模块
关键代码
new-instance v1, Lcom/example/hanlei/first_demo/MainActivity$2;
invoke-direct {v1, p0}, Lcom/example/hanlei/first_demo/MainActivity$2;-><init>(Lcom/example/hanlei/first_demo/MainActivity;)V
0x02 增加按钮逻辑功能
功能说明:
增加一个按钮,按下之后让TextView变成猪猪520。
增加一个按钮控件
增加变量
绑定控件
增加监听事件
书写 $3
.class Lcom/example/hanlei/first_demo/MainActivity$3;
.super Ljava/lang/Object;
.source "MainActivity.java"
# interfaces
.implements Landroid/view/View$OnClickListener;
# annotations
.annotation system Ldalvik/annotation/EnclosingMethod;
value = Lcom/example/hanlei/first_demo/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/example/hanlei/first_demo/MainActivity;
# direct methods
.method constructor <init>(Lcom/example/hanlei/first_demo/MainActivity;)V
.locals 0
.param p1, "this$0" # Lcom/example/hanlei/first_demo/MainActivity;
.prologue
.line 23
iput-object p1, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity;
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
# virtual methods
.method public onClick(Landroid/view/View;)V
.locals 2
.param p1, "v" # Landroid/view/View;
.prologue
.line 26
iget-object v0, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity;
# getter for: Lcom/example/hanlei/first_demo/MainActivity;->out:Landroid/widget/TextView;
invoke-static {v0}, Lcom/example/hanlei/first_demo/MainActivity;->access$100(Lcom/example/hanlei/first_demo/MainActivity;)Landroid/widget/TextView;
move-result-object v0
const-string v1, "猪猪520"
invoke-virtual {v0, v1}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
.line 27
return-void
.end method
反编译测试
测试失败。
可能是什么地方出了,问题,然后进行了一系列的修改,虽然反编译成功了,但是安装却处理问题。
看来应该了解一下R.文件访问的问题了。
失败总结
在更改的时候发现了很多问题,在现阶段的我们还是要涉及很多东西的,所以我们现在还是直接使用已经有的东西来进行更改其逻辑操作好了。
结束语
虽然这里失败了。但是确有一定的意义,这次只是静态修改失败了,应该还可以使用动态增加控件来操作的。
0x03 python辅助工具
因为反编译的时候没有提示所以把我们需要的代码保存在python文件里。
工具很简单就是设计一个输入输出。
import sys,getopt
def zhuzhu():
print '---------------------------'
print '| c 1.0 |'
print '| -------love zhuzhu |'
print '| HAI_ZHU |'
print '----------------------------'
def help():
print "-t TextView"
print "-b Button"
print "-e EditText"
def main(argv):
try:
opts,args=getopt.getopt(argv,"htbe")
except getopt.GetoptError:
print "This is bad!"
print "You can enter -h for help."
sys.exit()
for opt,arg in opts:
if opt=="-h":
help()
sys.exit()
if opt in ("-t"):
print '<TextView android:id="+"@id/" android:layout_width="wrap_content" android:layout_height="wrap_content" />'
if opt in ("-e"):
print '<EditText android:id="@id/" android:layout_width="wrap_content" android:layout_height="wrap_content" />'
if opt in ("-b"):
print '<Button android:id="@id/" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="" />'
zhuzhu()
if __name__=="__main__":
main(sys.argv[1:])
0x04 结束
2018年2月2日19:49:40
学习收获
1.Android 布局等知识点学习
2.逻辑书写
3.逆向逻辑书写
4.python代码练习两遍。
5.smali分析熟练