吾爱Java逆向,Android逆向-java代码基础(8)

[TOC]

0x00 前言

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

在Android逆向-java代码基础(7)中已经复习了类中变量的定义。

这节主要是对类中方法进行学习,顺便把分装也学习了,demo就在之前的demo上改。

本教程不主要针对初学者,所以可以挑看懂的看~

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.类继承模块

之前文章

0x01 java复习

1.demo

public class demo{

private int a=4;

public int getA()

{

return this.a;

}

public void setA(int a)

{

this.a=a;

}

public static void main(String[]args)

{

demo d=new demo();

d.setA(1);

System.out.println(d.getA());

}

}

简单的分析

因为一次涉及到两个内容,所以来进行一个简单的分析。

首先第一个就是java的类方法。

不知道学过c语言没有,其实就相当于是c语言中的函数,如果不理解的话,请自行google。

google被墙了,ssl或者镜像,小坑随便趴一趴就过了。

第二个就是封装的问题了。

封装就是让外部不能直接调用我的类成员,要通过一些方法间接的访问类中的成员变量。

想要学习封装,就要学会方法的时候。

封装说白了就是一个输入方法和一个输出方法。

这个是输入方法:

o_1c4chj735c72sp6g581i761a9ca.png-j.jpg

这个是输出的方法:

o_1c4chkuvf7ge1on15ih1knqteia.png-j.jpg

其他的东西网上应该很多,这里就不啰嗦了。

0x02 .class文件分析

从field字段之后就是method字段,也就是我们今天的主菜了。

惯例先看一下进本的class文件的分析。

o_1c4cig9e417ju1a681f9vuee1bo4a.png-j.jpg

直奔主题

这里我们就直接分析method字段。首先我们要找到这个字段。

下面是field字段,根据之前的内容进行分析。

o_1c4ckg1it1tlb1a6p1fsl1gthuala.png-j.jpg

之后就是我们method字段了。

列子先放着,先来看一看method字段有什么内容吧。

方法表集合是指由若干个方法表(method_info)组成的集合。对于在类中定义的若干个,经过JVM编译成class文件后,会将相应的method方法信息组织到一个叫做方法表集合的结构中,字段表集合是一个类数组结构。

1.method_info结构

o_1c4ep286s1ba11ke21ad1eu0il8a.png-j.jpg

1.1访问标志:

访问标志位就是记录这个方法的作用域,静态或者非静态。可变性、是否可同步、是否是本地方法,是否是抽象等信息。

o_1c4erimte97nquhijumasbsba.png-j.jpg

1.2名称索引:

这里是指向常量池的索引,也就是方法的名称

1.3描述索引:

描述索引表示的是这个方法的特征或者说是签名,一个方法会有若干个参数和返回值。

1.4属性表

方法的实现被JVM编译成JVM的机器码指令,机器码指令就存放在一个Code类型的属性表中。

2.Attribute_info的结构

o_1c4epa8jrrgleig1o9n1dqmvl8a.png-j.jpg

这个内容和之后的smali有重复的地方,在此就不再重复说明。

0x03 smali文件分析

首先来看看代码,和之前的有没有什么不一样的内容。

.class public Ldemo;

.super Ljava/lang/Object;

.source "demo.java"

# instance fields

.field private a:I

# direct methods

.method public constructor ()V

.registers 2

.prologue

.line 1

invoke-direct {p0}, Ljava/lang/Object;->()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 13

new-instance v0, Ldemo;

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

.line 14

const/4 v1, 0x1

invoke-virtual {v0, v1}, Ldemo;->setA(I)V

.line 15

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

invoke-virtual {v0}, Ldemo;->getA()I

move-result v0

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

.line 16

return-void

.end method

# virtual methods

.method public getA()I

.registers 2

.prologue

.line 5

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

return v0

.end method

.method public setA(I)V

.registers 2

.prologue

.line 9

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

.line 10

return-void

.end method

1.第一个模块

o_1c4gj8pl6ls6q9t1rupckrkn7a.png-j.jpg

这里就是我们写的方法,这两个方法就是我们的封装方法。

先来看看 getA()方法。

o_1c4gjl9lm17jlchaq5615ip19cea.png-j.jpg

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

Reads an instance field into vx. The instance is referenced by vy.

就是获得p0,放在v0中,

然后通过return v0进行返回。

然后来看看setA()方法。

o_1c4gk42o51g61cb2g3v1dni1eofa.png-j.jpg

setA中我们就发现了和Android逆向-java代码基础(7)中一样使用了iput,简单的来说就是把p0给p1。

2.main模块

o_1c4gkepi71rplv1n99j17r21a9da.png-j.jpg

截图截不下了。。。

我们主要想要看到的smali中main函数是怎么调用的封装函数

来看这两句

new-instance v0, Ldemo;

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

实例化了一个对象。

然后是这两句

const/4 v1, 0x1

invoke-virtual {v0, v1}, Ldemo;->setA(I)V

我们的v0就是实例的对象,v1就是我们输入的数字。然后调用了.setA(I)这个方法,感觉和c语言有一点像。

然后我们来接着来看:

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

invoke-virtual {v0}, Ldemo;->getA()I

move-result v0

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

这四句话就是打印出getA的内容。

小小的纠结一下,要不要把自己已经很明白的知识点全部写出来,之前的都是忽略自己很熟悉的内容,跳着写的。

嗯嗯,还是简单写一下吧。

getA()I,在它的后面有一个I,这个I的含义就是返回一个I的值,也就是说返回值为int,这个是为了更好的解释一下java的返回。

0x4 结束语

以上进本就把一些内容说完了,比如说对.class文件的分析,然后脚本也简单的写了一个,加深一下对python语言的学习。可能之后还有smali语言的练习与整理,也就是把smali整理成一个可以用的小的工具包。

然后就剩下练习,这次复习写完之后,感觉收获有很多。

1.一直在做Android,java的一些基础有一些遗忘,顺便复习。

2.对.class文件没有了解,了解+学习,对以后的JVM虚拟机学习打下基础。

3.对python编程了解和复习,因为之后要用python写一些辅助脚本,所以这里复习还是很有帮助的,记得自己爬坑爬了一整天。

4.最后就是对smali语法的熟悉,对之后的Dalvik有很大的帮助。

以上,待补充。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值