如何修改您没有源代码的程序的输出


89

在我们公司中,我们有一个小程序(大小为.exe 500Kb)进行数学计算,最后将结果吐出到Excel电子表格中,该电子表格用于继续我们的工作流程。

我想在Excel电子表格上修改列,间距格式并添加VBA逻辑等,但是由于该参数无法在该程序中配置,因此在我看来,修改它的唯一方法是对.exe进行分解/反向工程。

没有人知道用什么语言编程,我们唯一知道的是:

  1. 超过20年前开发
  2. 开发者10年前退休
  3. GUI应用
  4. 独立运行
  5. 尺寸500Kb

有什么建议可以解决这类问题吗?逆向工程是唯一的选择,还是有更好的方法?


149
您知道计算的内容吗?如果是这样,编写一个新的应用程序,通过两者推送一些测试数据以检查新的应用程序是否相同,然后丢弃旧的应用程序。然后进行您想要的更改。
David Arno

13
@DavidArno的评论将提供一个很好的答案。可以进行逆向工程,但是重新指定和重写应用程序将更便宜/更容易/更快捷。
Dan Pichelman

44
修改它的另一种方法是获取原始程序产生的结果并将其过滤到所需的内容中。
Blrfl

9
@Alec如果使用十六进制编辑器打开.exe,则可能会获得有关其编写内容的线索。例如,可能会嵌入编译器名称。从那里,您将了解有关可能的反编译选项的更多信息。
GrandmasterB

26
或者,您可以尝试找到编写该应用程序的绅士,看看他是否愿意作为顾问呆一两天(也许每天几个小时)。如果他是一名退休的开发人员,那么他有适度的机会可能会以$ 100-150 / hr的速度花一点钱,而实际上会享受短暂的工作(如果有时间的话)。
RLH

Answers:


234

如果您不只是想了解程序的逻辑,而是要更改并重新编译它,那么逆向工程就会变得非常困难,甚至变得更加困难。因此,我首先要尝试的是寻找其他解决方案。

我想在Excel电子表格上修改列,间距格式并添加VBA逻辑等

如果这只是您想要的,并且程序可以完成计算,那么为什么不使用您选择的语言(可能是Excel宏)编写一个调用旧版“ exe”的程序,则将其输出并进行处理进一步。


9
为什么新程序必须调用旧EXE?为什么不只是让新程序独立,然后编写一个脚本来调用这两个程序并协调输出和输入呢?我的经验表明,让命令行语言(如bash,PowerShell或命令提示符)处理进程坐标通常比尝试自己用命令式语言编写代码更简单。否则,+ 1。
jpmc26 2016年

8
@ jpmc26:在您必须处理Bash荒谬的报价规则之前,这是正确的。是的,它们(大多数)符合POSIX。不,它们没有任何该死的意义。例如,$ FOO不应单词拆分。
凯文

16
@ jpmc26:我从来没有遇到任何麻烦subprocess.run(),亲自打电话。
凯文

3
@ jpmc26:什么管道?这是纯粹的食谱;如果需要stdout,则可以传递魔术PIPE常数。否则,您将不会被丢弃。有什么要了解的?
凯文

3
...我应该补充一点,过去我确实非常成功地将Excel与VBA一起使用作为命令行实用程序的前端。结构始终相同:用于输入参数作为“穷人UI”的工作表,该工作表上的“开始”按钮。在VBA代码中,需要Shell在Excel VBA中进行如下调用:stackoverflow.com/questions/8902022/…,可以将cmd实用程序中的stdout / stderr传递到单独的文件中,然后应用输出格式。
布朗

114

除了Doc Brown和Telastyn已经给出的答案之外,我还想提出一种替代方法(假设它是关键任务)。

如果您不知道它执行的计算,并且这些计算是(某种程度上)关键任务:.exe通过任何必要的方法推导文件中的原始逻辑。如有必要,使用IDA等反编译器/反汇编器对其进行解码。如有必要,请雇用一名顾问(或一批顾问)。

当然,现在就使用他们的解决方案来解决它,但不要顺其自然。

我建议的原因如下:您已经承认计算非常复杂(根据与您交谈的工程师的说法)。这也是关键任务。因此,如果原始版本.exe由于您所拥有的平台的更改而以某种方式停止工作(也许不再提供16位支持?),那么您刚刚失去了关键任务知识

现在,我不再担心丢失.exe,而是担心丢失其编码的知识。该知识必须恢复。

像以前一样:如果该知识已经可用,请确保以不会很快丢失的格式写下该知识。否则,将其恢复并写下来。


14
现代反编译器实际上会生成通常清晰易懂的代码,尤其是如果原始源代码是纯C或汇编程序,而不是高级语言。
phyrfox

4
很好的一点。另外:只需对其进行修补以使其再次起作用,则仅在需要实施下一个修复程序之前起作用。
Daniel Jour

33
@phyrfox 20岁...开发人员10年前退休了...仅输出是Excel电子表格...作为VB6应用程序,我会花钱。
J ...

10
@micaho:或者公司仍然存在,并且掌握验证结果和隐藏假设的专业知识的人刚刚被卡车撞倒。当然,这是业务风险,因此最终由利益相关者决定。我只是想强调一下,“包装器”现在可以使用,但只会增加技术负担。
Sjoerd Job Postmus '16

22
@J ...:如果是VB6,那么原始的海报很幸运。您可以很容易地从VB6编译中恢复源代码。
埃里克·利珀特

74

如果可能,请询问原始程序员。

几周前,我曾与一家十年前的公司联系,询问关于90年代中期开发的mdb文件的相同问题。


52
这是真正的低挂水果。每个人(包括我自己)都将诸如逆向工程,重新实现程序的功能或在数据处理中添加层之类的硬编程技能的使用浪漫化。实际上,最好的起点是发送一封友好的电子邮件,该电子邮件可能会在一小时后随源代码或其他一些理想解决方案的位置一起返回。
user1717828

2
当我在家中使用10年的应用程序时,我也启动了一个反汇编程序,但在工作时间目标却有所不同^^
Paolo

2
您还记得吗?:)
安赫尔

2
当然!不幸的是,该公司进行了3项收购和合并,因此丢失了很多信息,部分备份丢失了。
保罗

1
扫描EXE以查找可能包含开发人员名称或其他内容的嵌入式字符串。这比完全拆卸容易!
JDługosz

55

有什么建议可以解决这类问题吗?

如果您只是想修改输出,那为什么不简单地使用composition呢?

而不是修改的黑盒子,你不能轻易地访问,您将创建一个新的程序,它的输出到Excel,并执行您的格式/列改变。然后,您可以制作一个新的exe / script,以依次调用这两个程序,因此对于最终用户来说,只有一个程序可以完成所有工作-尽管这是两个独立的步骤。


2
@Alec java是否适合使用语言,主要取决于需要处理的数据量/需要执行的计算量。如果两者均较低,则java很好。如果其中之一很关键,则最好使用C或C ++。但是由于无论如何您似乎都只使用适合Excel电子表格的数据量,所以我认为没有足够的数据使Java成为错误的选择(Excel可能会在您的应用程序之前爆炸)。
cmaster

18
@cmaster认为Java禁止进行繁重的计算是一个过时的概念。此处列出最差 基准甚至不是4倍(大多数是2倍或更小),如果单个标量是您的突破点,那么安全性的节省(直接转化为开发者的钱)很可能会抵消性能下降的影响。
corsiKa's

8
@Alec任何语言都可以。VBA似乎是一个不错的选择,因为它已经很好地与Excel集成了。
曼队长

4
@corsiKa这完全取决于您的应用程序规模。如果单次运行消耗数万个CPU小时,则2或4的系数就变得令人望而却步:它直接转化为可从数百万台计算机中获得的结果数量。而且,此类应用程序通常以锁步方式运行,因此垃圾回收对其性能纯属无害,小的中断将乘以进程数。我告诉你,这样的应用程序存在,而且它们肯定不是用Java编写的。只是普通互联网业务不使用它们。
cmaster

7
@cmaster我们正在谈论一些简单的计算,而不是具有实时全局照明,基于物理的渲染,动画的稀疏体素八方图,通用物理场模拟等功能的完整AAA游戏引擎。没有冒犯,但在此处插入任何自变量RE性能是不好的。易用性应该是#1,作为使用C ++几年的人,这是我在这种情况下推荐的最后一种语言。

3

有些公司专门研究此类问题。他们使用专有代码将本机代码反编译为高级语言,然后运用专业知识使其有用(例如,给变量指定适当的名称)。

几年前,我的雇主使用此方法将一些本地S / 390大型机代码迁移到Linux服务器上。我们给了他们一个二进制文件,他们给了我们C语言的源代码。

对于您而言,这是否必要取决于您。如果您只关心输出的格式,则只需在产生输出后对其进行按摩即可。但是,正如其他人指出的那样,将业务逻辑隐藏在二进制二进制文件中可能会带来持续的风险。


3

在程序周围编写一个简单的包装程序,以捕获其输出。做到这一点并不复杂,因为许多语言(例如JavaC ++Python.NET)都可以做到这一点。解析输出并以所需形式生成另一个。用户将调用您的新程序。旧的可执行文件将保留在其旁边,甚至可以在调用之前自动从资源中提取出来。

当然,只有在输出结构合理且易于解析的情况下,此解决方案才能充分发挥作用。

它是一个GUI应用程序,不是一个阻塞问题。您可以启动它,生成输出,然后在此GUI终止时自动对其进行后处理。


3
这与Doc Brown最受好评的答案有何不同?
拉夫

我不同意Doc的答案写得不好的假设。清晰简洁。
2016年

1
如果您看一下此答案的文本,将会看到唯一提供信息的部分恰好使最后一句“将您的旧版“ exe”称为末尾,将输出进行进一步处理”的末尾。
h22

2
不是拒绝投票的人,也看不出为什么得到-3 ... Meta再次出现了吗?但是,我建议不要单凭(A)这是一个主观判断,而(B)我的主观认为,您的答案就包含了其他人对“包含很多稀释大脑的blah”的回答。
underscore_d

如果这种方式看起来更有用,那么也可以将其重写为“包含无用的一般性演讲,只是分散了主题的注意力,浪费了读者的时间”。在最后一句的后半部分提供正确方法的提示。这无意侮辱。评论已删除。
h22

1

在旧代码上编写一些可以在尽可能多的情况下使用的测试。查找极端情况,测试错误的输入,然后测试正确的输入。

在各种情况下确定正确的输出,然后尝试编写满足相同测试的实现

我不会沿着逆向工程路线前进。反转机器代码非常复杂,您应该已经知道exe的用途是什么。逆向工程对于您追求的工作来说有点麻烦。

如果该软件是20年前由一个人开发的,那么可能并不需要很多现代功能。20年前扩展了机器的GUI程序几乎无法在现代机器上注册,因此您可能正在寻找相对容易复制的东西。


0

尝试对exe进行反向工程。仅出于寻找计算逻辑的目的或至少可以清楚地了解其实际功能,并且如果您的逆向工程可以使您达到这一点,则可以基于该计算逻辑编写新的应用程序。除此之外,我看不到其他出路。

说起来容易做起来难,对20年前创建的exe进行逆向工程确实是挑战。


12
exe文件不应该真正重要的约会
安赫尔

1
实际上,随着优化器每年变得越来越智能,逆向工程只会变得越来越困难。
MSalters '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.