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

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4955|回复: 15
收起左侧

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

[复制链接]
BubblePig 发表于 2018-1-23 18:05

[TOC]

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

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

0x02 demo smali 分析

1.反编译成smali文件。

具体请参考:Android逆向-java代码基础(1)

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来进行输入流程。
具体分析看看:Android逆向-java代码基础(4)
这里写图片描述

2.2 smali第二个部分

这里写图片描述

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

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

2.4 smali 第四个部分

这里写图片描述
第四个部分就是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

这里写图片描述

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

免费评分

参与人数 6威望 +1 吾爱币 +14 热心值 +6 收起 理由
抱书人人 + 1 + 1 谢谢@Thanks!
qtfreet00 + 1 + 9 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
SuperF + 1 + 1 用心讨论,共获提升!
zhiyi1120 + 1 + 1 谢谢@Thanks!
Night_月殇 + 1 + 1 谢谢@Thanks!
生如上善若水 + 1 + 1 谢谢@Thanks!

查看全部评分

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

psp7456 发表于 2018-2-6 11:00
2.2.2 第二句

if-ne v0,v1,:cond_16
如果寄存器v0和寄存器v1相等的话就执行接下来的语句,如果不满足跳转的话,就跳转到cond_16
if-eq才是相等,if-ne是不相等。
 楼主| BubblePig 发表于 2018-1-23 19:09
zjls9933 发表于 2018-1-23 19:00
我居然还是 看不懂代码

只看java代码,不要接触.class文件分析,不要接触smali代码,应该能看的懂。
cldt 发表于 2018-1-23 18:15
若沐曦 发表于 2018-1-23 18:36
虽然不懂英语看不懂但是还是非常感谢,希望有一天也可以成为这样子
 楼主| BubblePig 发表于 2018-1-23 18:46
若沐曦 发表于 2018-1-23 18:36
虽然不懂英语看不懂但是还是非常感谢,希望有一天也可以成为这样子

百度翻译,有道翻译都可以

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
若沐曦 + 1 + 1 我很赞同!

查看全部评分

zjls9933 发表于 2018-1-23 19:00
我居然还是 看不懂代码
生如上善若水 发表于 2018-1-23 22:27
学习了,谢谢楼主分享
wanmei195634 发表于 2018-1-24 00:21
看看喽,楼主感谢分享
生如上善若水 发表于 2018-1-24 09:36
学习了,谢谢分享
Night_月殇 发表于 2018-1-24 10:41
学习学习,感谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

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

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

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

GMT+8, 2024-5-5 11:54

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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