BubblePig 发表于 2018-1-21 21:56

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


# 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.类继承模块
## 之前文章
(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)
(https://www.52pojie.cn/thread-689279-1-1.html)

#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运行结果
![这里写图片描述](http://t1.aixinxi.net/o_1c4b805gv1l398ucj416c617d8a.png-j.jpg)
#0x02 .class文件分析
刚才突然想到Sublime Text这么好用可以不可以打开class文件,就简单的尝试了一下。真的打开了,这个就很厉害了,而且可以修改,感觉是很方便的,最喜欢Sublime Text的一点就是打开速度快,不用等很久。
![这里写图片描述](http://t1.aixinxi.net/o_1c4b876hs1t441lpcv3a1ik4hmja.png-j.jpg)
## 1.field分析
对于在类中定义的若干个字段,经过JVM编译成class文件后,会将相应的字段信息组织到一个叫做字段表集合的结构中。我们就主要来看看这个结构。
我们先在二进制文件中找到field的位置。
![这里写图片描述](http://t1.aixinxi.net/o_1c4b8mfp91quariebos1u4c1q9fa.png-j.jpg)
field的位置就在接口索引之后,显示一个field计数器,然后就是n个field_info结构,计数器是多少就有多少个field_info结构。
## 2.field_info分析
我们来看一看field_info的具体结构分析
![这里写图片描述](http://t1.aixinxi.net/o_1c4b9nndi1tk21e2o1e983m41283a.png-j.jpg)
## 3.access_flags分析
首先access_flags占两个字节。
我们来具体看看access_flags的具体内容。
![这里写图片描述](http://t1.aixinxi.net/o_1c4baf4a514ec17vuvbo7efjpa.png-j.jpg)
## 4.access_flags实例
我们来看一下我们demo中的access_flags的内容。
![这里写图片描述](http://t1.aixinxi.net/o_1c4bai1icqe81f8h9b7g6kosla.png-j.jpg)
demo中的访问标志位是00 01,换成二进制就是 0000 0000 0000 0001,也就是在16位上是1,说明我们demo中使用的一个类变量为public关键字修饰的。
## 5.ConstantValue分析
最后我们来看一下这个属性表里的具体内容。
![这里写图片描述](http://t1.aixinxi.net/o_1c4bb8bn2jeoa3lmih1b8p11soa.png-j.jpg)
来看一下实例的分析。
![这里写图片描述](http://t1.aixinxi.net/o_1c4bcjc38pouh0s4ponpof50a.png-j.jpg)
这里是索引到#8
![这里写图片描述](http://t1.aixinxi.net/o_1c4bcl37qvh41oqc1f8phag1n6ea.png-j.jpg)
然后接着来看类型索引。
![这里写图片描述](http://t1.aixinxi.net/o_1c4bcn0671h2jfh711533b71epta.png-j.jpg)
然后来查看索引表。
![这里写图片描述](http://t1.aixinxi.net/o_1c4bcsj1pi09atvv4sqdfpqa.png-j.jpg)
这里的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
![这里写图片描述](http://t1.aixinxi.net/o_1c4cd3lce1pbg1kidptbp5b1b9ba.png-j.jpg)
这里和我们之前的有一点不一样了,多了一行。肉眼一看就知道是我们定义的一个类中变量。
我们来具体分析一下。

```
iput v0, p0, Ldemo;->a:I
```
iput解释:Puts vx into an instance field. The instance is referenced by vy.。本人英语一般,完全依靠有道存活。
将vx放入实例字段中。实例由vy引用。
##2.main
![这里写图片描述](http://t1.aixinxi.net/o_1c4cemhck1v7d0r6oa166c9ela.png-j.jpg)
### 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输出模块的内容可以参照之前的内容。

netCheney 发表于 2018-1-21 22:09

沙发,很不错的基础知识,顶一下,支持楼主,但是不知楼主为啥发了两个一模一样的帖子??

黑色魔方 发表于 2018-1-22 01:16

感谢分享

psp7456 发表于 2018-1-22 07:36

不错,学习了,谢谢分享!

onebestme 发表于 2018-1-22 13:18

来看看,支持楼主

Night_月殇 发表于 2018-1-22 14:03

已收藏,学习学习,支持一个

prologic 发表于 2018-1-22 14:27

详细易懂,太棒了,谢谢楼主!

BubblePig 发表于 2018-1-22 18:54

netCheney 发表于 2018-1-21 22:09
沙发,很不错的基础知识,顶一下,支持楼主,但是不知楼主为啥发了两个一模一样的帖子??

昨天家里网卡

龙不死 发表于 2018-1-23 11:21

非常完美 开始追你的课

yuhuaMbps123 发表于 2020-7-8 13:28

一起学习,吃爪
页: [1]
查看完整版本: Android逆向-java代码基础(7)