我想制作一个比它应该大得多的虚拟 Win32 EXE 文件。所以默认情况下,样板 Win32 EXE 文件为 80 KB。我想要一个 5 MB 的空间来测试其他一些实用程序。
第一个想法是添加资源,但事实证明,在内存分配方面,嵌入式资源与 5 MB 代码不同。我在想我可以引用一个大型库并最终得到一个巨大的 EXE 文件?如果不是,也许编写几千个类似的方法,如 AddNum1、AddNum2 等?
非常感谢任何简单的想法。
我想制作一个比它应该大得多的虚拟 Win32 EXE 文件。所以默认情况下,样板 Win32 EXE 文件为 80 KB。我想要一个 5 MB 的空间来测试其他一些实用程序。
第一个想法是添加资源,但事实证明,在内存分配方面,嵌入式资源与 5 MB 代码不同。我在想我可以引用一个大型库并最终得到一个巨大的 EXE 文件?如果不是,也许编写几千个类似的方法,如 AddNum1、AddNum2 等?
非常感谢任何简单的想法。
简单地定义一个大的静态字符数组怎么样?
char const bigarray[5*1024*1024] = { 1 };
另请参阅我在此线程中的其他答案,我建议静态链接到大型库。如果您只引用足够的库代码,这肯定会引入真正的代码。
编辑:添加了非零初始化,因为编译器/链接器以优化方式处理仅包含零的数据。
编辑:添加了对我的其他答案的参考。
编辑:添加了 const 限定符,因此 bigarray 将被许多编译器放置在代码中。
char big[5*1024*1024] = {1};
您需要将其初始化为 0 以外的值,否则编译器/链接器可能会对其进行优化。
如果它是您要增加的文件大小,则将一个文本文件附加到所需大小的 exe 的末尾。
当客户抱怨小前任时,我曾经这样做过。他们没有意识到小前任和大前任一样专业。事实上,在某些语言中有一个 bloat() 命令来增加 exe 的大小,通常在 BASIC 编译器中。
编辑:找到人们使用的一段代码的旧链接:http ://www.purebasic.fr/english/viewtopic.php?f=12&t=38994
在汇编程序中用 NOP 填充 EXE 文件。
在 .exe 的末尾添加二进制零怎么样?
您可以创建虚拟数据的大型静态数组。那会增加您的 exe 大小,但不是真正的代码。
使用大量常量数据,例如显式字符串:
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;
}
此代码及其输出都可以干净地编译。
我发现即使进行了优化,原始字符串也会在编译后的可执行文件中保持原样。
所以要走的路是:
如果您的编译器有原始字符串大小(?)的限制,那么只需为每个静态字符串创建一个段落。
增加的大小应该很容易猜到。
您可以尝试创建某种递归模板,该模板会生成许多不同的实例化。这可能会导致代码大小大幅增加。
使用 Boost 并使用调试信息编译可执行文件。
编写一个生成大量代码的程序。
printf("000000000");
printf("000000001");
// ...
printf("010000000");
如果一切都失败了,您仍然可以创建一个汇编语言源文件,其中有适当数量的db
语句将字节发送到代码段中,并将生成的代码对象链接到您的程序extern "C" { ... }
。
您可能需要使用编译器/链接器来防止链接器优化掉那个虚拟的“代码”对象。
我承认,我是一个 Linux/UNIX 人。是否可以在 Windows 中静态链接可执行文件?然后,您可以引用一些繁重的库并尽可能多地放大您的代码大小,而无需自己编写太多代码。
在阅读您对我的第一个答案的评论时,我思考的另一个想法是将零附加到您的文件中。如前所述,我不是 Windows 专家,所以这可能行不通。
添加 5MB (bmp) 图像。
完成此处列出的所有方法后,使用调试标志和最高优化标志 ( gcc -g -O3
) 进行编译。
使用#define 定义大量包含巨大长度字符串的宏,并在程序中的许多地方使用这些宏。
你可以这样做:
REM generate gibberish of the desired size
dd if=/dev/random of=entropy count=5000k bs=1
REM copy the entropy to the end of the file
copy /b someapp.exe + entropy somefatapp.exe
如果它是一个批处理文件,您甚至可以将其添加为编译后步骤,以便它自动发生。
您通常可以将尽可能多的信息复制到 exe 的末尾。所有代码/资源都存储为文件开头的偏移量,因此增加它的大小不应该影响它。
(我假设您在 Windows 中有dd。如果没有,请获取)。
编写一个生成任意随机函数的代码生成器。唯一的技巧是确保它不会被优化出来,并且单独编译应该不难。
将 wxWidgets 静态链接到您的应用程序。它将立即变为 5 MB 大。