java反编译使用报错_Java反编译class
工具
工具使用jad(还有joda,jd等工具)
1、使用jad反编译class文件,jad可以配置到eclipse中当做插件,直接下载jad的eclipse插件jar包,放在eclipse的plugin目录下即可。把下载的jad.exe放在JAVA_HOME的bin下。然后eclipse中点击class文件即可查看到源码。
2、使用其他工具,FrontEnd Plus集成了jad的java反编译工具,支持多个文件的反编译,也支持各种选项。
矫正反编译代码错误和奇怪代码
1、异常错误
反编译之后出入类似如下代码:
DocumentException e;
e;
e.printStackTrace();
break MISSING_BLOCK_LABEL_67;
e;
e.printStackTrace();
break MISSING_BLOCK_LABEL_67;
e;
e.printStackTrace();
break MISSING_BLOCK_LABEL_67;
e;
这种处理方式就是异常处理,反编译之后出现的这种情况,修改的时候使用try catch即可,其实完全可以将这块删除之后,然后eclipse会自动提示需要添加异常处理的模块,自动try catch即可。
2、语句标号(goto)
这种情况常见于条件语句,即转化为if,else语句即可,这种比较容易判断。
i = 0;
goto _L1
_L3:
i++;
_L1:
if(i < 4) goto _L3; else goto _L2
_L2:
g.dispose();
上面的代码实际上就是如下的代码:
i=0;
if(i < 4){
i++;
}else{
g.dispose();
}
3、jvm代码信息错误
String rand = backStr[random.nextInt(backStr.length)];
this;
sRand;
JVM INSTR new #203 ;
JVM INSTR dup_x1 ;
JVM INSTR swap ;
String.valueOf();
StringBuilder();
rand;
append();
toString();
sRand;
这种错误代码,也是很常见的,比如上面的代码中,rand 是局部设定的变量,而存在一个类变量sRand,上面的代码可以使用如下的代码替换掉错误。
this.sRand += rand;
当然,对这段代码进行分析一下即可看出,分析的时候需要结合下面4中讲解的字符串拼接翻译器代码,从这段混乱的代码中可以看到,有this和sRand,这种可以看出是操作了this的sRand变量,下面的jvm instr是创建了一个stringBuilder的的变量,实际这个变量是保存了this的sRand字符串。最后是append了一个rand变量,然后把这个变量又赋值给了this的sRand。
4、字符串拼接的代码
(new StringBuilder(String.valueOf(prefix))).append(file).toString();
上面的这种代码,实际代码如下:
prefix + file
所有字符串拼接都是转为StringBuilder使用append拼接之后然后toString。
5、continue关键字
这种常常会隐含逻辑错误,但是编译并不报错,这种问题最难发现。这种的反编译一般伴随着大段的循环代码,然后反编译之后会将循环代码或者if代码转成goto语句(参见2),然后在某个情况之下不需要继续执行,便使用continue截断代码执行路径。代码出现如下情况。
continue; /* Loop/switch isn't completed */
这样的代码出现的时候,并没有报语法的错误,我遇到这种情况之后,程序运行之后结果出错,最后将程序中的这个反编译问题找了出来,将continue修改成break语句正常了。这样的问题常常会出现在while循环中,可能反编译出来的程序丢失了while循环,变成了if语句,常常是迭代器循环的时候,非常容易出现这种情况。
6、迭代器循环
迭代器循环反编译之后常出险两种情况,一种容易引起逻辑上的错误,一种没有逻辑和语法上的错误,只不过不是原来代码的写法而已。
iter = datalist.iterator();
goto _L1
if(iter.hasNext()) goto _L3; else goto _L2
上面的代码可以利用类型2来翻译出来,但是这里会有个地方需要修改,那就是if必须换成while,而else中是一些异常处理而已。这里常见的隐含问题在于,在代码段L3中,常常含有break,continue等跳转语句,一定要分析清楚,不然很容易出现难以排查的逻辑错误,使得反编译出来的代码运行结果不正确。
还原之后的代码如下:
try {
Iterator iter = datalist.iterator();
while(iter.hasNext()){
}
}catch (Exception e) {
e.printStackTrace();
}
还有一种没有错误的译法如下:
for(Iterator iterrisk = tRiskLIst.iterator(); iterrisk.hasNext();)
{
}
这种译法没有错误,只不过是看着不习惯而已,原程序程序通常如下:
Iterator iterrisk = tRiskLIst.iterator();
while(iterrisk.hasNext()){
}
java反编译使用报错_Java反编译class相关推荐
- sigar 使用报错问题解决(java.lang.UnsatisfiedLinkError: gather)
sigar 使用报错问题解决(java.lang.UnsatisfiedLinkError: gather) 解决方法 1. 将sigar.jar sigar-amd64-winnt.dll sig ...
- Android .9图片使用报错...报错:AAPT: error: file failed to compile.
Android .9图片使用报错 报错:AAPT: error: file failed to compile. 网上给出解决方案 在build.gradle里添加以下两句: aaptOptions. ...
- git使用报错:fatal: Couldn't find remote ref master的解决方法
git使用报错:fatal: Couldn't find remote ref master的解决方法 fatal: Couldn't find remote ref master 翻译过来就是:致命 ...
- 记录webpack使用问题,使用报错“UnhandledPromiseRejectionWarning,file-loader图片过大,无法加载图片,打包html文件报错TypeError
记录webpack使用报错 版本号问题 运行npm run build,报错 "UnhandledPromiseRejectionWarning: TypeError: this.getRe ...
- Assets.car 解压工具 cartool 使用报错 segmentation fault cartool 解决方案
Assets.car 解压工具 cartool 使用报错 segmentation fault cartool 解决方案 参考文章: (1)Assets.car 解压工具 cartool 使用报错 s ...
- “this”不能在常量表达式中使用报错的解决方法
"this"不能在常量表达式中使用报错的解决方法 问题描述与思考 在用C++书写下面一段代码时,编译器报错"'this'不能在常量表达式中使用".在这里,我最开 ...
- CentOS系统yum源使用报错:Error: Cannot retrieve repository metadata
服务器上的yum突然不好使用,使用yum的时候报错如下: [root@bastion-IDC src]# yum list ...... Could not retrieve mirrorlist h ...
- Python安装xlrd和xlwt的步骤以及使用报错的解决方法
Python安装xlrd和xlwt的步骤以及使用报错的解决方法 参考文章: (1)Python安装xlrd和xlwt的步骤以及使用报错的解决方法 (2)https://www.cnblogs.com/ ...
- git使用报错: fatal: Couldn‘t find remote ref master的解决方法
git使用报错: fatal: Couldn't find remote ref master的解决方法 参考文章: (1)git使用报错: fatal: Couldn't find remote r ...
- cnpm使用报错-最佳方案
问题:cnpm使用报错throw err;^Error: Cannot find module 'fs/promises 现象: 解决方案: 查看你的cnpm的版本是不是高于8.2.0 cnpm 8. ...
最新文章
- 不止狂卖芯片,英伟达也飙了新算法:用AI生成逼真的虚假名人照,可用于万物
- struts2异常处理,global-results定义全局结果处理
- 爬虫五 Beautifulsoup模块详细
- Hyperledger Fabric 1.4 Kafka集群部署教程
- Mysql Errcode: 24 - Too many open files
- bat文件名操作_Excel按文件名制作目录,你复制粘贴花一小时,同事只要十秒搞定...
- php 中文截断,PHP中实现中文字串截取无乱码的解决方法
- Java中的13个原子操作类介绍
- 一文讲述数仓组件SysCache
- 1854: [Scoi2010]游戏
- IBM/ORACLE/EMC在银行业的重要性
- 从矩阵谱分解到矩形的最少正方形剖分
- 为设计师写的色彩对比指南,让你真正了解色彩对比
- 用c语言编写文曲星小游戏,这是文曲星里的小游戏,本人用c语言将其编出并添加破纪录功能。...
- 59% 的程序员曾担心自己猝死!
- solr7.4.0入门,分词,实时增量同步
- 图像分类篇:pytorch实现ResNet
- 惠普喷墨打印机卡纸了
- 【某集训题解】【DAY 2 T3】与非
- 如何用深度强化学习模拟炒股?
热门文章
- ASP .Net Core系统部署到 CentOS7 64 具体方案
- [HZOI 2016]tree—增强版
- jquery实现div自适应浏览器高度
- 将Session写入数据库
- EXTJS4:如何改变grid某一个单元格的背景颜色
- 想了很久,我还是来了;天天看blog我也就想自己拥有一个了,好事。。。。坚持。。。。...
- 扩展MemberShip的使用:
- 华为手机网络连接不可用怎么解决_和平精英卡顿怎么解决?玩手机游戏用什么加速器比较好?...
- python读取dat文件写入表格_python DDT读取excel测试数据
- Python图像处理(1)