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

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 23947|回复: 57
收起左侧

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

  [复制链接]
BubblePig 发表于 2018-1-11 10:23

[TOC]

0x00 前言

微博:HAI_AI_ZHUZHU

I春秋:HAI_

看这篇可以先看看之前的文章,进行一个了解。
Android逆向-java代码基础(1)
Android逆向-java代码基础(2)
Android逆向-java代码基础(3)
本次主要讲解关于java的输入和输出的问题。输出一直都在接触,主要还是输入的问题。长话短说,直接进入正题吧。
参考图书:java核心技术

0x01 java输入输出

1.demo

import java.util.*;

public class demo{
        public static void main(String[]args)
        {
                Scanner in=new Scanner(System.in);

                System.out.println("what is your name ?");
                String name =in.nextLine();

                System.out.println("How old are you?");
                int age =in.nextInt();

                System.out.println("Hello,"+name+".Next year,you'll be"+(age+1));
        }
}

这里使用了scanner。
如果需要从控制台进行输入,首先需要构造一个Scanner对象,并与“标准输入流”System.in进行关联。
使用.nextLine来读取一行。
下面是Scanner的API函数的用法:
这里写图片描述

2.编译运行

这里写图片描述

0x02 demo.class分析

1.生成class文件。

生成过程看:Android逆向-java代码基础(1)即可。

2.用二进制文件打开。

这里写图片描述

2.1魔数部分。

这里写图片描述

2.2 版本号部分

这里写图片描述
这里的主版本号为34,十进制就是52。换成版本号就是1.8,1.0的jdk 版本号是45。

2.3 常量池计数器部分。

这里写图片描述
00 41,十进制就是65,证明接下来会有64个cp_info。

2.4 cp_info

这里写图片描述
以上就是64个cp_info。这个不是我们的重点。

2.5 访问标志

这里写图片描述

2.6 类索引

java类源文件经过编译 之后就会生成.class文件,一个class文件代表着一个类,这个class表示的是哪一个类就要靠类索引去判断了。一般在类索引里存的就是类的名字。类索引会索引指向常量池中的cp_info。
看看我们这个文件的类索引。
这里写图片描述
索引的值是00 12 也就是十进制的18。
查看javap生成的文件。
这里写图片描述
demo就是我们这个class的类名。

2.7父类索引

就是该class继承类的索引。同样的索引在常量池里。
这里写图片描述
所有的class都继承了来自于java/lang/Object
这里写图片描述

2.8结束语

感觉到分析的时候有一点难判断的就是关于class常量池的东西,感觉应该写一个程序去完成这个class分析。

0x03 demo.smali分析

1.java转smali

这里是smali代码,看的出来,我们这次smali代码非常长,和我们写的demo有关系。
这里写图片描述
这里写图片描述
这里写图片描述

2.smali语法分析-new-instance

这里写图片描述
首先来看一下这句话的意思。先看下new-instance 的语法格式和含义。
这里写图片描述

3.smali语法分析-sget-object

首先来看看这个语法:
这里写图片描述
这里是我们demo的文件。

这句话的意思就是把System.in存在了v1中。

4.smali语法分析 .line 6

这里写图片描述
line 6的含义就是。
首先把Scanner的实例对象存储在v0,然后把System.in存放在v1中,最后一句话就是调用Scanner的函数,把v0和v1传进去,就是我们写的demo中的第一句。

Scanner in=new Scanner(System.in);

5.smali语法分析 .line8

这里写图片描述
第一句就是把System.out存放在v1中,然后给v2赋值为what is your name ?,最后调用Systen.out的println()方法,把v2传入。相当于demo中的

System.out.println("what is your name?");

6.smali语法分析 .line 9

这里写图片描述
第一句话,调用了v0,v0存放的是我们的Scanner,那么这一句就是Scanner.nextLine()的含义。
第二句就是把Scanner,nextLine的值存入寄存器v1中。

7.smali语法分析 .lin11

这里写图片描述

第一句代码是把System.out存放在v2中。然后给给v3赋值为How old are you?然后再调用v2中的System.out,然后调用println,把v3传入。

相当于demo中的。

System.out.println("How old are you?");

8.smali语法分析 .line14

因为12和13是和上面非常类似的,就不进行分析了,只要来看一下这个进行相加的smali语法。
这里写图片描述
这里我们不熟悉的就是append,就是相加的意思,字符串连接全靠它来实现。

0x04 smali 代码总结

1.信息书写。

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

这里写图片描述
这三行是用smali编程中必写的三行。

2. 通用模块

.method public constructor <init>()V

        .registers 1 # 使用一个寄存器,v0

        .prologue # 从这里开始

        invoke-direct {v0},Ljava/lang/Object;-><init>()V

        return-void 

.end method

这里写图片描述

通过前几次的反编译,发现都有这个部分。那么由此就可以看出这个的重要性。

3.System.out.println

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

.method public constructor <init>()V
        .registers 1

        .prologue

        invoke-direct {p0},Ljava/lang/Object;-><init>()V

        return-void
.end method

.method public static main([Ljava/lang/String;)V
        .registers 3

        .prologue

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

        const-string v1,"Message!"

        invoke-direct {v0,v1},Ljava/io/PrintStream;->println(Ljava/lang/String;)V

        return-void 
.end method

这里写图片描述
知道了System.out.println的smali模块就可以在以后进行动态调试的时候使用。

0x05 结束语

这次主要是针对输入输出,以及对class文件进行进一步的了解了解和学习,还有对smali语法进行一个熟练,为之后的判断逻辑和循环逻辑做准备。
可能会为了class文件专门写一个分析程序出来试试。

免费评分

参与人数 21吾爱币 +21 热心值 +19 收起 理由
东哥在雨中 + 1 + 1 我很赞同!
lunlun118 + 1 + 1 热心回复!
0xxx + 1 我很赞同!
祀尘 + 1 + 1 谢谢@Thanks!
猫KsWeb点Cc + 1 + 1 用心讨论,共获提升!
?﹏從此沉默 + 1 + 1 我很赞同!
supperlitt + 1 + 1 热心回复!
SomnusXZY + 1 + 1 谢谢@Thanks!
hbwazxf + 1 + 1 写的不错。支持你……
Jyd + 1 + 1 我很赞同!
周章章 + 1 + 1 膜拜,高手
debug_cat + 1 + 1 对各种语法,和编译前后的变化流程很深入的了解,佩服,希望楼主可以继续出.
sunnylds7 + 1 + 1 谢谢@Thanks!
evill + 1 + 1 谢谢@Thanks!
鸡儿在学习 + 1 + 1 谢谢@Thanks!
xinkui + 1 + 1 谢谢@Thanks!
efficiencyluo + 1 我很赞同!
寒蝉鸣泣之时 + 1 + 1 谢谢@Thanks!
YT-Lucy + 1 + 1 零基础刚好入门
小乖哟 + 1 + 1 楼主,图片挂啦
honglou + 1 + 1 请勿灌水,提高回帖质量是每位会员应尽的义务!

查看全部评分

本帖被以下淘专辑推荐:

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

honglou 发表于 2018-1-11 10:36
图片都死了
luolin6888 发表于 2018-1-12 12:07
楼主高手  有个问题想请教一下 如果一款手游是用JAVA写的APP 里面用到了伪随机函数 ,能否破解这个伪随机的算法和种子呢 已知的情况是 能知道伪随机的结果
wwwmirage 发表于 2018-1-11 10:37
白凡 发表于 2018-1-11 10:43
图片挂喽~!
by_aka 发表于 2018-1-11 10:59
学习一下
HMRX123 发表于 2018-1-11 12:31
感谢楼主
小乖哟 发表于 2018-1-11 12:47
支持楼主,学习
weliong 发表于 2018-1-11 13:12
东西是好东西 只是我们基本看不到图片
 楼主| BubblePig 发表于 2018-1-11 19:55

图片复活咯
yssun 发表于 2018-1-11 21:32
热心回复,不错。
您需要登录后才可以回帖 登录 | 注册[Register]

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

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

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

GMT+8, 2024-3-28 16:40

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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