从0到1 Android安全学习之路 -- Java 字节码和 Dalvik 字节码
2021/11/13 20:41:47
本文主要是介绍从0到1 Android安全学习之路 -- Java 字节码和 Dalvik 字节码,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Java 字节码和 Dalvik 字节码
- 概述
- 源代码样例
- 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
,但是注意命令行中不要加文件后缀。
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
总结
不忘初心,砥砺前行!
这篇关于从0到1 Android安全学习之路 -- Java 字节码和 Dalvik 字节码的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-25初学者必备:订单系统资料详解与实操教程
- 2024-12-24内网穿透资料入门教程
- 2024-12-24微服务资料入门指南
- 2024-12-24微信支付系统资料入门教程
- 2024-12-24微信支付资料详解:新手入门指南
- 2024-12-24Hbase资料:新手入门教程
- 2024-12-24Java部署资料
- 2024-12-24Java订单系统资料:新手入门教程
- 2024-12-24Java分布式资料入门教程
- 2024-12-24Java监控系统资料详解与入门教程