本人菜鸡一名,说的不够周到还请见谅。现在拿到一份虚机环境然后想把环境中的war还原成代码,反编译嘛,我觉得大部分人都接触过,看看源码啊啥的。先简单说说本次我用到的反编译工具。
首先说推荐的好用的工具JD,基本语法都正常,而且保留了编译后的那些内部类,方法,这匿名类方法具体我下面会说。但是有些语法糖,尤其是for循环反编译后结果有些乱,他总是把for循环的变量做成全局变量,这种时候该怎么办呢。我们就要用其他编译工具的结果做参考。
procyon,fernflower。这两个工具基本反编译结果也都很准确,但procyon对于中文字符串会成为Unicode编码,要手动改一下。
其他的反编译工具还有:CFR,Jad,小颖反编译也是基于jad的,结果都差不多。很久没更新了,或者说我没找到最新版本,Jad反编译的结果差强人意,CFR还好。
******************************工具下载*****************************************
下面给大家提供了工具下载地址:
链接:https://pan.baidu.com/s/1StEFl4PeQI6GYCzYqgxscA 密码:trwf
另外推荐一个很好用的在线反编译网站:
下面说说本次工作最费时间的地方,就是关于语法糖的反编译
参考文章:
https://blog.csdn.net/ol_beta/article/details/6787234
https://blog.csdn.net/danchu/article/details/54986442
语法糖(Syntactic Sugar)也叫糖衣语法,是英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语。指的是,在计算机语言中添加某种语法,这种语法能使程序员更方便的使用语言开发程序,同时增强程序代码的可读性,避免出错的机会;但是这种语法对语言的功能并没有影响。
Java中的泛型,变长参数,自动拆箱/装箱,条件编译等都是,下面做简单的介绍和分析。
简单说就是方便程序人员开发用的语法,经过编译后就变样了,打回原形。详细的大家参考上面两篇语法糖文章。
我这次遇到的大坑是关于匿名内部类的。
引用知乎的解释:
作者:夏小天
链接:https://www.zhihu.com/question/35410290/answer/220127341
匿名类即没有名字的类,在某个类内部使用,因为没有名字,别的类将无法调用它,只能在创建的时候,使用new语句声明它们。如this.addWindowListener(new WindowAdapter(){});因此,理解的时候可以将匿名类当做匿名内部类;
匿名内部类,即没有名字的内部类,正因为没有名字,所以只能用一次,程序员通常会考虑这个问题,从而精简代码。反过来说,当你发现某个类只需要被用一次的时候,不需要再单独的为此新起一个类名,只需要使用匿名内部类即可。
此外,匿名内部类必须要继承一个父类或者实现一个接口才能实现。