Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将32位已编译二进制文件转换为64位_C++_Assembly_X86 64_32bit 64bit_Decompiler - Fatal编程技术网

C++ 如何将32位已编译二进制文件转换为64位

C++ 如何将32位已编译二进制文件转换为64位,c++,assembly,x86-64,32bit-64bit,decompiler,C++,Assembly,X86 64,32bit 64bit,Decompiler,背景: 我们已经购买了一款软件产品,它可以在VisualStudio中构建32位Windows应用程序。我们希望将此应用程序移植到64位 此代码的一个关键任务组件是最初由第三方使用gFortran构建的黑盒静态库(.A文件)。最初的开发人员已经去世,我们能够获得的Fortran源代码不完整,并且不是构建此库的版本(并且包含编译库中不存在的关键bug)。他们没有使用VCS 问题: 我想创建一个64位静态库,它的代码在功能上等同于我们现有的32位静态库 我所尝试的: 使用雪人反编译程序,获得64位

背景: 我们已经购买了一款软件产品,它可以在VisualStudio中构建32位Windows应用程序。我们希望将此应用程序移植到64位

此代码的一个关键任务组件是最初由第三方使用gFortran构建的黑盒静态库(.A文件)。最初的开发人员已经去世,我们能够获得的Fortran源代码不完整,并且不是构建此库的版本(并且包含编译库中不存在的关键bug)。他们没有使用VCS

问题: 我想创建一个64位静态库,它的代码在功能上等同于我们现有的32位静态库

我所尝试的:

  • 使用雪人反编译程序,获得64位C++编译的源代码。这被证明是不可能的,因为生成的代码使用了低级别的内在函数,这些函数似乎是特定于gcc的。它可能无论如何都不会工作,因为这样的内部函数会编译成在64位中功能上不等价的代码。我可能需要一个更好的反编译器
  • 显然,x86程序集是有效的x86_64程序集,因此我简要介绍了为什么不能通过64位汇编程序运行该程序集。结果表明ABI在64位上是不同的,因此调用约定不匹配。也许我可以手动将函数调用转换为适当的约定,并保持其余的不变,但这可能是一个棘手的问题。意见

您可以保留32位二进制库,但将其加载到32位主机进程中,并使用某种IPC(共享内存、命名管道、本地环回网络连接等)向64位进程传输数据或从64位进程传输数据


这种方法的另一个优点是,如果Fortran代码崩溃,那么它只会导致子主机进程停机,而不是主应用程序,并且您的程序可以立即再次启动它;如果它是一个单线程Fortran程序,那么您可以启动多个实例以实现多核并行。

“因为生成的代码使用了低级别的内在函数,这些函数似乎是特定于gcc的”,例如?很可能会将这些内容翻译成您选择的编译器(MSVC?)。我的意思是,每个人都需要一个更好的反编译器,但这些并不完全可用。intrinsic的全部意义在于,它们将您与平台分离,因此如果您在针对x86-64的库中使用它们,那么您将获得x86-64代码。另外,正如您所说,x86-32与x86-64非常相似,因此只需翻译代码即可。太宽泛了;雇佣一个程序员。@CodyGray我看到的是uuu return\u address()和uuu zero\u stack\u offset()。它不是使用自己的函数参数生成代码,而是手动复制汇编代码以从堆栈中读取它们。因为ABI是不同的,所以它不会在64位中运行。您认为uuu return\u address()可能具有MSVC等价物_ReturnAddress(),这是正确的,但我找不到uuuu zero\u stack\u offset()的等价物。它们的记录非常糟糕。谢谢你的意见。@CodyGray“雇佣一名程序员”那么,你工作的那个人在没有真正审查他们正在购买的资产的情况下进行了购买。这对他们来说也太糟糕了。他们必须咬紧牙关。任何欺骗二进制文件的行为都是不可信的。他们只需要用他们的新产品和收购的公司来解决这个突出的问题。这里最大的问题是,除了“我能做什么?”之外,你没有其他问题。这个问题的答案太宽泛了,原因你应该已经很清楚了,之前你曾试图自己调查过。这个问题的唯一真正答案是对如何反编译/逆向工程和转换代码的全面讨论,这超出了一本书所能涵盖的范围。如果你有关于狭义问题的具体问题,那么你可以问这些问题。如果你只是在寻找确认,这将是非常困难的,那么你已经得到了。这是一个黑客(最多)。继续保持下去,玩得开心。@JesperJuhl:那不是黑客。本质上,它是COM代理过程如何(以及为什么)工作的。启动代理进程是一个已解决的问题。IPC是一个已解决的问题。@IInspectable如果您没有源代码,但实际上只是一个黑盒子,那么它就是一个黑客。你没有办法知道你建立的通信在任何情况下都能工作,你没有办法调试问题,你没有办法升级依赖关系,你没有任何真正的信念,相信事情会继续工作。等等。这是一个黑客行为。@JesperJuhl:这个评论可能适用于这个问题,而不是这个答案。你知道界面,这就是你所需要的,用这个答案中解释的方式使用一个黑盒子。这并不比OP已经在做的事情更骇人。@JesperJuhl-不,我没有。但我生活在现实世界中,公司会做出这样愚蠢的决定,我的工作就是告诉他们我能想到的所有选择。编辑:以及每种方法的成本。