[TOC]
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.
翻译一下就是:计算出vy的长度。然后赋值给vx。
这句是我们之前没有遇到过的。
官方的翻译就是: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学习到类里方法以及其他知识的时候进行研究了。