完全反编译 java6 Web 应用程序

Fully decompile java6 web application

最近我们挖出了一个服务器运行一个不起眼的内部应用;它 运行 在 tomcat6/java6 中并且多年来一直没有维护。

首先,我将应用程序(不是 WAR,而是 /var/lib/tomcat6/webapps/ROOT 中的 "exploded" 目录)从服务器中删除并设置了 Docker 环境(使用debian-eol/squeeze 作为基础),因此该应用程序无需那台老化的旧机器即可运行。但是我们仍然需要修复软件中的错误,而且我们没有任何源代码(也没有最初编写它的人)。

jdGui 可以反汇编单个组件的 jar 文件和 .class 文件,但是有没有办法转换整个项目(在 WEB-INF/lib/ 中分成一堆 -SNAPSHOT jar,再加上一堆 OSS 库)变成可以加载到 Eclipse 或 IDEA 中的东西,然后 "simply" 重新编译?

jdGui can disassemble the individual component's jar files and .class files, [...] but is there a way to turn the whole project something that can be loaded in Eclipse or IDEA and "simply" be recompiled?

有一个方法,你称它为"simple"方法还是"non-simple"方法很大程度上取决于你认为步骤简单但耗时,还是耗时因此不简单

自动反汇编程序生成的代码很少看起来像开发人员编写的代码。这意味着你遇到了一个新问题,你很难阅读反汇编程序的代码。同时,在反汇编方面经验丰富的开发人员可以通过阅读 Java OpCodes 来编写代码,这些 OpCodes 可以编译出相同的直接替代品。这两种方法都增加了成功的机会。

然后是关于重构有意义的内部变量名的部分。这些通常对于使代码可读性至关重要,这将是廉价代码维护的先决条件。经验丰富的开发人员通常可以在调试器中观察平台的帮助下阅读代码的结构,并对变量命名进行有根据的猜测。通常这就足够了,但同样,这是一个缓慢的过程。

最后,需要充分理解代码的结构才能做出正确的更改来解决您的问题。如果幸运的话,您的问题会影响一小段封装的代码。在这种情况下,可以构建一小组单元测试以确保修复不会破坏其他未记录但需要的逻辑。

如果你运气不好,那么你的修复将需要同时更新许多不同的模块。同样,这意味着必须充分理解所有正在更改的模块才能进行安全更改(在它们可能几乎不可读的环境中)。

所以,可以做到。这只是很多工作,其中很多工作可能不会直接有助于解决您想要解决的问题。该领域的技术人员可以重新打包 JAR 文件,这样您就可以在工作进行时进行一些运行时调试。我以前做过,完全理解 Mena 的评论;但是,我是个怪鸟,我喜欢这个作品。

就是说,如果你有足够的财力,我才会费心。只记录进出容器的流量并编写一个新的替代品来做同样的事情可能会更便宜(但是,你将面临不记录不会发送的超关键消息的风险,除非在你没有捕获的条件下)。