Как сделать C++ EXE больше (искусственно)
Я хочу сделать фиктивный файл Win32 EXE, который будет намного больше, чем должен быть. Таким образом, по умолчанию размер файла Win32 EXE-файла составляет 80 КБ. Я хочу 5 МБ для тестирования некоторых других утилит.
Первая идея заключается в добавлении ресурса, но, как выясняется, встроенные ресурсы не равны 5 МБ кода при распределении памяти. Я думаю, что могу сослаться на большую библиотеку и в конечном итоге с огромным файлом EXE? Если нет, возможно, написание нескольких тысяч похожих методов, таких как AddNum1, AddNum2 и т. Д. И т. Д.?
Любые простые идеи очень ценятся.
19 ответов
Используйте большой массив постоянных данных, таких как явные строки:
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;
}
И этот код, и его вывод компилируются чисто.
Как насчет простого определения большого статического массива символов?
char const bigarray[5*1024*1024] = { 1 };
Смотрите также мой другой ответ в этой теме, где я предлагаю статически ссылаться на большие библиотеки. Это, безусловно, потянет реальный код, если вы просто будете ссылаться на достаточный код библиотек.
РЕДАКТИРОВАТЬ: Добавлена ненулевая инициализация, так как данные, содержащие только нули, обрабатываются компилятором / компоновщиком оптимизированным способом.
РЕДАКТИРОВАТЬ: Добавлена ссылка на мой другой ответ.
РЕДАКТИРОВАТЬ: Добавлен константный квалификатор, поэтому многие компиляторы будут размещать большой массив среди кода.
char big[5*1024*1024] = {1};
Вам нужно инициализировать его чем-то отличным от 0, иначе компилятор / компоновщик может его оптимизировать.
Если вы хотите увеличить размер файла, добавьте текстовый файл в конец исполняемого файла требуемого размера.
Я делал это, когда клиенты жаловались на маленьких бывших. Они не понимали, что маленькие бывшие так же профессиональны, как и большие. На самом деле в некоторых языках есть команда bloat() для увеличения размера exe, обычно в компиляторах BASIC.
РЕДАКТИРОВАТЬ: нашел старую ссылку на фрагмент кода, который используют люди: http://www.purebasic.fr/english/viewtopic.php?f=12&t=38994
Вы можете создавать большие статические массивы фиктивных данных. Это увеличит ваш exe-размер, но не будет реальным кодом.
Я обнаружил, что даже с оптимизацией необработанные строки сохраняются как в скомпилированном исполняемом файле.
Таким образом, путь это:
- перейти на http://lipsum.org/
- генерировать много текста
- добавить cpp в вашу программу
- добавить статическую константную строку, которая будет иметь сгенерированный текст в качестве значения
- компилировать
- проверьте размер.
Если ваш компилятор имеет ограничение на размер необработанной строки (?), Просто создайте абзац для каждой статической строки.
Добавленный размер должен быть легко угадать.
Вы можете попробовать создать какой-то рекурсивный шаблон, который будет генерировать множество разных экземпляров. Это может привести к значительному увеличению размера кода.
Используйте Boost и скомпилируйте исполняемый файл с отладочной информацией.
После того, как вы выполните все методы, перечисленные здесь, скомпилируйте с флагом отладки и с самым высоким флагом оптимизации (gcc -g -O3
).
Напишите программу, которая генерирует много кода.
printf("000000000");
printf("000000001");
// ...
printf("010000000");
Признаюсь, я парень из Linux/UNIX. Можно ли статически связать исполняемый файл в Windows? Затем вы можете сослаться на некоторые тяжелые библиотеки и взорвать свой размер кода, сколько захотите, без написания большого количества кода самостоятельно.
Еще одна идея, которую я обдумал, читая ваш комментарий к моему первому ответу, - добавление нулей в ваш файл. Как я уже сказал, я не эксперт по Windows, так что это может не сработать.
Если ничего не помогает, вы все равно можете создать исходный файл на ассемблере, в котором у вас есть соответствующее число db
операторы, передающие байты в сегмент кода, и связывают результирующий объект кода с вашей программой как extern "C" { ... }
,
Возможно, вам придется поиграть с компилятором / компоновщиком, чтобы компоновщик не мог оптимизировать этот фиктивный объект "кода".
Используйте #define для определения множества макросов, которые содержат строку с огромной длиной, и используйте эти макросы внутри вашей программы во многих местах.
Статически свяжите wxWidgets с вашим приложением. Он мгновенно станет большим 5 МБ.
Вы могли бы сделать это:
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
Если бы это был командный файл, вы могли бы даже добавить его в качестве шага после компиляции, чтобы это происходило автоматически.
Как правило, вы можете скопировать столько информации, сколько хотите в конец исполняемого файла. Весь код / ресурсы хранятся в виде смещений с начала файла, поэтому увеличение его размера не должно на это влиять.
(Я предполагаю, что у вас есть dd в Windows. Если нет, получите его).
Напишите генератор кода, который генерирует произвольные случайные функции. Единственный трюк - убедиться, что он не оптимизирован и с отдельной компиляцией, которая не должна быть сложной.