用户
搜索
  • TA的每日心情

    3 天前
  • 签到天数: 131 天

    连续签到: 1 天

    [LV.7]常住居民III

    i春秋作家

    推荐小组成员

    Rank: 7Rank: 7Rank: 7

    114

    主题

    280

    帖子

    1054

    魔法币
    收听
    0
    粉丝
    18
    注册时间
    2017-7-24

    幽默灌水王突出贡献春秋文阁i春秋签约作者i春秋推荐小组积极活跃奖春秋游侠秦

    HAI_ i春秋作家 推荐小组成员 幽默灌水王 突出贡献 春秋文阁 i春秋签约作者 i春秋推荐小组 积极活跃奖 春秋游侠 秦 楼主
    发表于 2018-1-9 01:51:10 05471

    [TOC]

    0x00 前言

    微博:HAI_AI_ZHUZHU

    I春秋:HAI_

    看这篇可以先看看之前的文章,进行一个了解。
    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的了解。至于破解的教程就不进行说明了。
    不过可能会进行一个资料的收集。

    本帖被以下淘专辑推荐:

    破解的目的是为了更好的开发
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册