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

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

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


20年前开发了
10年前退休的开发人员
/> GUI应用程序
可独立运行
大小500Kb

任何建议我有什么选择来应对此类问题?逆向工程是唯一的选择,还是有更好的方法?

评论

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

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

修改它的另一种方法是获取原始程序产生的结果并将其过滤到您想要的任何内容中。

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

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

#1 楼

如果您不只是想了解程序的逻辑,而是要更改并重新编译它,则逆向工程可能会变得非常困难。因此,我想尝试的第一件事就是寻找不同的解决方案。 br />
如果这仅仅是您想要的,并且程序可以完成计算,那么为什么不使用您选择的语言(可能是Excel宏)编写一个调用旧版“ exe”程序,将输出进行进一步处理。

评论


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

– jpmc26
16年5月27日在23:57



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

–凯文
16年5月28日在8:30



@ jpmc26:我从来没有遇到任何麻烦亲自调用subprocess.run()。

–凯文
16年5月28日在8:39

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

–凯文
16年5月28日在8:43

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

–布朗博士
16年5月30日在8:50

#2 楼

除了Doc Brown和Telastyn已经给出的答案之外,我还建议一种替代方法(假设它是关键任务)。是(某种程度上)关键任务:通过任何必要的方法推导.exe文件中的原始逻辑。如有必要,使用IDA等反编译器/反汇编器对其进行解码。如有必要,请雇用一名顾问(或一批顾问)。

当然,现在就使用他们的解决方案解决该问题,但不要随它去。建议如下:您已经承认计算非常复杂(根据与您交谈的工程师的说法)。这也是关键任务。因此,如果以某种方式原始.exe停止工作,由于你(也许16位支持被丢弃?),你只是失去了一个关键的一块知识的平台变化。

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

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

评论


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

– phyrfox
16年5月27日在16:33

很好的一点。另外:只需修补它,使其再次起作用,只有在需要实施下一个修复程序之前,它才起作用。

–Daniel Jour
16年5月27日在16:56

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

–... J ...
16年5月28日在1:38

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

– Sjoerd Job Postmus
16年5月28日在11:56

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

–埃里克·利珀特
16年5月28日在12:44

#3 楼

可能的话,请问原始程序员。

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

评论


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

–user1717828
16年5月27日在18:36

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

–保罗
16年5月27日在19:40



您还记得吗? :)

–Ángel
16年5月27日在23:31

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

–保罗
16年5月28日在12:19

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

–JDługosz
16年6月1日在9:28

#4 楼


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


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

创建一个新程序以接收Excel输出,同时也进行格式/列更改,而不是修改您不容易访问的黑盒。然后,您可以制作一个新的exe / script来依次调用这两个程序,因此最终用户似乎只有一个程序可以完成所有工作-尽管这是两个独立的步骤。

评论


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

–cmaster-恢复莫妮卡
16年5月27日在15:26

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

– corsiKa
16年5月27日在17:47

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

–曼上尉
16年5月27日在18:18

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

–cmaster-恢复莫妮卡
16年5月27日在18:23

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

–user22018
16年5月27日在19:23

#5 楼

有些公司专门研究此类问题。他们使用专有代码将本机代码反编译为高级语言,然后运用人类专业知识使其有用(例如,为变量提供适当的名称)。 / 390大型机代码到Linux服务器上。我们给了他们一个二进制文件,他们给了我们C语言的源代码。如果您只关心输出的格式,则只需在产生输出后对其进行按摩即可。但是,正如其他人指出的那样,将业务逻辑隐藏在二进制二进制文件中可能会带来持续的风险。

#6 楼

在程序周围编写一个简单的包装程序,以捕获其输出。做到这一点并不复杂,因为许多语言(例如Java,C ++,Python,.NET)都有实现此目的的手段。解析输出并以期望的形式生成另一个。用户将调用您的新程序。旧的可执行文件将保留在它旁边,甚至可以在调用它之前自动从资源中提取。 />
这是一个GUI应用程序,不是阻塞问题。您可以启动它,生成输出,然后在此GUI终止时自动对其进行后处理。

评论


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

– Laf
16年5月30日在20:31

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

–桅杆
16年5月31日在8:32

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

– h22
16年5月31日在9:54

不是拒绝投票的人,也看不出为什么得到了-3 ... Meta再次出现了吗?但是,我建议不要(A)这是一个主观判断,而(B)在我的主观判断中,包含了这一点!

– underscore_d
16年5月31日在12:06



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

– h22
16年5月31日在12:23

#7 楼

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

确定在各种情况下正确的输出,然后尝试编写满足相同测试的实现。 />我不会沿逆向工程路线走。反转机器代码非常复杂,您应该已经知道exe的用途是什么。逆向工程对于您所追求的工作来说有点麻烦。 20年前扩展了机器的GUI程序几乎不会在现代机器上注册,因此您可能正在寻找相对容易复制的东西。

#8 楼

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

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

评论


exe的日期应该没关系

–Ángel
16年5月27日在23:32

实际上,随着优化器每年变得越来越智能,逆向工程只会变得越来越困难。

– MSalters
16年5月31日在11:39