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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364797.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

luogu4770 [NOI2018]你的名字 后缀自动机 + 线段树合并

其实很水的一道题吧.... 题意是:每次给定一个串\(T\)以及\(l, r\),询问有多少个字符串\(s\)满足,\(s\)是\(T\)的子串,但不是\(S[l .. r]\)的子串 统计\(T\)本质不同的串,建个后缀自动机 然后自然的可以想到&#xff0c…

centos-7.2 node.js免编译安装

cd /usr/local/wget https://npm.taobao.org/mirrors/node/v8.9.3/node-v8.9.3-linux-x64.tar.gz tar -zxvf node-v8.9.3-linux-x64.tar.gz //已编译可以直接运行./bin下面的命令rm -rf node-v8.9.3-linux-x64.tar.gz //解压完删包 // 建立全局快捷方式 ln -s 源命令文件 快…

团队计划会议

跟航哥想了挺多要做什么,要完成什么,以什么为主要功能 提出了几个想法,并做了投票 最后决定一起做一个跑腿软件 最初的任务量: 跟航哥商量两个人一人负责两个模块 航哥负责管理员和下单 我负责接单跟其他琐碎的小功能 呐&#xff…

在基于Spring MVC的应用程序中配置favicon.ico

Favicon是与您的网站相关的图标(favicon.ico)。 并非每个网站都在使用favicon。 但是大多数浏览器并不关心它,反正他们都要求它。 当图标图标不在适当位置时,服务器将返回不必要的404 Not Found错误。 在典型的Spring MVC应用程序…

vue.js java php_准吗?Java程序员喜欢AngularJS,PHP程序员喜欢Vue.js!

编程语言与框架或者库之间有联系是很正常的事情,如果我们告诉你,使用某一种编程语言或技术的开发人员可能更喜欢某个框架,你会作何反应呢?Stack Overflow根据网站内最常访问的标签将开发人员分为多个组,并检查了每组每…

BAJT高级Java面试题

答对这些面试题,PASS 掉 80 % 的竞争者 hashcode相等两个类一定相等吗?equals呢?相反呢? 介绍一下集合框架? hashmap hastable 底层实现什么区别?hashtable和concurrenthashtable呢? hashmap和treemap什么区别?低层数据结构是什么? 线程池用过吗都有什么…

结构化日志:出错时你最想要的好朋友

目录 介绍什么是日志?Grab中日志的状况为什么改变?结构化日志支持不同格式的多写开发中类似生产环境的日志因果顺序但为什么要结构化记日志?原文:Structured Logging: The Best Friend You’ll Want When Things Go Wrong 介绍 在…

在vue项目中添加特殊字体

这里的特殊字体,指的是一般用户电脑未安装到本地的字体,要引入这样的字体,首先需要把字体文件下载下来。 就像上图这样的,ttf格式的,然后在项目里添加它。 然后我们在font.css里用font-face规则引入这个字体文件并命名…

使用Spring WS创建合同优先的Web服务

1引言 本文介绍了如何使用来实现和测试SOAP Web服务 Spring Web Services项目 。 本示例使用JAXB2进行(取消)编组。 为了开发服务,我将使用合同优先的方法,该方法首先定义服务合同,然后基于该合同实施服务。 本文分为…

java中的常用日期类_Java中的常用日期类说明

日期类常用的有三个,Date类,Calendar(日历)类和日期格式转换类(DateFormat)Date类中的大部分的方法都已经过时,一般只会用到构造方法取得系统当前的时间。public class DateDemo {public static void main(String[] args) {Date date new Da…

转载 Net多线程编程—System.Threading.Tasks.Parallel

.Net多线程编程—System.Threading.Tasks.Parallel System.Threading.Tasks.Parallel类提供了Parallel.Invoke,Parallel.For,Parallel.ForEach这三个静态方法。 1 Parallel.Invoke 尽可能并行执行所提供的每个操作,除非用户取消了操作。 方法…

三方面搞定http协议之“状态码”

当我们向服务器请求数据的时候,服务器会给我们一个反馈,告诉我们对待我们的请求,服务器处理得怎么样了,而这个反馈,是通过数字来传达的,这个数字就叫状态码。 状态码分为以下几种: 1xx&#xf…

哪个更好的选择:克隆或复制构造函数?

这就是我开始撰写本文的方式。 我已经读过很多次这样的声明: “当对象引用可变的最终字段时,克隆变得很困难。” 每次我在Google上搜索它时,都要了解它的确切含义,并且在此过程中也忘了它。 因此以为我会在此撰写博客,…

Fiddler教程--简介

1、开发环境host配置自己修改系统的host来回挺麻烦的 2、前后的接口调试 3、线上bugfix 4、性能分析和优化 5.等等... 工作原理 一个代理服务器地址改为 127.0.0.1:8888流模式边走边返回缓冲模式http请求完成所有的数据之后,才返回 界面功能介绍 1.工具栏 从下图红色…

java map是有序的吗_Java:如何初始化和填充最终的静态有序Map?

我在Java中有一个词干算法,它需要一个静态的最终HashMap< String,String>预先填写了大约30 000条记录.我需要地图按照插入的顺序保存记录(我得到一个提示,我可以使用LinkedHashMap&#xff1f;).我以为我可以在Java类文件中手动插入值,因为这是在RAM中加载它们的最快方法…

跟面向对象卯上了,看看ES6的“类”

上回我们说到ES5的面向对象&#xff0c;以及被大家公认的最佳的寄生组合式继承。时代在进步&#xff0c;在ES6中对于面向对象这个大boss理所应当地进行了一次大改&#xff0c;从原先那种比较长的写法转变为“小清新”写法。我们一起来看一下。 在ES6中是有类这个概念&#xff0…

js 变量作用域

例子 <script>var a "heh"function findLove(){console.log(a);function findforyou(){var a "you";console.log(a);}function findother(){console.log(a)}findforyou();findother();}findLove(); </script> 输出 heh you heh 例子 <scri…

Jin Ge Jin Qu hao UVA - 12563 01背包

题目&#xff1a;题目链接 思路&#xff1a;由于t最大值其实只有180 * 50 678&#xff0c;可以直接当成01背包来做&#xff0c;需要考虑的量有两个&#xff0c;时间和歌曲数&#xff0c;其中歌曲优先级大于时间&#xff0c;于是我们将歌曲数作为背包收益&#xff0c;用时间作为…

Java 8中的5个功能将改变您的编码方式

Java 8在JVM和语言级别都包含了一些非常令人兴奋的功能。 虽然最初为该发行版设想的某些功能已扩大范围或已推出到第9版&#xff0c;但实际上有数十个新功能。 许多新添加的内容在编译器&#xff0c;JVM或帮助系统级别都进行了后台改进。 这样&#xff0c;虽然我们可能会从中受…

Java相关资料分享(视频+电子书籍)

关注微信公众号【Java典籍】&#xff0c;获取百度网盘提取码 ▼微信扫一扫下图↓↓↓二维码关注 转载于:https://www.cnblogs.com/bingyimeiling/p/10279049.html