java 手机号码正帽,Android逆向-java代码基础(5)

本文详细讲解了Java中的if-else逻辑判断,并通过实例演示了其对应的Smali代码分析。首先展示了Java简单判断逻辑的代码,然后反编译成Smali,分析了Smali文件中涉及的Scanner输入、条件判断和输出流程。接着,指导如何编写Smali代码实现相同功能,包括初始化、变量赋值、条件判断和输出。文章适合对Android逆向工程和Java-Smali转换感兴趣的读者。
摘要由CSDN通过智能技术生成

@[toc]

0x00 前言

微博HAI_AI_ZHUZHU

i春秋HAI_

这节主要讲讲关于java的if else逻辑判断语句的结构以及smali文件的分析。

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.编译运行

o_1cvajbb3s15k01e4r1jmf2gcr8va.png-w.jpg

编译成功,然后运行结果,这是最简单的java if...else 语言。

0x02 demo smali 分析

1.反编译成smali文件。

2.smali 具体分析

.class public Lpanduan;

.super Ljava/lang/Object;

.source "panduan.java"

# direct methods

.method public constructor ()V

.registers 1

.prologue

.line 2

invoke-direct {p0}, Ljava/lang/Object;->()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;->(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来进行输入流程。

具体分析看看:Android逆向-java代码基础(4)

o_1cvani1fs1u5mrdbt0417f7hdfa.png-w.jpg

2.2 smali第二个部分

o_1cvanj1gb1iqd19e4vgbapeoi3a.png-w.jpg

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 第三个部分

o_1cvanjmq4d0n1d4ulsp108rgtga.png-w.jpg

第三个部分的内容很好理解,就是有一个名为:goto_15的模块,这个模块的主要功能就是return-void也就是结束当前程序的意思。

2.4 smali 第四个部分

o_1cvank80410ap10qcqur1ir21pmoa.png-w.jpg

第四个部分就是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 ()V

.registers 1

.prologue

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

return-void

.end method

3.开始编写我们的main函数。

我们实现一个简单的逻辑,通过输入一个数字,然后判断这个数字是不是5。

3.1 写好main的框架。

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

.end method

o_1cvanks7gis9ehsri41o3f14e0a.png-w.jpg

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;->(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;->(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;->(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 结束语句

o_1c3shdvahmit1sc0cmv1ap8dfoa.png-w.jpg

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循环的时候可能需要进行一个练习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值