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

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

0x00 前言

我们之前复习了java语言,所有简单的知识点如下。已经复习完成的后面会有 √

java基础

1.变量√
2.输入√
3.输出√
4.判断逻辑√
5.顺序逻辑√
6.类中定义
7.类中方法
7.继承
8.封装
9.多态

.class文件

1.魔数√
2.版本号√
3.常亮池√
4.访问标志位√
5.类索引√
6.父类索引√
7.接口索引√
8.field字段
9.method字段

smali文件

1.输出模块√
2.输入模块√
3.定义模块√
4.判断模块√
5.循环模块√
6.类成员定义模块
7.类成员调用模块
8.类方法的定义模块
9.类继承模块

之前文章

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

0x01 java基础-类定义

1.demo

public class demo{
    public int a=4;
    public static void main(String[]args)
    {
        demo d=new demo();
        System.out.println(d.a);
    }
}

demo定义了一个公有变量a,并且在main方法中进行了调用。然后进行输出。

2.demo运行结果

这里写图片描述

0x02 .class文件分析

刚才突然想到Sublime Text这么好用可以不可以打开class文件,就简单的尝试了一下。真的打开了,这个就很厉害了,而且可以修改,感觉是很方便的,最喜欢Sublime Text的一点就是打开速度快,不用等很久。
这里写图片描述

1.field分析

对于在类中定义的若干个字段,经过JVM编译成class文件后,会将相应的字段信息组织到一个叫做字段表集合的结构中。我们就主要来看看这个结构。
我们先在二进制文件中找到field的位置。
这里写图片描述
field的位置就在接口索引之后,显示一个field计数器,然后就是n个field_info结构,计数器是多少就有多少个field_info结构。

2.field_info分析

我们来看一看field_info的具体结构分析
这里写图片描述

3.access_flags分析

首先access_flags占两个字节。
我们来具体看看access_flags的具体内容。
这里写图片描述

4.access_flags实例

我们来看一下我们demo中的access_flags的内容。
这里写图片描述
demo中的访问标志位是00 01,换成二进制就是 0000 0000 0000 0001,也就是在16位上是1,说明我们demo中使用的一个类变量为public关键字修饰的。

5.ConstantValue分析

最后我们来看一下这个属性表里的具体内容。
这里写图片描述
来看一下实例的分析。
这里写图片描述
这里是索引到#8
这里写图片描述
然后接着来看类型索引。
这里写图片描述
然后来查看索引表。
这里写图片描述
这里的I就是我们int的意思。
其他的依次类推就可以了。

6.结束语

在没有学习的时候,感觉很难,但是当自己实际操作的时候发现还是很容易懂的,不过一定要经常复习才可以。

0x03 smali代码分析

首先将class编译成smali文件。
代码如下:

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


# instance fields
.field public a:I


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

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

    .line 2
    const/4 v0, 0x4

    iput v0, p0, Ldemo;->a:I

    return-void
.end method

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

    .prologue
    .line 5
    new-instance v0, Ldemo;

    invoke-direct {v0}, Ldemo;-><init>()V

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

    iget v0, v0, Ldemo;->a:I

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

    .line 7
    return-void
.end method

感觉不支持smali语法高亮,感觉一点都不漂亮。
我们还是一个模块一个模块来进行分析吧。

1.init

这里写图片描述
这里和我们之前的有一点不一样了,多了一行。肉眼一看就知道是我们定义的一个类中变量。
我们来具体分析一下。

iput v0, p0, Ldemo;->a:I

iput解释:Puts vx into an instance field. The instance is referenced by vy.。本人英语一般,完全依靠有道存活。
将vx放入实例字段中。实例由vy引用。

2.main

这里写图片描述

2.1具体分析

new-instance v0, Ldemo;

新建一个变量,名字demo

invoke-direct {v0}, Ldemo;-><init>()V

调用init里的内容

iget v0, v0, Ldemo;->a:I

iget
iget vx, vy, field_id
官方翻译:
Reads an instance field into vx. The instance is referenced by vy.
将vx放入实例字段中。实例由vy引用。
其他的都是println输出模块的内容可以参照之前的内容。

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