BubblePig 发表于 2018-1-20 00:58

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


# 0x0 前言
java基础复习系列要到尾声了,这篇文章讲完for循环之后,java复习以及学习就要结束了,就要进行Android开发的逆向进行简单的分析。
## 1.之前五篇的链接
(https://www.52pojie.cn/thread-690674-1-1.html)
(https://www.52pojie.cn/thread-684492-1-1.html)
(https://www.52pojie.cn/thread-690679-1-1.html)
(https://www.52pojie.cn/thread-685752-1-1.html)
(https://www.52pojie.cn/thread-690689-1-1.html)
## 2.class文件辅助脚本
(https://www.52pojie.cn/thread-687475-1-1.html)
##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;
                for(int i=0;i<5;i++)
                {
                        arr=s.nextInt();
                }
                for (int i:arr)
                {
                        System.out.println(i);
                }

      }
}
```
##2.运行结果
![这里写图片描述](http://t1.aixinxi.net/o_1c3smnk6j191nmtt1tjj100t1dqda.png-w.jpg)
#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.必要模块
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/%5D%5B_8G%7D@XICJEC%28Q%7DRPAOG%286.png-mylove)
## 2.main函数之Scanner输入模块
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/9P9421%28UF5XA0_2EJ%5D8J2J0.png-mylove)
## 3.循环模块
### 3.1 new-array
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/P3%5DQX%25S56R%293H$6Q@%60%7DT%60C.png-mylove)

```
new-array v3, v5, [I
```
这句话的意思就是定义一个数组,大小为v5,类型为I也就是int型的数组。
###3.2 判断模块
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/%7BXL6VCINABW$FK%28DS%5DMG9ZS.png-mylove)

首先来看看if-ge v1, v5, :cond_17。
官方解释是:Jumps to target if vx>=vy2. vx and vy are integer values.
翻译过来就是说:如果vx>=xy2就跳转到cond_17
如果没有就继续向下运行。
###3.3 循环体结构
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/0L%28%7BECU$NMQCONM46Z%5BPQE9.png-mylove)
首先是

```
    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点睛之笔
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/Z$AP%7B_2B%5B%5DO17JC$AY99YH5.png-mylove)
这里使用跳转+if语句来实现了一个循环语句。
## 4.加强for循环实现
首先来看看这句话。
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/$AW~R%25COCN2%25NZBW@9Q3%7BJ.png-mylove)
先来看一下官方的说明:
Calculates the number of elements of the array referenced by vy and puts the length value into vx.
翻译一下就是:计算出vy的长度。然后赋值给vx。
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/A6%60VK0@FAE%252%296GYVBZ%607U1.png-mylove)
这句是我们之前没有遇到过的。
官方的翻译就是: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学习到类里方法以及其他知识的时候进行研究了。

BubblePig 发表于 2018-1-20 11:01

weliong 发表于 2018-1-20 09:58
array-length v1,v3
翻译的意思应该是:计算V3的长度,把值放到V1里
楼主写反了。


感谢,已修改

weliong 发表于 2018-1-20 09:58

array-length v1,v3
翻译的意思应该是:计算V3的长度,把值放到V1里
楼主写反了。
感谢分享,学习了。

abcABC 发表于 2018-1-20 01:29

分享快乐,谢谢

debug_cat 发表于 2018-1-20 07:18

跟着你学习!!

Tisrop 发表于 2018-1-20 08:23

不错学习了

mayl8822 发表于 2018-1-20 11:33

感谢分享

Alexey 发表于 2018-1-20 11:49

天天影院

Norton 发表于 2018-1-20 11:52

楼主写的很好

ygfygf_888 发表于 2018-1-20 23:14

看着感觉挺不错
页: [1] 2
查看完整版本: Android逆向-java代码基础(6)