Подтвердить что ты не робот

Как сделать С++ EXE более крупным (искусственно)

Я хочу сделать фиктивный файл EXE Win32, который намного больше, чем должен. Таким образом, по умолчанию файл котла Win32 EXE составляет 80 КБ. Я хочу 5 МБ для тестирования некоторых других утилит.

Первой идеей является добавление ресурса, но, как выясняется, встроенные ресурсы не совпадают с 5 МБ кода, когда речь идет о распределении памяти. Я думаю, что могу обратиться к большой библиотеке и получить огромный EXE файл? Если нет, возможно, скрипты нескольких тысяч подобных методов, таких как AddNum1, AddNum2 и т.д. И т.д.?

Любые простые идеи очень ценятся.

4b9b3361

Ответ 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 МБ.