吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5625|回复: 13
收起左侧

[Android 原创] Android逆向-java代码基础(6)

[复制链接]
BubblePig 发表于 2018-1-20 00:58

[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学习到类里方法以及其他知识的时候进行研究了。

点评

通俗易懂,哪个说不配给精华,俺都不干!下次咱自己的文章能编到这个份上俺就踏实了~~  发表于 2018-2-2 22:15

免费评分

参与人数 6威望 +1 吾爱币 +15 热心值 +6 收起 理由
qtfreet00 + 1 + 9 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
寒蝉鸣泣之时 + 1 + 1 谢谢@Thanks!
hejialong + 2 + 1 谢谢@Thanks!
xinkui + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
lin_xop + 1 + 1 热心回复!
wxue + 1 + 1 谢谢@Thanks!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 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
看着感觉挺不错
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 16:12

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表