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输出模块的内容可以参照之前的内容。