[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函数的用法:
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/C%7BH%25KNQ%28J%7D%28%60FXL%60%7BL05%29S.png-mylove)
2.编译运行
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/K0E2_WHEJD54%5BID0W4%7D%7D9E2.png-mylove)
0x02 demo.class分析
1.生成class文件。
生成过程看:Android逆向-java代码基础(1)即可。
2.用二进制文件打开。
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/XJXWV7MBY3%5BK14%25K_O%7DYQNY.png-mylove)
2.1魔数部分。
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/%28_@J5_7QM%5B%7BPFOSL0%29%7BEUGB.png-mylove)
2.2 版本号部分
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/FUHJ%605R0JW@%29%7BVSY%254QDFHE.png-mylove)
这里的主版本号为34,十进制就是52。换成版本号就是1.8,1.0的jdk 版本号是45。
2.3 常量池计数器部分。
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/ISX%5B%60R_TTIDQP%5B5S%7BB%29PKS1.png-mylove)
00 41,十进制就是65,证明接下来会有64个cp_info。
2.4 cp_info
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/%7BQYVZC1SLQ%7B~%5B%7BBM%28SRA@%25L.png-mylove)
以上就是64个cp_info。这个不是我们的重点。
2.5 访问标志
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/LY00JF%5BSF%29P7%5D6R09B@%5B$OL.png-mylove)
2.6 类索引
java类源文件经过编译 之后就会生成.class文件,一个class文件代表着一个类,这个class表示的是哪一个类就要靠类索引去判断了。一般在类索引里存的就是类的名字。类索引会索引指向常量池中的cp_info。
看看我们这个文件的类索引。
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/AS0S8W48%7BU%7D6%605Y5V8DJ_J1.png-mylove)
索引的值是00 12 也就是十进制的18。
查看javap生成的文件。
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/BXK~B%7D~~%5B7%60XJ_99@A624%5DF.png-mylove)
demo就是我们这个class的类名。
2.7父类索引
就是该class继承类的索引。同样的索引在常量池里。
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/O3XXO9KMQC%7B~%5B%7D_VNF5Y3~1.png-mylove)
所有的class都继承了来自于java/lang/Object
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/%5DUBW%5D%5B%7DX~%29PRXY@R@U0WGH6.png-mylove)
2.8结束语
感觉到分析的时候有一点难判断的就是关于class常量池的东西,感觉应该写一个程序去完成这个class分析。
0x03 demo.smali分析
1.java转smali
这里是smali代码,看的出来,我们这次smali代码非常长,和我们写的demo有关系。
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/90O9X4_D%25I9%5B3%5BT9%7D2~%298EG.png-mylove)
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/8JA%5DXST0%5D%60%7DLPJF%28JB%28%7DW2O.png-mylove)
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/A1%5BM%28TNU5UX1~H7CI3%5BTON8.png-mylove)
2.smali语法分析-new-instance
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/I5_6E%25%28%7B7U8D%5BB%5BMM7S%5D@33.png-mylove)
首先来看一下这句话的意思。先看下new-instance 的语法格式和含义。
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/%602J$%25YDDY7WU~N3V8RZE06O.png-mylove)
3.smali语法分析-sget-object
首先来看看这个语法:
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/@$D%7B%7DLRWDBYMRT%5B29WIF~3I.png-mylove)
这里是我们demo的文件。
![](http://otufvq0ew.bkt.clouddn.com/EMX87LQ%29YPAHFKFX@%7BJLL%5BX.png-mylove)
这句话的意思就是把System.in存在了v1中。
4.smali语法分析 .line 6
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/Q%7D2HP2CP%5B7NQ~1V~~44%7DO8R.png-mylove)
line 6的含义就是。
首先把Scanner的实例对象存储在v0,然后把System.in存放在v1中,最后一句话就是调用Scanner的函数,把v0和v1传进去,就是我们写的demo中的第一句。
Scanner in=new Scanner(System.in);
5.smali语法分析 .line8
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/X3D7LUENR9MZAHE1E4%25W%7D@P.png-mylove)
第一句就是把System.out存放在v1中,然后给v2赋值为what is your name ?,最后调用Systen.out的println()方法,把v2传入。相当于demo中的
System.out.println("what is your name?");
6.smali语法分析 .line 9
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/$AANBJM7%5B%7BC%7DNMPW%5DN1~Z9E.png-mylove)
第一句话,调用了v0,v0存放的是我们的Scanner,那么这一句就是Scanner.nextLine()的含义。
第二句就是把Scanner,nextLine的值存入寄存器v1中。
7.smali语法分析 .lin11
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/P%5D3%7DE6%5BD%60TK@H7R%5D8%7D42W3B.png-mylove)
第一句代码是把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语法。
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/QIG$%5B%29$%281PGLSAFU65E%7DKMQ.png-mylove)
这里我们不熟悉的就是append,就是相加的意思,字符串连接全靠它来实现。
0x04 smali 代码总结
1.信息书写。
.class public Ldemo;
.super Ljava/lang/Object;
.source "demo.java"
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/~%7B%7BTE%256JVIK%29PZFAUAU%29%25%60S.png-mylove)
这三行是用smali编程中必写的三行。
2. 通用模块
.method public constructor <init>()V
.registers 1 # 使用一个寄存器,v0
.prologue # 从这里开始
invoke-direct {v0},Ljava/lang/Object;-><init>()V
return-void
.end method
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/E03D~KL@DA1G%5BL%7B8%5D26W%25CC.png-mylove)
通过前几次的反编译,发现都有这个部分。那么由此就可以看出这个的重要性。
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
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/%28TXZ3O%60%7D%60P6%60VW%7B$P$~ACP5.png-mylove)
知道了System.out.println的smali模块就可以在以后进行动态调试的时候使用。
0x05 结束语
这次主要是针对输入输出,以及对class文件进行进一步的了解了解和学习,还有对smali语法进行一个熟练,为之后的判断逻辑和循环逻辑做准备。
可能会为了class文件专门写一个分析程序出来试试。