3

我本质上想要做的是让另一个程序将数据写入这个“空白空间”,以便可执行文件“工作”

我想在应用程序上附加一个签名,然后写入数据,稍后再搜索它,但这听起来不太正确......

现在,其他重要的事情......我知道应该可以通过使用以下代码来创建代码洞穴:

void function(void) {
__asm {
nop
nop
nop
nop
};
}

然后,即使这实际上是相同的(除了它将在 .data 部分中,因此不可执行):

const char data[3];

那么问题是另一个应用程序将没有明确的地址来写入。

4

3 回答 3

7

至少对于 PE 和 ELF,您可以将数据附加到可执行文件的末尾,而不会影响程序。

一种标准方法是将数据附加到可执行文件中,然后附加一个数字,指示已附加了多少字节。然后可执行文件打开自身进行读取,查看指示数据长度的最后 N 个字节,然后seek按该值向后移动,直到附加数据的开头。

本文非常详细地介绍了如何使用上述方法制作自解压可执行文件。这与您想要的有点不同,但是读取可执行文件中包含的数据的原理保持不变。

于 2009-10-01T16:58:53.040 回答
3

使用 ld 链接描述文件创建一个新部分,并在文件映像中保留实际空间。您还需要将符号与新数据部分相关联。也许创建一个简短的程序集文件会更容易,如下所示:

.section .myresource
.align 4
.globl myres
myres:
.fill 1048576

然后在您的 C 代码中,您将使用该符号来获取数据,如下所示:

extern const int* myres;

在此处查看 binutils 文档:http: //sourceware.org/binutils/docs-2.19/

于 2009-10-01T17:06:59.920 回答
0

您可以使用链接器脚本执行您所要求的操作。

基本上,function_name = 脚本中的地址。

于 2009-10-01T18:00:56.013 回答