最近我们挖出了一个运行模糊内部应用程序的服务器;它在tomcat6 / java6中运行,并且多年来一直没有维护。
对于初学者,我将应用程序(不是WAR而是/var/lib/tomcat6/webapps/ROOT
中的“爆炸”目录)从服务器中删除并设置了Docker环境(使用debian-eol/squeeze
作为基础),因此应用程序正在工作,不需要老年人的机器。但我们仍然需要修复软件中的错误,而且我们没有任何源代码(也不是最初编写它的人)。
jdGui可以反汇编单个组件的jar文件和.class文件,但有没有办法可以转换整个项目(在WEB-INF/lib/
中分成一堆-SNAPSHOT jar,再加上一堆OSS库)可以在Eclipse或IDEA中加载并“简单地”重新编译的东西吗?
答案 0 :(得分:1)
jdGui可以反汇编单个组件的jar文件和.class 文件,[...]但是有办法把整个项目变成一些东西 可以在Eclipse或IDEA中加载并“简单地”重新编译?
有一种方法,无论你称之为“简单”方式还是“非简单”方式,在很大程度上取决于你是否认为步骤简单但耗时,或耗时,因此并不简单。 / p>
自动反汇编程序倾向于生成很少看起来像开发人员编写代码的代码。这意味着您遇到一个新问题,您很难阅读反汇编程序的代码。与此同时,一位经验丰富的反汇编开发人员可以通过阅读Java OpCodes来编写代码,这些代码可以编译成相同的替代品。这两种方法都增加了成功的机会。
然后是关于重建有意义的内部变量名称的部分。这些通常对于使代码可读是至关重要的,这将是廉价代码维护的先决条件。经验丰富的开发人员通常可以通过在调试器中观察平台来协助读取代码的结构,并对他们为变量命名的内容做出有根据的猜测。通常这就足够了,但同样,这是一个缓慢的过程。
最后,需要充分理解代码结构,以便正确修改问题。如果幸运的话,您的问题会影响一小块封装的代码块。在这种情况下,可以构建一小组单元测试,以确保修复不会破坏其他未记录的,但在其他方面需要的逻辑。
如果您运气不好,那么您的修复将需要更新许多不同的模块。同样,这意味着必须充分理解所有正在进行更改的模块,以便进行安全更改(在可能几乎无法读取的环境中)。
所以,它可以做到。这只是很多工作,很多工作可能无法直接解决您想要修复的问题。熟悉此领域的人员可以重新打包JAR文件,以便在工作进行时获得一些运行时调试。我以前做过,完全理解梅纳的评论;但是,我是一只奇怪的鸟,我喜欢这项工作。
那就是说,如果你有足够的口袋,我只会烦恼。将流量记录到容器中以及从容器中记录流量可能会更便宜,并编写一个新的替代品来执行相同的操作(但是,您将面临不记录超级关键消息的风险,除非这些消息不会被发送在你没有捕获的条件下。)