Java是一门"半编译半解释"型语言.通过使用jdk提供的javac编译器可以将Java源码编译为Java虚拟机(Java Virtual Machine, JVM)可读的字节码(bytecode),即*.class文件.

学习字节码可以使你更好的理解Java虚拟机的行为,甚至对学习其它基于Java虚拟机的语言(如:Scala,Clojure,Kotlin等)有很大的帮助

入门

实际上*.class文件并不是人类可读的文件格式,我们可以使用JDK提供的反会汇编器javap来分析字节码

Hello.java

class Hello {

public static void main(String[] args) {

System.out.println("Hello World");

}

}

这可能是大家接触的第一个Java程序,我们先使用=> javac Hello.java编译得到Hello.class文件.然后使用javap -c -verbose将文件反汇编

常量池

其中Constant pool就是传说中的常量池.

常量池可以看作是一个数组,#后面的数字代表数组的索引.

=后面是数组的值.

第一列代表这个常量的tag,第二列会根据tag的不同而不同.

以Class为例,tag为Class的常量结构体为

CONSTANT_Class_info {

u1 tag;

u2 name_index;

}

name_index 表示一个常量池中的有效索引,这个索引的tag必须是Utf8

在#5位置上的name_index为常量池中#21位置中的常量,实际上保存的就是这个类的类名.类名会使用正斜杠/代替.来表示类型的完整名称

关于更多常量池的介绍可以查看

The Java Virtual Machine Specification 4.4

通过查看反汇编过的字节码我们可以发现这个类有两个方法,一个是无参的构造器

Hello(),另一个是main方法

descriptor

descriptor中描述这个参数和方法类型(返回值类型).其中()中代表的是这个方法的参数,后面跟的是这个方法的返回值类型,V代表void,即无返回值

下表列出了一些返回值符号对应的含义

需要注意的是引用类型名和常量池中类型的命名方式一致

比如main方法的参数描述符和类型描述符为([Ljava/lang/String;)V,代表这个方法接受一个String[]类型参数,并且无返回值.

flags

flags中描述了这个方法的访问权限和基本属性,下表列出flags描述符对应的含义

在上面我们定义的程序中并没有显示的定义构造器,这里的构造器属于编译器自动生成.但是jvm标准规定类型的初始化等与人工实现无关的方法可以不用加ACC_SYNTHETIC.注

code

code是方法的代码部分

stack=2, locals=1, args_size=1,分别代表操作数栈的深度,局部变量表大小和方法参数个数.其中实例方法的第一个局部变量和参数是this.局部变量表中每个参数大小都是32位,所以long和double会占用局部变量表中两个连续的位置

在构造器中,aload_0表示将第一个参数压入栈中,即this.然后会使用invokespecial指令调用一个特殊的初始化方法java/lang/Object."":()V

在main函数中,先使用getstatic指令获取java/lang/System.out:Ljava/io/PrintStream的静态域,再将它压入栈中(java/io/PrintStream的实例).然后再使用ldc将常量池中的字符串指针(即"Hello World")压入栈中,ldc指令表示将一个常量池中的对象压入操作数栈中.

接着,使用invokevirtual调用java/io/PrintStream.println,invokevirtual指令用于调用实例的方法.最终调用return指令返回

java逆向_Java逆向入门(一)相关推荐

  1. java逆向_Java逆向基础之异常

    异常 由之前月份处理修改的例子 //清单1IncorrectMonthException.javapublic class IncorrectMonthException extends Except ...

  2. java队列_java集合入门和深入学习(详解),看这篇就差不多了

    一.集合入门总结 集合框架: Java中的集合框架大类可分为Collection和Map:两者的区别: 1.Collection是单列集合:Map是双列集合 2.Collection中只有Set系列要 ...

  3. 用条件运算符编写java程序_Java 编程入门课程丨第 8 单元:条件运算符和控制语句...

    原标题:Java 编程入门课程丨第 8 单元:条件运算符和控制语句 教程概览 本单元是"Java 编程入门"课程的第 8 部分.尽管各单元中讨论的概念具有独立性,但实践组件是在您学 ...

  4. java代码审计_Java代码审计入门篇

    本期斗哥带来Java代码审计的一些环境和工具准备. Java这个语言相对于PHP来说还是比较复杂的,所以一开始接触到Java源码审计的时候会遇到一些关于环境和配置上一些困难,本文记录斗哥在开始去审计J ...

  5. java卸载_java快速入门篇之windows-MySQL-5.6安装与卸载

    装前准备 mysql-5.6.24-win32 关注后私信获取:mysql-5.6.24 1.解压zip压缩包,解压缩之后要进行配置. 解压之后可以将该文件夹改名,放到合适的位置,个人建议把文件夹改名 ...

  6. NSA开源逆向工具Ghidra入门使用教程

    NSA开源逆向工具Ghidra入门使用教程 安全运营 奇安信威胁情报中心 2019-03-07 Ghidra具有反编译功能,查看.定位反编译后的代码相较于IDA有优势.不过在使用过程中发现其处理某些混 ...

  7. Java学习指南从入门到入土

    Java学习指南从入门到入土 本身其实只是刚刚入门,只是经历了两年时间的风吹雨打,经历了各种bug的折磨和学习各种框架的辛酸,才有得现有的 刚刚入门.有句老话说的好叫做 从入门到放弃,人生不易要及时放 ...

  8. 普罗米修斯监控java项目_java学到什么程度可以出去实习?

    把基础的知识学完,然后再学个框架,比如常见的SSH,SSM之类的,自己能用这个框架做个简单的项目,就可以了 简单的来说就是把下方的视频教程学完就可以找工作了(需要完整的资料可以找up) Java零基础 ...

  9. java和php哪个运行更快,java和php哪个入门快?-php教程

    跟着互联网的高速倒退,愈来愈多的人开端抉择处置较量争论机行业,而想要处置相干工作的话,理解相干编程言语也是必备的一项技艺.可是有不少冤家正在抉择要学习的编程言语时就被难到了,想晓得哪一种言语入门更快, ...

  10. 【Android 逆向】逆向修改游戏应用 ( 分析应用结构 | 定位动态库位置 | 定位动态库中的修改点 | 修改动态库 | 重打包 )

    文章目录 一.应用结构分析 二.定位动态库位置 三.定位动态库中的修改点 四.修改动态库 五.重打包 一.应用结构分析 分析上一篇博客 [Android 逆向]逆向修改游戏应用 ( APK 解析工具 ...

最新文章

  1. Linux系统的安装(自动引导安装、网络安装、分区选择)
  2. linux禁用页面拷贝粘贴,【Linux基础】VI命令模式下删除拷贝与粘贴
  3. cvs svnmanager
  4. ImportError: cannot import name 'six'解决
  5. SWF反编译神器ASV2013功能展示(下)
  6. Win7/8出现An error occurred on the server when processing the URL解决办法
  7. 深度相机(三)--三种方案对比
  8. 计算机专业介绍范文英文,计算机专业个人简历英文范文
  9. 精美UI版iApp对接hybbs论坛功能APP源码
  10. Numpy Scalars(标量)
  11. layui前端页面table表格怎么格式化转换时间_个人经历:我的前端学习历程
  12. 49个Python的常见操作/技巧/例子
  13. C++继承:公有,私有,保护
  14. 【自然框架】稳定版的Demo —— 三:主从表的维护方式
  15. 苹果中国全系降价:iphone最高降500元,用户可退差价
  16. 【VBA】日期时间函数总结(全)
  17. pc端不同分辨率适配
  18. 美国共享单车数据分析
  19. 2 STL迭代器介绍【前向迭代器、双向迭代器、随机访问迭代器】【迭代器遍历容器】
  20. 李克用置酒三垂冈赋——刘翰(清)

热门文章

  1. 中国天气预报网城市对应代码
  2. java lame_音视频编解码——LAME
  3. 大学毕业生如何成功应聘高薪IT职位 [转]
  4. 如何正确地跟二维码里的神仙打架?给小朋友讲解二维码原理
  5. 电商营销新思路:CPS分销推广模式
  6. LTE学习笔记 ——SRB、DRB
  7. 2011 9 11最新过QQ游戏检测Cheat Engine(CE)搜索数据
  8. 虚拟项目团队构建与管理
  9. python数据分析09_pandas数据聚合与分组运算
  10. 国内外反垃圾邮件技术