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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36869808/article/details/79111845

0x0 前言

java基础复习系列要到尾声了,这篇文章讲完for循环之后,java复习以及学习就要结束了,就要进行Android开发的逆向进行简单的分析。

1.之前五篇的链接

Android逆向-java代码基础(1)
Android逆向-java代码基础(2)
Android逆向-java代码基础(3)
Android逆向-java代码基础(4)
Android逆向-java代码基础(5)

2.class文件辅助脚本

Android逆向-python写一个.class分析辅助脚本

3.i春秋 HAI_

0x01 java 循环结构

上一篇复习了关于java的逻辑判断结构,这次来复习一下关于java的循环结构。主要以for循环为例。

1.demo

这里写了一个简单的小demo,包括的知识点有数组的定义,输入,以及for基础循环,还有强化for循环。有
直接上代码

import java.util.*;

public class demo{
    public static void main(String[]args)
    {
        Scanner s=new Scanner(System.in);
        int[] arr=new int[5];
        for(int i=0;i<5;i++)
        {
            arr[i]=s.nextInt();
        }  
        for (int i:arr)
        {
            System.out.println(i);
        }

    }
}

2.运行结果

这里写图片描述

0x02 smali 循环结构

首先贴出所有的代码,然后我们再来进行一个分析。

.class public Ldemo;
.super Ljava/lang/Object;
.source "demo.java"


# direct methods
.method public constructor <init>()V
    .registers 1

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

    return-void
.end method

.method public static main([Ljava/lang/String;)V
    .registers 7

    .prologue
    const/4 v5, 0x5

    const/4 v0, 0x0

    .line 6
    new-instance v2, Ljava/util/Scanner;

    sget-object v1, Ljava/lang/System;->in:Ljava/io/InputStream;

    invoke-direct {v2, v1}, Ljava/util/Scanner;-><init>(Ljava/io/InputStream;)V

    .line 7
    new-array v3, v5, [I

    move v1, v0

    .line 8
    :goto_c
    if-ge v1, v5, :cond_17

    .line 10
    invoke-virtual {v2}, Ljava/util/Scanner;->nextInt()I

    move-result v4

    aput v4, v3, v1

    .line 8
    add-int/lit8 v1, v1, 0x1

    goto :goto_c

    .line 12
    :cond_17
    array-length v1, v3

    :goto_18
    if-ge v0, v1, :cond_24

    aget v2, v3, v0

    .line 14
    sget-object v4, Ljava/lang/System;->out:Ljava/io/PrintStream;

    invoke-virtual {v4, v2}, Ljava/io/PrintStream;->println(I)V

    .line 12
    add-int/lit8 v0, v0, 0x1

    goto :goto_18

    .line 17
    :cond_24
    return-void
.end method

我们还是按照模块来进行程序的分析。

1.必要模块

这里写图片描述

2.main函数之Scanner输入模块

这里写图片描述

3.循环模块

3.1 new-array

这里写图片描述

new-array v3, v5, [I

这句话的意思就是定义一个数组,大小为v5,类型为I也就是int型的数组。

3.2 判断模块

这里写图片描述

首先来看看if-ge v1, v5, :cond_17。
官方解释是:Jumps to target if vx>=vy2. vx and vy are integer values.
翻译过来就是说:如果vx>=xy2就跳转到cond_17
如果没有就继续向下运行。

3.3 循环体结构

这里写图片描述
首先是

    invoke-virtual {v2}, Ljava/util/Scanner;->nextInt()I

    move-result v4

把我们输入的值存入v4。
然后来看:

aput v4, v3, v1

我们来看一下翻译:
Puts the integer value in vx into an element of an integer array. The element is indexed by vz, the array object is referenced by vy.
首先是v3是数组的名字。然后v1是数组的索引,v4是存储的值。
然后来看循环体的最后一句话:

add-int/lit8 v1, v1, 0x1

官方翻译:Adds vy to lit8 and stores the result into vx.,就是说给v1加上1然后在赋值给v1,也就是实现了,v1=v1+1的操作。
就这样实现了整个循环。

3.4点睛之笔

这里写图片描述
这里使用跳转+if语句来实现了一个循环语句。

4.加强for循环实现

首先来看看这句话。
这里写图片描述
先来看一下官方的说明:
Calculates the number of elements of the array referenced by vy and puts the length value into vx.
翻译一下就是:计算出vx的长度。然后赋值给vy。
这里写图片描述
这句是我们之前没有遇到过的。
官方的翻译就是:Gets an integer value of an object reference array into vx. The array is referenced by vy and is indexed by vz.说白了就是获取一个数组的对象。
之后的就和前面的循环没有什么差别的,只是多了一个判断数组长度的语句。

5.结束语

本次的smali语法学习就到这里结束了,之后会有一个smali的专题训练进行开展。当然之后会深入java语法以及android开发逆向等学习的教程。还有未完成的class文件的分析。当然这个要等到java学习到类的时候进行分析了。

没有更多推荐了,返回首页