Java开发之反编译

标签: 无 分类: 未分类 创建时间:2023-07-11 01:39:24 更新时间:2024-11-15 10:49:43

前言

作为一个程序员,免不了自己的代码被人破解,知道如何破解,才能有效的防止破解,这就是常说的,要想学会打架要先学会挨打。

1.JD-GUI

这个使用了JD-GUI看了看,好像也还可以。
(1) 下载

(2) 启动JD-GUI

1
java -jar jd-gui.jar

(3) 打开jar文件,查看原代码

参考文章:
1.jar还原源码 发现了一个save!一阵兴奋,然后点了保存试了一下,发现导出来的zip文件就是反编译后的整个源码!
2.超好用的java反编译工具(Java Decompiler)
3.如何将已经部署好了的web项目反编译,并对其中的类文件进行修改 因需要在没有源代码的条件下对项目中的类文件进行修改,我使用的办法是先将整个项目打成jar包,jar包中的内容可以不完全都是.class文件,可以是任意格式的类型文件。
4.修改jar包中class文件并重新打包 1.jar -xvf 解压;2.jar -cvf 重新打包;3.jar umf META-INF/MANIFEST.MF 更新;

2.Bytecode-Viewer

JD-GUI的效果其实并不好,除了能看到部分的代码,其实对于导出,一点用都没有。另外一个比较好的工具就是 Bytecode-Viewer,操作上也非常的简单。用jd-gui打开的war文件,可能有部分的类缺失,特别是enum类型。Bytecode-Viewer支持打开war文件,然后也支持打开jar文件,内容还是很全的。

(1) 下载 bytecode-viewer
去官网下载就好了。

(2) 运行

1
java -jar Bytecode-Viewer-2.11.2.jar

(3) 查看代码并导出
在进行保存的时候,弹出来了这么个选择框。经过测试,要选择后面的两个才能把一些jd-gui无法反编译的内容编译出来

(4) 修改代码
编译导出后的代码,并不是一定能直接使用。在我遇到的情况的时候,就是 lambda 表达式,在经过反编译后,所有的类型推断都没有了,比如 Map<String,Integer> test,就会直接变成了 Map test,所以在调用 test.feath(e->{}) 这种语法都时候,并不能准确的知道 e 的类型,往往都会变成了 object 这样的类型。

参考文章:
1.Bytecode Viewer 字节码查看器 1.Procyon:核心框架、反射框架、表达式框架、编译器工具集(实验性)、Java 反编译器(实验性。2.CFR(Class File Reader):将反编译现代 Java 功能 - 直到并包括 Java 9、12 和 14 的大部分内容,但完全用 Java 6 编写,因此可以在任何地方使用! 它甚至可以很好地将其他 JVM 语言的类文件转换回 Java!3.Fernflower:IDEA 内置的反编译器。它是是第一个实际工作的 Java 分析反编译器,一般来说可能是一种高级编程语言。
2.反编译后的代码不全怎么办,教你一招分分钟解决 这里提供了另外的一个发编译的工具 bytecodeviewer

3.war包进行反编译

tomcat中的 webapps 目录下的应用程序已经是解压缩之后的了,如何使用 jd-gui 进行查看呢?
(1) 创建一个 manifest.mf 文件

(2) 执行文件打包
使用 jar 命令,增加cfm参数,可以将 mapserver 打包成 jarfilename.jar 文件,这样就可以在 jd-gui 中查看全部大的代码了。

1
jar cfm jarfilename.jar mapserver/manifest.mf mapserver/

(3) 使用 bytecode-viewer 打开这个 war 包,并重新进行导出操作。

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。