2017-10-20 93 views
2

最近我们挖掘出了一个运行一个不起眼的内部应用程序的服务器;它运行在tomcat6/java6内部,并且自从多年以来一直没有维护。完全反编译java6 web应用程序

对于初学者,我撕开了应用程序(而不是战争,而是一个“爆炸”在/var/lib/tomcat6/webapps/ROOT目录)从服务器中,并成立了泊坞环境(使用debian-eol/squeeze为基础),所以应用程序的工作,而不需要旧的时代机。但是我们仍然需要修复软件中的错误,并且我们没有任何源代码(也不是最初编写它的人)。

jdGui可以拆卸的单个组件的jar文件和.class文件,但有没有办法把整个项目(这是在一堆-SNAPSHOT罐子的分裂在WEB-INF/lib/,再加上一堆OSS库)到的东西可以在Eclipse或IDEA中加载并“简单地”重新编译?

+1

简短的回答,没有。您可能会开始进行一个可怕的任务,即从您选择的反编译器JD-GUI中获得的源代码重新构建源代码。然后重新编译,部署和测试它们直到有效。我现在不想成为你。 – Mena

+0

反编译的质量取决于编译时的原始编译器设置。现在我建议你做一个损害评估 - 你是否需要获得完整的资源,或者你可以做一个简单的修复,包括替换一两个课程。答案可能会决定你的行动和预算,因为这需要时间。 –

+0

请注意,最新版本的IntelliJ具有相当好的反编译器。这可能会让你感觉不错。 –

回答

1

jdGui可以拆卸的单个组件的jar文件和的.class文件 [...],但有没有办法把整个项目东西 可以在Eclipse或IDEA加载和“简单”是重新编译?

有一种方法,无论您称之为“简单”方式还是“非简单”方式在很大程度上取决于您是否看到这些步骤简单但耗时,或耗时,因此不会简单。

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

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

最后,代码的结构需要足够的了解,以便正确地修改您的问题。如果幸运的话,您的问题会影响一小段封装的代码块。在这种情况下,可以构建一小组单元测试,以确保修复不会破坏其他无证但需要的逻辑。

如果你不走运,那么你的修复将需要更新很多不同的模块。同样,这意味着所有正在改变的模块都必须被很好地理解,以便进行安全的更改(在可能几乎不可读的环境中)。

所以,它可以做到。这只是很多工作,很多工作可能不会直接影响您想要解决的问题。熟悉这方面的人员可以重新包装JAR文件,以便在工作进行时获得一些运行时调试。我之前做过,并且完全理解了梅纳的评论;但是,我是一只奇怪的鸟,我喜欢这项工作。

这就是说,如果你有足够的口袋,我只会打扰你。将流量记录到容器中或从容器中注销可能会更便宜,并且可以编写一个新的替换项来执行相同的操作(但是,如果不记录那些不会发送的超级重要消息,您将面临风险:在你没有捕获的条件下)。

+0

因此,项目新闻 - jdGui实际上设法得到了原始变量名称,唯一缺少的是评论,但我可以忍受这一点。它共有512个文件,分布在7个JAR中,它们看起来基本没问题。有没有办法为Maven自动生成pom.xml以及能够“重建”这些项目的东西,还是我必须从头开始编写它? –

+1

@MarcoSchuster你使用的工具并不重要,我会使用你最熟悉的工具。也就是说,您需要确定依赖关系的确切版本,或者使用该工具来使用现有jar文件的库目录。第一个是更多的工作,但通常很有用,因为您通常会调试进出库(因为通常可以找到已知版本代码的源代码)。基本上,你正试图编写原始项目文件中可能存在的内容。 –

相关问题