java逆向_Java逆向基础之异常
异常
由之前月份处理修改的例子
//清单1IncorrectMonthException.javapublic class IncorrectMonthException extends Exception {private int index;public IncorrectMonthException(int index) {this.index = index;}public int getIndex() {return index;}}
//清单2Month2.javaclass Month2 {public static String[] months = { "January", "February", "March", "April", "May", "June", "July", "August","September", "October", "November", "December" };public static String get_month(int i) throws IncorrectMonthException {if (i 11)throw new IncorrectMonthException(i);return months[i];};public static void main(String[] args) {try {System.out.println(get_month(100));} catch (IncorrectMonthException e) {System.out.println("incorrect month index: " + e.getIndex());e.printStackTrace();}};}
编译javac Month2.java
只写一个Month2.java,这里是IncorrectMonthException.java也会自动编译
反编译javap -c -verbose Month2.classjavap -c -verbose IncorrectMonthException.class
IncorrectMonthException方法public IncorrectMonthException(int); descriptor: (I)V flags: ACC_PUBLIC Code: stack=2, locals=2, args_size=2 0: aload_0 1: invokespecial #1 // Method java/lang/Exception."":()V 4: aload_0 5: iload_1 6: putfield #2 // Field index:I 9: return
本质上,IncorrectMonthException类只是做了对象构造,还有访问器方法。IncorrectMonthException类是继承于Exception类,所以,IncorrectMonthException类构造之前,构造父类Exception,然后传递整数给IncorrectMonthException类作为唯一的属性值
getIndex方法public int getIndex(); descriptor: ()I flags: ACC_PUBLIC Code: stack=1, locals=1, args_size=1 0: aload_0 1: getfield #2 // Field index:I 4: ireturn
getIndex()只是一个访问器,引用到IncorrectMonthException类,被传到局部变量的索引值0的位置(this指针),用aload_0指令取得, 用getfield指令取得对象的整数值,用ireturn指令将其返回。
再看Month2.class的get_month方法public static java.lang.String get_month(int) throws IncorrectMonthException; descriptor: (I)Ljava/lang/String; flags: ACC_PUBLIC, ACC_STATIC Code: stack=3, locals=1, args_size=1 0: iload_0 1: iflt 10 4: iload_0 5: bipush 11 7: if_icmple 19 10: new #2 // class IncorrectMonthException 13: dup 14: iload_0 15: invokespecial #3 // Method IncorrectMonthException."":(I)V 18: athrow 19: getstatic #4 // Field months:[Ljava/lang/String; 22: iload_0 23: aaload 24: areturn
部分指令解释
0: iload_0 //第0个变量(即变量i)压入操作数栈
1: iflt 10 //当栈顶int型数值小于0时跳转到偏移块10(这里是从栈顶弹出一个值进行比较)
4: iload_0 //第0个变量(即变量i)压入操作数栈
5: bipush 11 //将11压入操作数栈
7: if_icmple 19 //会从栈中弹出两个值进行比较,如果第二个(变量i)小于或者等于第一个(数字11),那么跳转到偏移位19
10: new #2 // class IncorrectMonthException //创建IncorrectMonthException对象的引用并压入栈顶
13: dup //复制栈顶值压入栈顶
14: iload_0 //第0个变量(即变量i)压入操作数栈
15: invokespecial #3 // Method IncorrectMonthException."":(I)V //调用IncorrectMonthException的""方法,这里需要从栈顶弹出两个值,1是IncorrectMonthException对象的引用,2是变量i
18: athrow //将栈顶的异常抛出
19: getstatic #4 // Field months:[Ljava/lang/String; //获取静态成员months数组的引用压入栈
22: iload_0 //第0个变量(即变量i)压入操作数栈
23: aaload //栈顶弹出两个值,将引用型数组指定索引的值推送至栈顶,这里索引i为第一个弹出值,数组引用months为第二个弹出值,即months[i]的值送入栈顶
24: areturn //返回栈顶值
Month2.class的main方法public static void main(java.lang.String[]); descriptor: ([Ljava/lang/String;)V flags: ACC_PUBLIC, ACC_STATIC Code: stack=3, locals=2, args_size=1 0: getstatic #5 // Field java/lang/System.out:Ljava/io/PrintStream; 3: bipush 100 5: invokestatic #6 // Method get_month:(I)Ljava/lang/String; 8: invokevirtual #7 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 11: goto 47 14: astore_1 15: getstatic #5 // Field java/lang/System.out:Ljava/io/PrintStream; 18: new #8 // class java/lang/StringBuilder 21: dup 22: invokespecial #9 // Method java/lang/StringBuilder."":()V 25: ldc #10 // String incorrect month index: 27: invokevirtual #11 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 30: aload_1 31: invokevirtual #12 // Method IncorrectMonthException.getIndex:()I 34: invokevirtual #13 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder; 37: invokevirtual #14 // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 40: invokevirtual #7 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 43: aload_1 44: invokevirtual #15 // Method IncorrectMonthException.printStackTrace:()V 47: return Exception table: from to target type 0 11 14 Class IncorrectMonthException
注意Exception table:文字以及下面的表数据
异常表的第一行数据表示从0到11行若发生异常,则跳转到偏移块14的位置,同时也指明异常的类型为IncorrectMonthException类
异常从偏移块14开始执行,如果没有这个异常表的数据,则偏移块14后的指令不会被执行
这有个例子,IDA是如何显示异常表:
原作者用的自己电脑里的random.class,这里用刚才的Month2.class替代.catch IncorrectMonthException from met003_begin to met003_11 using \met003_14
java逆向_Java逆向基础之异常相关推荐
- java厨房_Java多线程基础
目录: 进程和线程 为什么使用多线程? 多线程的创建方式 Runnable与Thread两种方式比较 start()与run()方法 线程的生命周期/状态转换 常用方法使用与解读 线程的优先级 守护线 ...
- java 考试题_JAVA语言基础内部测试题(50道选择题)
JAVA语言基础内部测试题 选择题(针对以下题目,请选择最符合题目要求的答案,针对每一道题目,所有答案都选对,则该题得分,所选答案错误或不能选出所有答案,则该题不得分.)(每题2分) 没有注明选择几项 ...
- 0基础java语法_Java零基础教程(二)基础语法
Java 基础语法 一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象:对象是类的一个实例,有状态和行为.例如 ...
- java 国际化_Java国际化基础
关于本教程 本教程是关于什么的? 本教程向您介绍Java编程语言对多语言和多国家/地区环境的支持. 本课程首先对国际化原则和概念进行一般性讨论,然后继续对Java国际化支持的特定领域进行概述. 最后几 ...
- java 二进制运算_java二进制运算基础知识点详解|chu
一.二进制位运算 1. 按位与(&) 位运算实质是将参与运算的数字转换为二进制,而后逐位对应进行运算. 按位与运算为:两位全为1,结果为1,即1&1=1,1&0=0,0& ...
- 实例化Java对象_Java面向对象基础之对象实例化
1.实例化对象的过程可以分为两部分,例如下面代码: Person per = new Person(); 该代码分为两部分: 第一,声明对象:Person per,这部分是在栈内存中声明的,与数组一样 ...
- 递归java程序_JAVA编程基础之递归结构
递归结构 递归是一种常见的解决问题的方法,即把问题逐渐简单化. 递归的基本思想就是 自己调用自己 ",一个使用递归技术的方法将会直接或者间接的调用自己.利用递归可以用简单的程序来解决一些复杂 ...
- 黑马程序员全套Java教程_Java基础教程_异常(含扩展)(二十三)
黑马程序员全套Java教程_Java基础教程_异常(含扩展)(二十三) 1.1 异常概述与异常体系结构 1.2 JVM遇到异常时的默认处理方案 1.3 异常处理 1.4 异常处理之try--catch ...
- java 抛出异常的作用_Java 基础之异常抛出
Java 基础之异常抛出 Java,基础,异常抛出 在 Java 里,除了对异常的捕获外,你还可以抛出异常,还可以创造异常.抛出异常的作用就是告诉你的调用者,程序出现了不正常的情况了,得不要期望的结果 ...
最新文章
- Socket程序从windows移植到linux下需要注意的
- nodeJs多线程 -- 学习记录
- C++ 用vector创建数组对象
- C++程序设计之保存和读取二进制文件
- 成功解决PermissionError: [Errno 13] Permission denied: './data\\mnist\\train-images-idx3-ubyte'
- Docker启动失败 提示An error occurred和乱码
- 每天一道LeetCode-----给定大小为n+1的数组,元素大小在[1 : n]之间,只有一个元素会重复出现多次,找到重复的那个
- 计算机系统中存储管理是,《计算机操作系统5、存储管理.doc
- java 线程池 初始大小_为什么tomcat的默认线程池大小如此之大? - java
- python的变量的命名规则以及定义
- 零基础可上手 | 手把手教你用Cloud AutoML做毒蜘蛛分类器
- 挑战性题目DSCT301:求不同形态的二叉树数目
- 服务器操作系统详解,深入解析Windows操作系统之总体架构
- sd 0:0:0:0: [sda] Assuming drive cache: write through错误解决 本人实测!
- 【CV】斯坦福CS231n DL-CV by李飞飞 team
- Whitestorm.js入门
- TunesKit Video Cutter for Mac(视频分割编辑工具)
- Bluemix平台打造DC/OS云计算平台(一)
- 【BSP视频教程】STM32H7视频教程第1期:初识STM32H7准备工作,了解Cortex-M7内核及MDK,IAR,Embedded Studio,STM32CubeIDE和VS Code简单比较
- 基于色温估计的白平衡算法
热门文章
- C++ 指针基本概念
- Twitter创始人Jack Dorsey的每日必做和不做清单
- html图像特征提取,图像识别之图像特征提取
- Matlab非线性拟合工具箱cftool
- 牛客网-数据结构笔试题目(七)-k-amazing数字求解
- java服务器崩溃的原因_请求大神帮忙分析一下服务器崩溃原因
- java开发一个完整的秒杀与竞价网上商城
- python合并数组输出重复项_python - 不同数组项的所有可能组合[重复] - 堆栈内存溢出...
- 渗透测试-验证码的爆破与绕过
- 4阶范德蒙德行列式例题_行列式的性质和计算问题