我想制作一个虚拟的Win32 EXE文件,比它原本的大小要大得多。正常情况下,一个样板Win32 EXE文件大小为80KB。我想制作一个5MB大小的EXE文件来测试其他实用程序。
第一个想法是添加资源,但事实证明,嵌入式资源与内存分配时的5MB代码不一样。我在考虑是否可以引用一个大型库并最终获得一个巨大的EXE文件?如果不行,也许可以编写几千个类似的方法,如AddNum1、AddNum2,等等。
任何简单的想法都非常欢迎。
我想制作一个虚拟的Win32 EXE文件,比它原本的大小要大得多。正常情况下,一个样板Win32 EXE文件大小为80KB。我想制作一个5MB大小的EXE文件来测试其他实用程序。
第一个想法是添加资源,但事实证明,嵌入式资源与内存分配时的5MB代码不一样。我在考虑是否可以引用一个大型库并最终获得一个巨大的EXE文件?如果不行,也许可以编写几千个类似的方法,如AddNum1、AddNum2,等等。
任何简单的想法都非常欢迎。
那么是否可以简单地定义一个大的静态字符数组呢?
char const bigarray[5*1024*1024] = { 1 };
请参考我在本主题中提供的另一个答案,我建议静态链接到大型库。如果您只引用足够多的库代码,这肯定会引入真实的代码。
编辑:添加了非零初始化,因为仅包含零的数据由编译器/链接器以优化的方式处理。
编辑:添加了对我的其他答案的引用。
编辑:添加const限定符,使得许多编译器将bigarray放置在代码中。
char big[5*1024*1024] = {1};
你需要将其初始化为非0值,否则编译器/链接器可能会进行优化。
使用汇编语言将EXE文件填充为NOPs。
使用一个大的常量数据数组,例如明确的字符串:
char *dummy_data[] = {
"blajkhsdlmf..(long script-generated random string)..",
"kjsdfgkhsdfgsdgklj..(etc...)...jldsjglkhsdghlsdhgjkh",
};
与可变数据不同,常量数据通常与实际代码位于同一内存段中,尽管这可能取决于编译器或链接器。
编辑:我在Linux上测试了以下内容,它可以正常工作:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i, j;
puts("char *dummy_data[] = {");
for (i = 0; i < 5000; i++) {
fputs(" \"", stdout);
for (j = 0; j < 1000; j++) putchar('a' + rand() % 26);
puts("\",");
}
puts("};");
return 0;
}
这段代码和它的输出都可以干净地编译。
您可以创建大型的静态数据数组。这将增加exe文件的大小,但不是真正的代码。
您可以尝试创建一种递归模板,以生成许多不同的实例。这可能会导致代码大小的大幅增加。
使用Boost,并使用调试信息编译可执行文件。