Android逆向-java代码基础(5)
# 0x00 前言
## 微博HAI_AI_ZHUZHU
## i春秋HAI_
这节主要讲讲关于java的if else逻辑判断语句的结构以及smali文件的分析。
##下节链接
https://www.52pojie.cn/thread-689279-1-1.html
# 0x01 java 判断逻辑
##1.demo
```
import java.util.*;
public class panduan{
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int a;
a=in.nextInt();
if(a==1)
System.out.println("True");
else
System.out.println("FALSE");
}
}
```
## 2.编译运行
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/F%7B%60LV%601C2P4WH%5BO$4~EDO@8.png-mylove)
编译成功,然后运行结果,这是最简单的java if...else 语言。
# 0x02 demo smali 分析
## 1.反编译成smali文件。
具体请参考:(https://www.52pojie.cn/thread-690674-1-1.html#18690742_0x04-.class-%E8%BD%AC%E6%8D%A2dex)
## 2.smali 具体分析
```
.class public Lpanduan;
.super Ljava/lang/Object;
.source "panduan.java"
# direct methods
.method public constructor <init>()V
.registers 1
.prologue
.line 2
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
.method public static main([Ljava/lang/String;)V
.registers 3
.prologue
.line 4
new-instance v0, Ljava/util/Scanner;
sget-object v1, Ljava/lang/System;->in:Ljava/io/InputStream;
invoke-direct {v0, v1}, Ljava/util/Scanner;-><init>(Ljava/io/InputStream;)V
.line 6
invoke-virtual {v0}, Ljava/util/Scanner;->nextInt()I
move-result v0
.line 7
const/4 v1, 0x1
if-ne v0, v1, :cond_16
.line 8
sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
const-string v1, "True"
invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
.line 11
:goto_15
return-void
.line 10
:cond_16
sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
const-string v1, "FALSE"
invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
goto :goto_15
.end method
```
### 2.1 smali第一个部分
第一部分主要在完成一件事情,就是调用Scanner来进行输入流程。
具体分析看看:(https://www.52pojie.cn/thread-685752-1-1.html#18555634_2.smali%E8%AF%AD%E6%B3%95%E5%88%86%E6%9E%90-new-instance)
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/$MMS78Y36VGD9%7D8N%60IX%60U%25N.png-mylove)
### 2.2 smali第二个部分
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/%60%5D3%25JX1Q0VBLKW%60RDT%7D0Y%28B.png-mylove)
####2.2.1 第一句
```
const/4 v1,0x1
```
给寄存器v1赋值为1
####2.2.2 第二句
```
if-ne v0,v1,:cond_16
```
如果寄存器v0和寄存器v1相等的话就执行接下来的语句,如果不满足跳转的话,就跳转到cond_16
####2.2.3第三句
接下来的三句话就是我们最常见的println输出结构了,在Android逆向-java代码基础(4)中我们已经生成了我们自己的可用smali使用库。
```
segt-object v0,Ljava/lang/System;->out:Ljava/io/PrintStream
const-string v1,"True"
invoke-virtual {v0,v1},Ljava/io/PrintStream;->println(Ljava/lang/String;)V
```
###2.3 smali 第三个部分
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/GA5%7DM4JDE%7DPLDG%29%60~NG9V_6.png-mylove)
第三个部分的内容很好理解,就是有一个名为:goto_15的模块,这个模块的主要功能就是return-void也就是结束当前程序的意思。
###2.4 smali 第四个部分
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/0_264P1%7DQ$%5BJSBKLV~JD%7B1L.png-mylove)
第四个部分就是cond_16 就是我们刚才在if判断的时候出现的。如果不满足条件的话就会跳转到这个模块。我们来看看这个模块是在实现什么内容吧。
根据之前的经验,一眼就知道这是一个输出模块,输出的内容就是FALSE。
当这个程序结束的时候,那么就是要执行return-void这行语句才可以。
# 0x03 smali 代码编写
这次主要参考反编译的内容进行一个if的smali语句编写。
## 1.编写第一个规范
```
.class public Ldemo;
.super Ljava/lang/Object;
.source "demo.java"
```
这里是基础。
## 2.编写第二个规范
这个模块是必须的。涉及到初始化变量等。
```
.method public constructor <init>()V
.registers 1
.prologue
invoke-direct {p0},Ljava/lang/Object;-><init>()V
return-void
.end method
```
##3.开始编写我们的main函数。
我们实现一个简单的逻辑,通过输入一个数字,然后判断这个数字是不是5。
###3.1 写好main的框架。
```
.method public static main([Ljava/lang/String;)V
.end method
```
![这里写图片描述](http://otufvq0ew.bkt.clouddn.com/0H0G%5D2F%5D@JYW1%7B0VF%25@~E%7BE.png-mylove)
###3.2然后选择使用寄存器的数量
```
.method public static main([Ljava/lang/String;)V
.registers 3
.end method
```
这里使用三个寄存器。
### 3.3 开始
```
.method public static main([Ljava/lang/String;)V
.registers 3
.prologue #代表程序开始
.end method
```
### 3.4 定义一个v0,存储Scanner对象
```
.method public static main([Ljava/lang/String;)V
.registers 3
.prologue
new-instance v0,Ljava/util/Scanner;
sget-object v1,Ljava/lang/System;->in:Ljava/io/InputStream;
.end method
```
### 3.5 使用Scanner调用System.in
```
.method public static main([Ljava/lang/String;)V
.registers 3
.prologue
new-instance v0,Ljava/util/Scanner;
sget-object v1,Ljava/lang/System;->in:Ljava/io/InputStream;
invoke-direct {v0,v1},Ljava/lang/System;-><init>(Ljava/io/InputStream;)V
.end method
```
### 3.6 调用Scanner.nextInt
```
.method public static main([Ljava/lang/String;)V
.registers 3
.prologue
new-instance v0,Ljava/util/Scanner;
sget-object v1,Ljava/lang/System;->in:Ljava/io/InputStream;
invoke-direct {v0,v1},Ljava/lang/System;-><init>(Ljava/io/InputStream;)V
invoke-direct {v0},Ljava/util/Scanner;->nextInt()I
move-result v0
.end method
```
###3.7 定义一个进行比较的变量。
```
.method public static main([Ljava/lang/String;)V
.registers 3
.prologue
new-instance v0,Ljava/util/Scanner;
sget-object v1,Ljava/lang/System;->in:Ljava/io/InputStream;
invoke-direct {v0,v1},Ljava/lang/System;-><init>(Ljava/io/InputStream;)V
invoke-direct {v0},Ljava/util/Scanner;->nextInt()I
move-result v0
const/4 v1,0x5
.end method
```
### 3.8 编写if语句满足内部内容。
```
if-ne v0,v1,:cond_1
sget-object v0,Ljava/lang/System;->out:Ljava/io/PrintStream;
const-string v1,"Yes"
invoke-direct {v0,v1},Ljava/io/PrintStream;->println(Ljava/lang/String;)V
```
编写一个判断条件,如果v0和v1相等的话,就执行以下语句,以下语句的含义就是输出一个yes。
### 3.9 结束语句
![这里写图片描述]()
### 3.10编写code_1模块
如果输入的值不满足条件,那么就要执行code_1模块。
```
:cond_1
sget-object v0,Ljava/lang/System;->out:Ljava/io/PrintStream;
const-string v1,"No"
invoke-direct {v0,v1},Ljava/io/PrintStream;->println(Ljava/lang/string;)V
goto :goto_1
```
##4.结束语
以上就是编写一个if语言的基本操作,之后可能会进行一个模块的总和。在进行完for循环的时候可能需要进行一个练习。 2.2.2 第二句
if-ne v0,v1,:cond_16
如果寄存器v0和寄存器v1相等的话就执行接下来的语句,如果不满足跳转的话,就跳转到cond_16if-eq才是相等,if-ne是不相等。 zjls9933 发表于 2018-1-23 19:00
我居然还是 看不懂代码
只看java代码,不要接触.class文件分析,不要接触smali代码,应该能看的懂。 感谢分享 虽然不懂英语看不懂但是还是非常感谢,希望有一天也可以成为这样子 若沐曦 发表于 2018-1-23 18:36
虽然不懂英语看不懂但是还是非常感谢,希望有一天也可以成为这样子
百度翻译,有道翻译都可以 我居然还是 看不懂代码 学习了,谢谢楼主分享 看看喽,楼主感谢分享 学习了,谢谢分享 学习学习,感谢分享
页:
[1]
2