您可能会想像不到源代码。
可执行文件是使用C / C ++编写的,并使用gcc进行编译。
ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, not stripped


根据file,这些是程序使用的库:

    libssl.so.1.0.0 => /lib/i386-linux-gnu/libssl.so.1.0.0 (0xf7700000)
    libcrypto.so.1.0.0 => /lib/i386-linux-gnu/libcrypto.so.1.0.0 (0xf7554000)
    libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf7528000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf737e000)
    libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xf7363000)
    librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xf7359000)
    libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xf7270000)
    libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xf726b000)
    libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xf7252000)
    /lib/ld-linux.so.2 (0xf7789000)
    libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xf7234000)


所有这些库也可在64位版本。

问题:


是否可以将应用程序重新组装为64位应用程序?
存在哪些工具可以帮助实现这一目标? ? (如果可能)


#1 楼

即使不是问题,因为实际上很难组装,我希望您可以尝试重新组装以外的方法,或者它至少是一个很小且没有混淆的文件。
低级别
重新组装将非常困难:
工具:除了IDA和常规的逆向工程方法(我想将DOS / NE文件移植到PE的请求类似),我想不到一个特定的工具可以提供帮助
调用约定:从32b移植到64b会很困难,因为调用约定不同,因此需要在程序集级别进行重写。至少ELF的结构非常相似。
高水平的
您最好的选择是尝试通过Hex-Rays Decompiler进行反编译以节省麻烦,但是在反编译之前,仍然需要进行大量繁琐的工作代码可以按预期工作。

评论


您的意思是“通话惯例不同”。我以为这最终是操作系统/可执行文件格式的要求?

–ŹV-
13年4月10日在16:27

在寄存器中而不是在堆栈中传递函数参数

–天使
13年4月10日在16:34

我知道,对于某些exe来说,还不一样吗?我相信通常在寄存器中传递两项,而在Windows的“标准”调用约定中将其余项传递到堆栈中?为什么(除了寄存器大小)这些调用约定是不同的?

–ŹV-
13-4-10在16:38



(exe在PE中,对吗?)我写这条代码是为了提醒PE调用约定。

–天使
13年4月10日在16:43

我知道,我以为微软将其称为“标准”,现在我知道它的名称为FastCall -顺便说一下,您和corkami都很棒。我告诉我遇到的每个人,谁会听你们的。

–ŹV-
13年4月10日在16:44

#2 楼

这里的问题是您需要什么?您是否需要能够在64位元上运行该程序并与之交互,还是要实际移植它的目标?那些允许在64位上运行32位程序的程序),您可能可以使用标准ld.so方法(LD_PRELOAD和朋友)来拦截各种功能,如我如何向现有二进制可执行文件添加功能的答案中所述。 />从那里开始,您将能够通过内存映射文件或套接字或您认为合适的任何IPC机制,与现有且未更改的32位程序进行交互。
坦白地说,这是
在Debian 5上,兼容性层位于以下两个软件包中:
libc6-dev-i386 - Embedded GNU C Library: 32-bit development libraries for AMD64
libc6-i386 - Embedded GNU C Library: 32-bit shared libraries for AMD64

在Ubuntu 10.04到12.04上使用了相同的名称。这些是我目前可以检查的唯一版本,但我知道RHEL / CentOS / ScientificLinux中有类似的内容。
移植它
否则,您将遇到很多问题,
一般来说,如果您很幸运,而且看起来像那样,调试信息(not stripped表示)将允许您整理源文件的名称,因此您可能能够将像库这样的拼图碎片放在一起,然后可以专注于“实际”代码。这可能不是一个很大的优势,但是对于逆向工程师而言,每一个细小的帮助都可以。
像Hex-Rays插件或Hopper附带的反编译器可能是获得更高级概念的好方法。编码。除非您专注于所需的功能部件,否则这仍然需要大量工作-这就是为什么我(很懒惰和所有人)总是选择上述选项,即以兼容模式运行它的原因。