吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5480|回复: 15
收起左侧

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

  [复制链接]
BubblePig 发表于 2018-1-23 12:58

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

之前文章

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

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或者镜像,小坑随便趴一趴就过了。
第二个就是封装的问题了。
封装就是让外部不能直接调用我的类成员,要通过一些方法间接的访问类中的成员变量。
想要学习封装,就要学会方法的时候。
封装说白了就是一个输入方法和一个输出方法。
这个是输入方法:
这里写图片描述
这个是输出的方法:
这里写图片描述
其他的东西网上应该很多,这里就不啰嗦了。

0x02 .class文件分析

从field字段之后就是method字段,也就是我们今天的主菜了。
惯例先看一下进本的class文件的分析。
这里写图片描述

直奔主题

这里我们就直接分析method字段。首先我们要找到这个字段。
下面是field字段,根据之前的内容进行分析。
这里写图片描述
之后就是我们method字段了。
列子先放着,先来看一看method字段有什么内容吧。
方法表集合是指由若干个方法表(method_info)组成的集合。对于在类中定义的若干个,经过JVM编译成class文件后,会将相应的method方法信息组织到一个叫做方法表集合的结构中,字段表集合是一个类数组结构。

1.method_info结构

这里写图片描述

1.1访问标志:

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

1.2名称索引:

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

1.3描述索引:

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

1.4属性表

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

2.Attribute_info的结构

这里写图片描述
这个内容和之后的smali有重复的地方,在此就不再重复说明。

0x03 smali文件分析

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

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

# instance fields
.field private 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 13
    new-instance v0, Ldemo;

    invoke-direct {v0}, Ldemo;-><init>()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.第一个模块

这里写图片描述
这里就是我们写的方法,这两个方法就是我们的封装方法。
先来看看 getA()方法。
这里写图片描述
iget v0, p0, Ldemo;->a:I
Reads an instance field into vx. The instance is referenced by vy.
就是获得p0,放在v0中,
然后通过return v0进行返回。
然后来看看setA()方法。
这里写图片描述
setA中我们就发现了和Android逆向-java代码基础(7)中一样使用了iput,简单的来说就是把p0给p1。

2.main模块

这里写图片描述
截图截不下了。。。
我们主要想要看到的smali中main函数是怎么调用的封装函数

来看这两句

    new-instance v0, Ldemo;

    invoke-direct {v0}, Ldemo;-><init>()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有很大的帮助。
以上,待补充。

免费评分

参与人数 3威望 +1 吾爱币 +12 热心值 +3 收起 理由
djndjndjn + 1 + 1 用心讨论,共获提升!
Hmily + 1 + 10 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
dwq308 + 1 + 1 解了小白的我的燃眉之急啊

查看全部评分

本帖被以下淘专辑推荐:

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

 楼主| BubblePig 发表于 2018-1-23 19:27
美丽兔兔 发表于 2018-1-23 19:10
感谢大神,smali代码基本理解了
不过这种十六进制的 一大堆文本就不好理解了。不知道这种对逆向  影响大 ...

这种我学来时为了之后能研究虚拟机内存用的,只是算法的话,看不懂也不用着急
美丽兔兔 发表于 2018-1-23 19:10
BubblePig 发表于 2018-1-23 17:30
后续就是我要去复习一下Android了

感谢大神,smali代码基本理解了
不过这种十六进制的 一大堆文本就不好理解了。不知道这种对逆向  影响大不大。。。我主要是逆向分析算法的
二进制.png
debug_cat 发表于 2018-1-23 13:26 来自手机
huanmie 发表于 2018-1-23 13:58
感谢楼主,正准备复习呢。
tanghengvip 发表于 2018-1-23 13:59
你这个代码的配色叫什么?
Hmily 发表于 2018-1-23 16:05
@BubblePig 这个系列1、3、5、6没发布在论坛?方便就整理一下发布论坛吧,我们把系列教程放到新手推荐中。另外最好在每一节帖子上增加上下一节课的链接,方便查找。
 楼主| BubblePig 发表于 2018-1-23 17:19
tanghengvip 发表于 2018-1-23 13:59
你这个代码的配色叫什么?

Submit Text
 楼主| BubblePig 发表于 2018-1-23 17:20
Hmily 发表于 2018-1-23 16:05
@BubblePig 这个系列1、3、5、6没发布在论坛?方便就整理一下发布论坛吧,我们把系列教程放到新手推荐中。 ...

ok~~~~~~
tanghengvip 发表于 2018-1-23 17:22

为什么我的Submit Text3没你的配色好看.......改了半天都跟你不一样~!
我们不一样
美丽兔兔 发表于 2018-1-23 17:25
还有没有后续啊》?
 楼主| BubblePig 发表于 2018-1-23 17:26
tanghengvip 发表于 2018-1-23 17:22
为什么我的Submit Text3没你的配色好看.......改了半天都跟你不一样~!
我们不一样

smali 的是我手动填进去的
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

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

GMT+8, 2024-4-20 23:16

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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