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

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5199|回复: 9
收起左侧

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

[复制链接]
BubblePig 发表于 2018-1-21 21:56

[TOC]

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

免费评分

参与人数 6威望 +1 吾爱币 +13 热心值 +5 收起 理由
djndjndjn + 1 + 1 用心讨论,共获提升!
疯了算了 + 1 + 1 谢谢@Thanks!
龙不死 + 1 我很赞同!
qtfreet00 + 1 + 9 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
chjian92 + 1 + 1 用心讨论,共获提升!
Night_月殇 + 1 谢谢@Thanks!

查看全部评分

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

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
一起学习,吃爪
您需要登录后才可以回帖 登录 | 注册[Register]

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

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

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

GMT+8, 2024-4-25 02:02

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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