Android逆向系列文章— Android基础逆向

Posted i春秋网络安全学院

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android逆向系列文章— Android基础逆向相关的知识,希望对你有一定的参考价值。

本文作者:HAI_

0×00 前言

不知所以然,请看

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

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

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

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

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

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

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

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

以及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)

内容or问题

1.如何写一个登录界面? √
2.逆向分析登录逻辑 √
3.如何暴力绕过一个登录界面? √
4.如何巧妙登录 √
5..如何加广告√
6.如何去广告
7.实例分析

时间

2018年2月4日13:10:42

目的

1.复习登录界面的书写
2.暴力练习
3.获取练习
4.smali代码熟练
5.给自己的app加广告
6.二次打包加广告实战
7.如何去广告

0×01 Android 编程—登录界面

说明

这个是学编程的时候必须要学的,这次我们就不接数据库来操作。也没有注册界面,直接就是一个简单的登录界面。
demo还是按照之前的改。恩,反正我会,我就要偷懒。

1.更改布局

首先一个用户名的框框。
1.jpg

然后一个登录密码的框框。

2.jpg

然后还是一个登录按钮

3.jpg

预览一下我们的界面

4.jpg

好丑,做一个简单的调整,整体代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.hanlei.first_demo.MainActivity">
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/name"
        android:hint="请输入用户名"
    />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/password"
        android:hint="请输入密码"
        />
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/bt"
        android:text="Login"/>
</LinearLayout>

5.jpg

2.绑定控件

恩,为了像一个登录界面,我把name也改了。

所以重新绑定。

6.jpg

3.逻辑书写

  login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (name.getText().toString().equals("zhuzhu")&&Integer.parseInt(ps.getText().toString())==520)
                {
                    startActivity(new Intent(MainActivity.this,Main2Activity.class));
                }
            }
        });

这里涉及到一个知识点。
java String 类型如何转换为int类型。
简单的来说:

Integer.parseInt();

就可以转换了
这里突然想到万一不输入数字怎么办。恩,去改下规范。

 <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/password"
        android:inputType="number"
        android:hint="请输入密码"
        />

这里加了一行只允许输入数字。

测试

7.jpg

0×02 反编译分析

分析嘛,很多次了。老规矩

1. Android Killer

8.jpg

2.找到主要函数

我们找到逻辑判断的地方$1

.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 24
    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 4
    .param p1, "v"    # Landroid/view/View;

    .prologue
    .line 27
    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;->name: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

    invoke-virtual {v0}, Landroid/widget/EditText;->getText()Landroid/text/Editable;

    move-result-object v0

    invoke-virtual {v0}, Ljava/lang/Object;->toString()Ljava/lang/String;

    move-result-object v0

    const-string v1, "zhuzhu"

    invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object ;) Z


    move-result v0

    if-eqz v0, :cond_0

    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;->ps:Landroid/widget/EditText;
    invoke-static {v0}, Lcom/example/hanlei/first_demo/MainActivity;->access$100(Lcom/example/hanlei/first_demo/MainActivity ;) Landroid/widget/EditText
;

    move-result-object v0

    invoke-virtual {v0}, Landroid/widget/EditText;->getText()Landroid/text/Editable;

    move-result-object v0

    invoke-virtual {v0}, Ljava/lang/Object;->toString()Ljava/lang/String;

    move-result-object v0

    invoke-static {v0}, Ljava/lang/Integer;->parseInt(Ljava/lang/String ;) I


    move-result v0

    const/16 v1, 0x208

    if-ne v0, v1, :cond_0

    .line 29
    iget-object v0, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity;

    new-instance v1, Landroid/content/Intent;

    iget-object v2, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity;

    const-class v3, Lcom/example/hanlei/first_demo/Main2Activity;

    invoke-direct {v1, v2, v3}, Landroid/content/Intent;-><init>(Landroid/content/Context;Ljava/lang/Class ;) V


    invoke-virtual {v0, v1}, Lcom/example/hanlei/first_demo/MainActivity;->startActivity(Landroid/content/Intent ;) V


    .line 31
    :cond_0
    return-void
.end method

3.重点逻辑部分

重点逻辑就是如何判断登录的部分

if-eqz v0, :cond_0

    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;->ps:Landroid/widget/EditText;
    invoke-static {v0}, Lcom/example/hanlei/first_demo/MainActivity;->access$100(Lcom/example/hanlei/first_demo/MainActivity ;) Landroid/widget/EditText
;

    move-result-object v0

    invoke-virtual {v0}, Landroid/widget/EditText;->getText()Landroid/text/Editable;

    move-result-object v0

    invoke-virtual {v0}, Ljava/lang/Object;->toString()Ljava/lang/String;

    move-result-object v0

    invoke-static {v0}, Ljava/lang/Integer;->parseInt(Ljava/lang/String ;) I


    move-result v0

    const/16 v1, 0x208

    if-ne v0, v1, :cond_0

    .line 29
    iget-object v0, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity;

    new-instance v1, Landroid/content/Intent;

    iget-object v2, p0, Lcom/example/hanlei/first_demo/MainActivity$1;->this$0:Lcom/example/hanlei/first_demo/MainActivity;

    const-class v3, Lcom/example/hanlei/first_demo/Main2Activity;

    invoke-direct {v1, v2, v3}, Landroid/content/Intent;-><init>(Landroid/content/Context;Ljava/lang/Class ;) V


    invoke-virtual {v0, v1}, Lcom/example/hanlei/first_demo/MainActivity;->startActivity(Landroid/content/Intent ;) V

我们看到了两个if语言
整个逻辑就是先进行一个判断,然后进行另外一个判断。就是满足第一个if语句,然后满足第二个if语句才到结束。
这些smali代码就是我们之前分析过很多次的语句,没有什么难的地方,都很简单的。

0×03 暴力美学

我们来尝试破解。

方法 1

思路

既然有if语句进行判断,那我把if语句删了。编程现在这个样子:

invoke-static {v0}, Lcom/example/hanlei/first_demo/MainActivity;->access$000(Lcom/example/hanlei/first_demo/MainActivity ;) Landroid/widget/EditText
;

    move-result-object v0

    invoke-virtual {v0}, Landroid/widget/EditText;->getText()Landroid/text/Android逆向学习路线

Android逆向基础之ARM汇编语言知识总结

Android逆向基础之ARM汇编语言知识总结

Android 逆向Android 进程注入工具开发 ( 总结 | 源码编译 | 逆向环境搭建使用 | 使用进程注入工具进行逆向操作 ) ★★★

Android逆向进阶——揭开Hook的神秘面纱

Android逆向之手机环境配置