如何创建一个;“空的”;在一个可执行文件中指定地址的空间(gcc、linux)?

如何创建一个;“空的”;在一个可执行文件中指定地址的空间(gcc、linux)?,linux,gcc,executable,portable-executable,Linux,Gcc,Executable,Portable Executable,我本质上想做的是让另一个程序将数据写入这个“空空间”,让可执行文件“工作” 我想在应用程序中添加一个签名,然后写入数据,稍后再搜索,但这听起来不太正确 现在,另一件重要的事情。。。我知道应该可以使用以下代码创建代码洞: void function(void) { __asm { nop nop nop nop }; } 然后,即使这实际上也是一样的(除了它将位于.data部分,因此不可执行之外): 然后,问题是另一个应用程序将没有明确的写入地址。至少对于PEs和ELF,您可以在不影响程序的情况

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

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

现在,另一件重要的事情。。。我知道应该可以使用以下代码创建代码洞:

void function(void) {
__asm {
nop
nop
nop
nop
};
}
然后,即使这实际上也是一样的(除了它将位于.data部分,因此不可执行之外):


然后,问题是另一个应用程序将没有明确的写入地址。

至少对于PEs和ELF,您可以在不影响程序的情况下将数据附加到可执行文件的末尾

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


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

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

.section .myresource
.align 4
.globl myres
myres:
.fill 1048576
extern const int* myres;
然后在C代码中使用符号获取数据,如下所示:

.section .myresource
.align 4
.globl myres
myres:
.fill 1048576
extern const int* myres;
请在此处查看binutils文档:

您可以使用


基本上,脚本中的函数_name=address。

您如何建议其他应用程序获得偏移量?它可以通过使用中的结构来读取自定义部分。大多数非编译器程序都是这样做的,它们根据您输入的数据生成唯一的可执行文件——大多数自解压压缩程序,
py2exe
我想也是。