Java反编译class

摘要:
Jd和其他工具)1。使用jad反编译类文件,然后单击eclipse中的类文件以查看源代码。}3.jvm代码信息错误Stringrand=backStr[random.nextInt(backStr.length)];此错误代码;在分析时,有必要结合下面4中解释的字符串拼接转换器代码。

工具

工具使用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();

}

3jvm代码信息错误

                  String rand = backStr[random.nextInt(backStr.length)];

        this;

        sRand;

        JVM INSTR new #203 <Class StringBuilder>;

        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。

5continue关键字

这种常常会隐含逻辑错误,但是编译并不报错,这种问题最难发现。这种的反编译一般伴随着大段的循环代码,然后反编译之后会将循环代码或者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()){

}

本文永久地址http://blog.sina.com.cn/s/blog_4a2100f801014iwy.html

免责声明:文章转载自《Java反编译class》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【PMP】组织结构类型oracle创建索引表空间下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

sass揭秘之变量

全局变量和局部变量 要了解sass或less的变量,有必要先了解下js的变量定义,先来一段js的代码: var a = 1; (function(){ a = 5; })(); console.log(a);//5 上面这段代码,匿名函数里面的a因为没有使用var关键字来定义,所以当我们在函数外打印a的时候,得到的是5,改变了一开始定义的1 var...

Windows服务器实现自动化部署-Jenkins

在引入自动化部署工具的时候,对比了jenkins和gitlab CI,jenkins有非常丰富的插件,配置起来方便。gitlab CI更倾向于脚本配置,当然jenkins也可以使用pipeline实现全脚本化配置。我们这里主要讲述jenkins的自动化部署。基本组合是jenkins+git+msbuild,实现从代码仓库拉取、编译、打包、部署、自动化测试。...

从IL认识关键字(一)

背景       网上流传“没有用.NET Reflector反编译并阅读过代码的程序员不是专业的.NET程序员” 。虽然是夸张手法,但是.NET Reflector确实是.Net程序员必不可少的一个工具。但是最近7.0后版本开始收费,功能是强大了,可以直接在VS上反编译看源代码。还有更多的功能没深入研究,但是再多的功能也抵不过编译成.net代码和IL。...

web 大文件分片上传处理

这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得出来,实体类中已经有很多我们需要的功能了,还有实用的属性。如MD5秒传的信息。 首先是文件数据接收逻辑,负责接收控件上传的文件块数据,然后写到服务器的文件中...

Navigation Bar的简单设置

前面的一篇文章《iOS开发16:使用Navigation Controller切换视图》中的小例子在运行时,屏幕上方出现的工具栏就是Navigation Bar,而所谓UINavigationItem就可以理解为Navigation Bar中的内容,通过编辑UINavigationItem,我们可以使得在Navigation Bar中显示想要的东西,比如设置...

一分钟开始持续集成之旅系列之: Vue + 腾讯云 COS 上传部署

前言 随着Web应用的发展,运行在浏览器端的Web应用能够承担更多且更复杂的业务交互需求,前后端分离模式得以流行,并催生了如 Vue 、 React 等单页应用框架。这些框架简化了开发流程,但对于Web应用的部署并没有统一的解决方案。许多项目团队中,前端开发者在提交代码后仍然需要人工通知项目经理、运维等相关同事进行手动或者繁琐的更新操作。而将持续集成的概念...