java逆向_Java逆向入门(一)
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逆向入门(一)相关推荐
- java逆向_Java逆向基础之异常
异常 由之前月份处理修改的例子 //清单1IncorrectMonthException.javapublic class IncorrectMonthException extends Except ...
- java队列_java集合入门和深入学习(详解),看这篇就差不多了
一.集合入门总结 集合框架: Java中的集合框架大类可分为Collection和Map:两者的区别: 1.Collection是单列集合:Map是双列集合 2.Collection中只有Set系列要 ...
- 用条件运算符编写java程序_Java 编程入门课程丨第 8 单元:条件运算符和控制语句...
原标题:Java 编程入门课程丨第 8 单元:条件运算符和控制语句 教程概览 本单元是"Java 编程入门"课程的第 8 部分.尽管各单元中讨论的概念具有独立性,但实践组件是在您学 ...
- java代码审计_Java代码审计入门篇
本期斗哥带来Java代码审计的一些环境和工具准备. Java这个语言相对于PHP来说还是比较复杂的,所以一开始接触到Java源码审计的时候会遇到一些关于环境和配置上一些困难,本文记录斗哥在开始去审计J ...
- java卸载_java快速入门篇之windows-MySQL-5.6安装与卸载
装前准备 mysql-5.6.24-win32 关注后私信获取:mysql-5.6.24 1.解压zip压缩包,解压缩之后要进行配置. 解压之后可以将该文件夹改名,放到合适的位置,个人建议把文件夹改名 ...
- NSA开源逆向工具Ghidra入门使用教程
NSA开源逆向工具Ghidra入门使用教程 安全运营 奇安信威胁情报中心 2019-03-07 Ghidra具有反编译功能,查看.定位反编译后的代码相较于IDA有优势.不过在使用过程中发现其处理某些混 ...
- Java学习指南从入门到入土
Java学习指南从入门到入土 本身其实只是刚刚入门,只是经历了两年时间的风吹雨打,经历了各种bug的折磨和学习各种框架的辛酸,才有得现有的 刚刚入门.有句老话说的好叫做 从入门到放弃,人生不易要及时放 ...
- 普罗米修斯监控java项目_java学到什么程度可以出去实习?
把基础的知识学完,然后再学个框架,比如常见的SSH,SSM之类的,自己能用这个框架做个简单的项目,就可以了 简单的来说就是把下方的视频教程学完就可以找工作了(需要完整的资料可以找up) Java零基础 ...
- java和php哪个运行更快,java和php哪个入门快?-php教程
跟着互联网的高速倒退,愈来愈多的人开端抉择处置较量争论机行业,而想要处置相干工作的话,理解相干编程言语也是必备的一项技艺.可是有不少冤家正在抉择要学习的编程言语时就被难到了,想晓得哪一种言语入门更快, ...
- 【Android 逆向】逆向修改游戏应用 ( 分析应用结构 | 定位动态库位置 | 定位动态库中的修改点 | 修改动态库 | 重打包 )
文章目录 一.应用结构分析 二.定位动态库位置 三.定位动态库中的修改点 四.修改动态库 五.重打包 一.应用结构分析 分析上一篇博客 [Android 逆向]逆向修改游戏应用 ( APK 解析工具 ...
最新文章
- Linux系统的安装(自动引导安装、网络安装、分区选择)
- linux禁用页面拷贝粘贴,【Linux基础】VI命令模式下删除拷贝与粘贴
- cvs svnmanager
- ImportError: cannot import name 'six'解决
- SWF反编译神器ASV2013功能展示(下)
- Win7/8出现An error occurred on the server when processing the URL解决办法
- 深度相机(三)--三种方案对比
- 计算机专业介绍范文英文,计算机专业个人简历英文范文
- 精美UI版iApp对接hybbs论坛功能APP源码
- Numpy Scalars(标量)
- layui前端页面table表格怎么格式化转换时间_个人经历:我的前端学习历程
- 49个Python的常见操作/技巧/例子
- C++继承:公有,私有,保护
- 【自然框架】稳定版的Demo —— 三:主从表的维护方式
- 苹果中国全系降价:iphone最高降500元,用户可退差价
- 【VBA】日期时间函数总结(全)
- pc端不同分辨率适配
- 美国共享单车数据分析
- 2 STL迭代器介绍【前向迭代器、双向迭代器、随机访问迭代器】【迭代器遍历容器】
- 李克用置酒三垂冈赋——刘翰(清)