我想创建一个比它应该大得多的虚拟Win32 EXE文件。因此默认情况下,锅炉板Win32 EXE文件为80 KB。我想要一个5 MB的测试其他实用程序。
第一个想法是添加一个资源,但事实证明,在内存分配方面,嵌入式资源与5 MB代码不同。我想我可以引用一个大型库,最终得到一个巨大的EXE文件?如果没有,可能会编写几千个类似的方法,如AddNum1,AddNum2等等?
非常感谢任何简单的想法。
答案 0 :(得分:16)
如何简单地定义一个大的静态字符数组?
char const bigarray[5*1024*1024] = { 1 };
另请参阅此主题中的其他答案,我建议静态链接到大型库。如果您只是引用了足够的库代码,这肯定会引入实际代码。
编辑:添加了非零初始化,因为编译器/链接器以优化的方式处理仅包含零的数据。
编辑:添加了对我的其他答案的引用。
编辑:添加了const限定符,因此bigarray将被许多编译器放在代码中。
答案 1 :(得分:9)
char big[5*1024*1024] = {1};
您需要将其初始化为0以外的值,否则编译器/链接器可能会对其进行优化。
答案 2 :(得分:9)
如果是要增加的文件大小,则将文本文件附加到所需大小的exe的末尾。
当顾客抱怨小前辈时,我常常这样做。他们没有意识到小前辈和大前辈一样专业。实际上在某些语言中有一个膨胀()命令可以增加exes的大小,通常是在BASIC编译器中。
编辑:找到人们使用的一段代码的旧链接:http://www.purebasic.fr/english/viewtopic.php?f=12&t=38994
答案 3 :(得分:8)
在汇编程序中使用NOP填充EXE文件。
答案 4 :(得分:6)
如果只将二进制零添加到.exe的末尾?
答案 5 :(得分:5)
您可以创建虚拟数据的大型静态数组。这会碰到你的exe大小,但不会是真正的代码。
答案 6 :(得分:4)
使用大量常量数据,例如显式字符串:
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;
}
这段代码及其输出都干净利落地编译。
答案 7 :(得分:3)
我发现即使使用优化,原始字符串也会保留在已编译的可执行文件中。
所以要走的路是:
如果您的编译器有原始字符串大小限制(?),那么只需为每个静态字符串创建一个段落。
增加的尺寸应该很容易猜到。
答案 8 :(得分:2)
您可以尝试创建某种递归模板,以生成许多不同的实例。这可能会导致代码大小的增加。
答案 9 :(得分:2)
使用Boost并使用调试信息编译可执行文件。
答案 10 :(得分:1)
编写一个生成大量代码的程序。
printf("000000000");
printf("000000001");
// ...
printf("010000000");
答案 11 :(得分:1)
执行此处列出的所有方法后,使用调试标志和最高优化标志(gcc -g -O3
)进行编译。
答案 12 :(得分:1)
我承认,我是Linux / UNIX的人。是否可以在Windows中静态链接可执行文件?然后,您可以引用一些重型库并尽可能多地扩大代码大小,而无需自己编写大量代码。
我在阅读您对第一个答案的评论时考虑的另一个想法是将零添加到您的文件中。如上所述,我不是Windows专家,所以这可能不起作用。
答案 13 :(得分:1)
添加5MB(bmp)图像。
答案 14 :(得分:0)
将wxWidgets静态链接到您的应用程序。 它将立即变为5 MB大。
答案 15 :(得分:0)
编写一个生成任意随机函数的代码生成器。那么唯一的技巧就是确保它不会被优化,并且使用不应该很难的单独编译。
答案 16 :(得分:0)
你可以这样做:
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。如果没有,那就去吧。
答案 17 :(得分:0)
使用#define定义许多包含巨大字符串的宏,并在很多地方使用程序中的那些宏。
答案 18 :(得分:0)
如果所有其他方法都失败了,您仍然可以创建一个汇编语言源文件,其中有适当数量的db
语句将字节发送到代码段,并将生成的代码对象链接到您的程序{{1 }}
您可能需要使用编译器/链接器来阻止链接器优化掉那个虚拟的“代码”对象。