Как сделать С++ EXE более крупным (искусственно)
Я хочу сделать фиктивный файл EXE Win32, который намного больше, чем должен. Таким образом, по умолчанию файл котла Win32 EXE составляет 80 КБ. Я хочу 5 МБ для тестирования некоторых других утилит.
Первой идеей является добавление ресурса, но, как выясняется, встроенные ресурсы не совпадают с 5 МБ кода, когда речь идет о распределении памяти. Я думаю, что могу обратиться к большой библиотеке и получить огромный EXE файл? Если нет, возможно, скрипты нескольких тысяч подобных методов, таких как AddNum1, AddNum2 и т.д. И т.д.?
Любые простые идеи очень ценятся.
Ответы
Ответ 1
Используйте большой массив данных константа, таких как явные строки:
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;
}
Оба этого кода и его вывод компилируются чисто.
Ответ 2
Как просто определить большой статический массив char?
char const bigarray[5*1024*1024] = { 1 };
См. также мой другой ответ в этой теме, где я предлагаю статически связывать большие библиотеки. Это, безусловно, потянет реальный код, если вы просто указали достаточно кода библиотек.
EDIT: добавлена ненулевая инициализация, поскольку данные, содержащие нули, обрабатываются оптимизированным образом компилятором/компоновщиком.
EDIT: добавлена ссылка на мой другой ответ.
EDIT: добавлен определитель констант, поэтому bigarray будет помещен среди кода многими компиляторами.
Ответ 3
char big[5*1024*1024] = {1};
Вам нужно инициализировать его чем-то другим, кроме 0, или компилятор/компоновщик может его оптимизировать.
Ответ 4
Заполните файл EXE с помощью NOP в ассемблере.
Ответ 5
Если это размер файла, который вы хотите увеличить, добавьте текстовый файл в конец exe требуемого размера.
Я делал это, когда клиенты жаловались на небольшие exes. Они не понимали, что небольшие exes так же профессиональны, как и более крупные exes. Фактически на некоторых языках существует команда bloat() для увеличения размера exes, обычно в компиляторах BASIC.
EDIT: найдена старая ссылка на часть кода, которую люди используют: http://www.purebasic.fr/english/viewtopic.php?f=12&t=38994
Пример: https://softwareengineering.stackexchange.com/questions/2051/what-is-the-craziest-stupidest-silliest-thing-a-client-boss-asked-you-to-do/2698#2698
Ответ 6
Как насчет добавления бинарных нулей в конец .exe?
Ответ 7
Вы можете создавать большие статические массивы фиктивных данных. Это повлияло бы на ваш размер exe, но не был бы настоящим кодом.
Ответ 8
Я обнаружил, что даже с оптимизацией необработанные строки сохраняются как в скомпилированном исполняемом файле.
Итак, путь:
- перейти к http://lipsum.org/
- генерировать много текста
- добавить cpp в вашу программу
- добавить статическую константную строку, которая будет иметь сгенерированный текст как значение
- компиляции
- проверьте размер.
Если ваш компилятор имеет ограничение на размер необработанной строки (?), тогда просто создайте абзац для каждой статической строки.
Добавленный размер должен быть легко угадан.
Ответ 9
Вы можете попробовать создать какой-то рекурсивный шаблон, который будет генерировать множество разных экземпляров. Это может привести к значительному увеличению размера кода.
Ответ 10
Используйте Boost и скомпилируйте исполняемый файл с информацией об отладке.
Ответ 11
Напишите программу, которая генерирует много кода.
printf("000000000");
printf("000000001");
// ...
printf("010000000");
Ответ 12
Я признаю, что я парень Linux/UNIX. Возможно ли статически связать исполняемый файл в Windows? Затем вы можете ссылаться на некоторые тяжелые библиотеки и взорвать свой размер кода столько, сколько хотите, не пиши себе много кода.
Еще одна идея, которую я размышлял при чтении вашего комментария к моему первому ответу, - это добавление нулей в ваш файл. Как сказано, я не эксперт по Windows, поэтому это может не сработать.
Ответ 13
Добавьте изображение размером 5 МБ (BMP).
Ответ 14
После того, как вы выполните все перечисленные здесь методы, скомпилируйте флажок отладки и самый высокий флаг оптимизации (gcc -g -O3
).
Ответ 15
Если все остальное не удается, вы все равно можете создать исходный файл языка ассемблера, в котором у вас есть соответствующее количество операторов db
, испускающих байты в сегменте кода, и связать полученный объект кода с вашей программой как extern "C" { ... }
.
Возможно, вам придется сыграть с компилятором/компоновщиком, чтобы не допустить, чтобы компоновщик удалял этот фиктивный "код".
Ответ 16
Используйте #define, чтобы определить множество макросов, которые содержат строку с большой длиной, и использовать эти макросы внутри вашей программы во многих местах.
Ответ 17
Вы можете сделать это:
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. Весь код/ресурсы хранятся как смещения от начала файла, поэтому увеличение его размера не должно влиять на него.
(Я предполагаю, что у вас dd в Windows. Если нет, получите его).
Ответ 18
Напишите генератор кода, который генерирует произвольные случайные функции. Единственный трюк - это убедиться, что он не оптимизирован и с отдельной компиляцией, которая не должна быть трудной.
Ответ 19
Статически свяжите wxWidgets с вашим приложением.
Он мгновенно станет крупнее 5 МБ.