吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5985|回复: 9
收起左侧

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

  [复制链接]
BubblePig 发表于 2018-1-23 17:31

[TOC]

0x00 前言

微博:HAI_AI_ZHUZHU

I春秋:HAI_

下节链接:

Android逆向-java代码基础(4)
看这篇可以先看看之前的文章,进行一个了解。
Android逆向-java代码基础(1)
Android逆向-java代码基础(2)
之前看到有大佬用smali写了一个demo,是一个加法程序。这篇也主要是讲一下关于java的基本的计算,毕竟这个是基础。可能要同时写一下Android基础。
文章里的内容可以选读,里面会有一些问题的解决方式。也可以读一下。

0x01 java 加法运算

这个运算和数学里运算一样,这里写一个简单的demo。

1.int加法

1.1 简单的demo

public class add{
        public static void main(String[]args)
        {
                int a=10;
                int b=11;
                b=a+b;
                System.out.println(b);
        }
}

1.2 编译运行输出结果。

这里写图片描述
结果显示为21;

1.3 class文件探索。

1.3.1 这里是上两节讲的常量池。

这里写图片描述
具体请参考1和2。

1.3.2 访问标志(access_flags)

在常量池之后的内容就是访问标志。
access_flags占2个字节,16位。
当JVM在编译某个类或者接口的源代码时,JVM会解析出这个类或者接口的访问标志信息,然后,将这些标志设置到访问标志(access_flags)这16个位上。
这里用一个图进行说明:
这里写图片描述

(1)ACC_ENUM标志位

首先来看这个,如果定义了枚举类,那么JVM虚拟机就会把access_flags的第二位为1。

(2)ACC_ANNOTATION标志位

看单词的含义ANNOTAION注释,这里就是如果有注解类,KVM就会把access_flags的第三位置为1

(3)ACC_SYNTHETIC标志位

如果不是JVM编译器编译的,是用户自己的就会把第四位置为1。

(4)ACC_ABSTARACT标志位

定义某一个类的时候,JVM会把ACC_ABSTARACT标志位置为1。

(5)ACC_INTERFACE标志位

定义接口的时候,JVM会把ACC_INTERFACE标志位置为1。

(6)ACC_SUPER标志位

对于定义的类,JVM会把ACC_SUPER标志位置为1。

(7)ACC_FINAL标志位

如果类被声明了final类型,如果是,就会把ACC_FINAL标志位置为1。

(8)ACC_PUBLIC标志位

如果类被声明了public类型,JVM就会把ACC_PUBLIC标志位置为1。

1.3.3 该文件探索

这里写图片描述
黑色部分是常量池,有关常常量池,可以参考
Android逆向-java代码基础(1)
Android逆向-java代码基础(2)
这里主要将的是access_flags,这里的access_flags是0x00  21,转换成二进制就是00000000 00100001,也就是说11位和16位被置为了1。
也就是这里对应的就是ACC_SUPPER和ACC_PUBLIC

1.4 更简单的查看方式。

这里写图片描述

javap -v name;

直接查看即可。

1.5 smali文件分析

这里就不详细介绍,class文件是怎样转换成smali文件的方法了。详细请参考
Android逆向-java代码基础(1)

1.5.1这个是smali代码的整体情况。

这里写图片描述

1.5.2必备的一个

这里写图片描述

1.5.3 main函数

这里发现了一个有趣的事情,当我们从java代码转换过来的时候,好像没有加的过程了,反而直接从寄存器进行赋值了。难道JVM在运行的时候已经把这个处理过了。
这里写图片描述

2 float加法

2.1 demo

public class add{
        public static void main(String[]args)
        {
                float a=1.1f;
                System.out.println(a+a);
        }
}

2.2 class文件分析

这里写图片描述
这是访问标示位。

2.3 smali文件分析

2.3.1 必备

这里写图片描述

2.3.2main

这次我们看到了多了一行我们之前没有见过的smali语法。
而且这次是确实有了加法的流程。
这里写图片描述
这句smali的语法是:

add-float/2addr vx,vy  #Adds vy to vx. 

也就是说把vx和vy的值相加。
其他的语法我们都是见过的,而且在Android逆向-java代码基础(2)中非常详细的讲解过,这里就不赘述了。

3尝试使用smali写一段代码。

3.1demo

.class public Ladd;
.super Ljava/lang/Object;
.source "add.java"

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

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

    return-void
.end method

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

    .prologue #start
    const v0,0x3f8ccccd

    const v1,0x4f8ccccd

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

    add-float/2addr v0,v1

    invoke-virtual {v2,v0},Ljava/io/PrintStream;->println(F)V

    return-void
.end method

3.2jar编译

这里写图片描述

0x02 结束语

1.又写了一天,很多东西等着我去学习,在学习的过程中,越理解明白的就越多。今天勉强算是完成了一个应该完成的东西。smali文件的结构也差不多可以了。我觉得同步Android Studio学习可以开始了。
2.当然java还是要接着复习的,不过以我现在的这种进度,真的是有一点慢呢。不过慢归慢,还是可以学到之前没有学到的东西。
3.准备每一天破解一个简单的apk,虽然是简单,但是也可以增强自己对APP的了解。至于破解的教程就不进行说明了。
不过可能会进行一个资料的收集。

资源下载:

Android逆向-java代码基础(1)
http://download.csdn.net/download/qq_36869808/10191271
Android逆向-java代码基础(2)
http://download.csdn.net/download/qq_36869808/10195444
Android逆向-java代码基础(3)
http://download.csdn.net/download/qq_36869808/10195726

免费评分

参与人数 5威望 +1 吾爱币 +12 热心值 +5 收起 理由
lonyong5127 + 1 + 1 谢谢@Thanks!
qtfreet00 + 1 + 9 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
jianailing + 1 + 1 我很赞同!
supperlitt + 1 + 1 谢谢@Thanks!
Night_月殇 + 1 热心回复!

查看全部评分

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

 楼主| BubblePig 发表于 2018-1-24 21:08
Hmily 发表于 2018-1-24 15:16
没有csdn账号,附件下载好麻烦,@BubblePig 帮忙把附件也上传吧,反正也不大。

链接:https://pan.baidu.com/s/1jJv5YMa 密码:adoc: loveliness:

点评

感谢,以后帖子都带一下吧,我看前几个帖子附件也是下不了,这些其实都不太大,上传意义很大了。  详情 回复 发表于 2018-1-25 10:27
zjls9933 发表于 2018-1-23 18:56
生如上善若水 发表于 2018-1-23 22:12
Night_月殇 发表于 2018-1-24 10:43
感谢分享支持一个
Hmily 发表于 2018-1-24 15:16
没有csdn账号,附件下载好麻烦,@BubblePig 帮忙把附件也上传吧,反正也不大。
Hmily 发表于 2018-1-25 10:27
BubblePig 发表于 2018-1-24 21:08
链接:https://pan.baidu.com/s/1jJv5YMa 密码:adoc: loveliness:

感谢,以后帖子都带一下吧,我看前几个帖子附件也是下不了,这些其实都不太大,上传意义很大了。
13752147408 发表于 2018-1-25 10:50 来自手机
唉,这东西太好了,就是看不懂啊
冥界3大法王 发表于 2018-2-2 13:48
转换以后  很奇特
.class public Ladd;
.super Ljava/lang/Object;
.source "add.java"


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

    .prologue
    .line 1
    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
    .line 6
    const/16 v0, 0x15

    .line 7
    sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream;

    invoke-virtual {v1, v0}, Ljava/io/PrintStream;->println(I)V

    .line 8
    return-void
.end method
xifengjt 发表于 2018-2-2 15:51
感谢楼主分享,下载学习先~~
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-15 07:01

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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