Как сделать 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

Пример: https://softwareengineering.stackexchange.com/questions/2051/what-is-the-craziest-stupidest-silliest-thing-a-client-boss-asked-you-to-do/2698

Заполните файл EXE с помощью NOP в ассемблере.

Как насчет простого добавления двоичных нулей в конец.exe?

Вы можете создавать большие статические массивы фиктивных данных. Это увеличит ваш exe-размер, но не будет реальным кодом.

Я обнаружил, что даже с оптимизацией необработанные строки сохраняются как в скомпилированном исполняемом файле.

Таким образом, путь это:

  • перейти на http://lipsum.org/
  • генерировать много текста
  • добавить cpp в вашу программу
  • добавить статическую константную строку, которая будет иметь сгенерированный текст в качестве значения
  • компилировать
  • проверьте размер.

Если ваш компилятор имеет ограничение на размер необработанной строки (?), Просто создайте абзац для каждой статической строки.

Добавленный размер должен быть легко угадать.

Вы можете попробовать создать какой-то рекурсивный шаблон, который будет генерировать множество разных экземпляров. Это может привести к значительному увеличению размера кода.

Используйте Boost и скомпилируйте исполняемый файл с отладочной информацией.

Добавьте изображение размером 5 МБ (bmp).

После того, как вы выполните все методы, перечисленные здесь, скомпилируйте с флагом отладки и с самым высоким флагом оптимизации (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. Если нет, получите его).

Напишите генератор кода, который генерирует произвольные случайные функции. Единственный трюк - убедиться, что он не оптимизирован и с отдельной компиляцией, которая не должна быть сложной.

Другие вопросы по тегам