Android逆向-Android基础逆向(4-2)

0x00 前言

不知所以然,请看

Android逆向-Android基础逆向(1)

Android逆向-Android基础逆向(2)

Android逆向-Android基础逆向(2-2)

Android逆向-Android基础逆向(2-3补充篇)

Android逆向-Android基础逆向(3)

Android逆向-Android基础逆向(4)

以及java系列:

Android逆向-java代码基础(1)

Android逆向-java代码基础(2)

Android逆向-java代码基础(3)

Android逆向-java代码基础(4)

Android逆向-java代码基础(5)

Android逆向-java代码基础(6)

Android逆向-java代码基础(7)

Android逆向-java代码基础(8)

内容

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分析熟练

以上

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王嘟嘟_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值