IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 从0到1 Android安全学习之路 -- Java 字节码和 Dalvik 字节码 -> 正文阅读

[移动开发]从0到1 Android安全学习之路 -- Java 字节码和 Dalvik 字节码

概述

??本篇博客将讲述 Java 源代码到字节码,字节码转汇编,以及 Android 中 Java 源代码转 Dalvik 字节码,Dalvik 字节码转 smali 汇编的一些操作。主要是熟悉一些基本工具的使用,这里做个总结。

源代码样例

??这里提供一份最简单的源代码示例,示例在于精而不在于复杂,当然肯定越简单越好,将下面的代码保存为HelloWorld.java文件,后面转 Java 字节码和 Dalvik 字节码都用该示例。

public class HelloWorld {
    
    public static void main(String[] args) {
        System.out.println("HelloWorld!");
    }
}

Java 字节码

?? Java 源代码转字节码,使用 jdk 自带命令行工具javac,如下命令所示。执行后会在当前目录下生成 HelloWorld.class文件,这里生成 .class 文件就是 Java 字节码,可以交由 Java 虚拟机(JVM)执行,操作命令如下java HelloWorld

javac HelloWorld.java

??如果直接打开字节码文件,中间会有一些乱码,人无法直接阅读,所以这里借用 jdk 自带命令行工具javap执行反汇编,将字节码转为汇编代码。如下命令所示,这里操作的是HelloWorld.class,命令行中是否加上 .class 后缀都可以。

javap -c HelloWorld

??如下代码所示,是上面执行后的输出结果,这里注意该命令并不会将汇编代码写入到本地文件中,如果需要写入到指定文件请借助重定向符号,操作命令如下javap -c HelloWorld > HelloWorld

Compiled from "HelloWorld.java"
public class HelloWorld {
  public HelloWorld();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #3                  // String HelloWorld!
       5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return
}

Dalvik 字节码

??Dalvik 虚拟机(DVM)是 Google 专门用来运行 Android 程序的虚拟机,因此 Android 程序上的 Java 代码最终都会被编码为 Dalvik 字节码,并在经过一些处理后打包为 DEX 可执行文件,此时就可以由 DVM 解释运行。在 Android 4.4 版本后又引入了 ART(Android RunTime)虚拟机,ART 完全支持兼容 DEX ,因此学习 Dalvik 是一个基础 。
??Java 源代码转 DEX。首先我们需要得到 Java 源代码对应的字节码文件,使用上面的命令即可,然后再使用 sdk 提供的工具 dx ,该工具位于 sdk 的 /build-tools 目录中。

dx --dex --output=HelloWorld.dex HelloWorld.class

??DEX 可执行文件转 smali 汇编。这里使用 baksmali.jar 工具,位于 sdk 的 /tools/lib 中。

baksmali.jar HelloWorld.dex

??执行该命令后,会在当前目录下生成 out 文件夹,里面会有HelloWorld.smali文件。该文件内容如下。

.class public LHelloWorld;
.super Ljava/lang/Object;
.source "HelloWorld.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
    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;

    const-string v1, "HelloWorld!"

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

    .line 5
    return-void
.end method

总结

不忘初心,砥砺前行!

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-14 21:50:06  更:2021-11-14 21:50:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:52:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码