2010-10-01 22 views
16

Quiero hacer un archivo EXE ficticio Win32 que sea mucho más grande de lo que debería ser. Por lo tanto, de forma predeterminada, un archivo EXE Win32 de placa de caldera tiene 80 KB. Quiero una de 5 MB para probar algunas otras utilidades.Cómo hacer que un C++ EXE sea más grande (artificialmente)

La primera idea es agregar un recurso, pero resulta que los recursos integrados no son los mismos que los 5 MB de código cuando se trata de la asignación de memoria. ¿Estoy pensando que puedo hacer referencia a una gran biblioteca y terminar con un enorme archivo EXE? Si no, ¿tal vez crear scripts de unos miles de métodos similares como AddNum1, AddNum2, etc., etc.?

Cualquier idea simple es muy apreciada.

+6

¿Podría darnos una idea de qué problema está tratando de resolver? – Francesco

+1

La pregunta no aclara cuál es el propósito. Entonces la respuesta no ayudará mucho a otros. – frast

+1

Para agregar más contecto a la pregunta: – Phil

Respuesta

4

utilizar una gran variedad de datos constantes, como cuerdas explícitas:

char *dummy_data[] = { 
    "blajkhsdlmf..(long script-generated random string)..", 
    "kjsdfgkhsdfgsdgklj..(etc...)...jldsjglkhsdghlsdhgjkh", 
}; 

A diferencia de los datos variables, los datos constantes cae a menudo en la misma sección de la memoria como el código real, aunque esto puede ser compilador o dependiente del enlazador.

Editar: me probaron los siguientes y funciona en 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; 
} 

Tanto el código y su salida compilar limpiamente.

+0

Intenté algo así como esto y terminó con un error C2026. Parece que hay un límite de 16K en las matrices? – Phil

+1

Si sus cadenas tienen 1K de longitud, solo necesita 5K elementos en la matriz, lo que hace que el tamaño de matriz sea 20K (es una matriz de punteros a cadenas constantes). –

+0

Habría utilizado el ensamblaje en línea para crear una diapositiva NOP en alguna parte. Sería más limpio, semánticamente correcto y algo más documentado. Sin mencionar que es menos probable que el compilador lo arruine. –

5

Puede crear grandes conjuntos estáticos de datos ficticios. Eso aumentaría el tamaño de tu exe, aunque no sería un código real.

+0

Esa parece la forma más simple y fácil de controlar el método para hacer algo como esto. –

+2

Pensé en esto también cuando vi la pregunta, pero ¿no será optimizada? – legends2k

+0

@ legends2k: la respuesta simple es desactivar las optimizaciones ... – sth

16

¿Qué hay de simplemente definir una gran matriz de caracteres estáticos?

char const bigarray[5*1024*1024] = { 1 }; 

Véase también mi otra respuesta en este hilo de texto en la que sugiero que se enlace estáticamente a las grandes bibliotecas. Esto seguramente atraerá código real si solo hace referencia a un código suficiente de las bibliotecas.

EDITAR: Se ha agregado una inicialización distinta de cero, ya que los datos que contienen ceros solo se tratan de manera optimizada por el compilador/vinculador.

EDITAR: Agregó referencia a mi otra respuesta.

EDITAR: Se agregó calificador const, por lo que bigarray se colocará entre código por muchos compiladores.

+0

No es exactamente lo que quiero hacer. Quiero que el exe en el disco sea más grande, no el uso de memoria. Gracias de cualquier forma. – Phil

+1

Si nunca lo usa, nunca debería cargarse en la memoria física. Entonces, a menos que esté preocupado por el impacto que tiene en el espacio de direcciones virtuales disponibles, no se preocupe. –

+1

@Phil: Usted dice que desea que el tamaño sea mayor solamente en el disco y no en el uso de la memoria, pero luego en la pregunta real, usted dice que la asignación de memoria debe ser de 5Mib. ¿Me estoy perdiendo de algo? – legends2k

9
char big[5*1024*1024] = {1}; 

Debe inicializarlo en algo distinto de 0 o el compilador/enlazador puede optimizarlo.

+0

Esto solo inicializará el primer elemento, el resto será cero. http: // stackoverflow.com/questions/201101/how-to-initialize-an-array-in-c – SuperJames

+2

Eso es cierto, pero a los fines de esta pregunta no importa exactamente en qué se inicializa. Establecer el primer elemento en un valor distinto de cero parece ser suficiente para evitar que el compilador optimice esa variable. En otras palabras, cuando lo configura en ceros, el compilador simplemente dice "debería haber 5 millones de ceros aquí". Mientras que esto lo obliga a decir "hay uno, seguido de un cero, seguido de un cero ..." – Ferruccio

1

Escriba un programa que genere una gran cantidad de código.

printf("000000000"); 
printf("000000001"); 
// ... 
printf("010000000"); 
+0

Sí, esa es la forma más obvia de producir una gran cantidad de código adicional (en lugar de solo datos estáticos). También puede hacerlo usando copiar y pegar, apoyándose en la tecla de pegar. – ChrisW

+1

@ChrisW: si está utilizando copiar y pegar, copiar y pegar exponencialmente es mejor que apoyarse en una tecla: Ctrl-A, C, V, V, repetir registro (n) veces – Amnon

6

¿Qué tal si agregamos ceros binarios al final de .exe?

+11

¿Por qué no agregar algunos ceros hex? Esos son más grandes: P. – notJim

0

Si falla todo lo demás, puede crear un archivo fuente de lenguaje ensamblador donde tenga un número apropiado de db sentencias que emitan bytes en el segmento de código y vincular el objeto de código resultante a su programa como extern "C" { ... }.

Es posible que necesite jugar con el compilador/vinculador para evitar que el vinculador optimice ese objeto "código" ficticio.

3

He encontrado que incluso con las optimizaciones, las cadenas sin formato se mantienen tal como están en el archivo ejecutable compilado.

Así que el camino a seguir es:

  • ir a http://lipsum.org/
  • generar una gran cantidad de texto
  • añadir un CPP en su programa
  • agregar una cadena de static const que tendrá la genera texto como valor
  • compilar
  • comprobar el tamaño.

Si su compilador tiene un límite de tamaño de cadena sin formato (?), Simplemente haga un párrafo por cadena estática.

El tamaño agregado debe ser fácil de adivinar.

2

Puede intentar crear algún tipo de plantilla recursiva que genere una gran cantidad de instancias diferentes. Esto podría causar un gran aumento en el tamaño del código.

+0

También tiempo de compilación; las plantillas son una de las principales razones por las cuales C++ compila tan lentamente. – imgx64

0

Use #define para definir montones de macros que contengan cadenas de gran longitud, y use esas macros dentro de su programa en muchos lugares.

8

Complete el archivo EXE con NOP en el ensamblador.

+3

Estaba a punto de sugerir eso. –

1

Admito que soy un tipo Linux/UNIX. ¿Es posible vincular estáticamente un ejecutable en Windows? A continuación, puede hacer referencia a algunas librerías pesadas e incrementar el tamaño de su código tanto como desee sin tener que escribir demasiado código.

Otra idea que pondere al leer su comentario en mi primera respuesta es agregar ceros a su archivo. Como dije, no soy un experto en Windows, por lo que podría no funcionar.

+1

"¿Es posible vincular estáticamente un ejecutable en Windows?" - Sí, lo es, pero el vinculador solo vinculará/incluirá los objetos de la biblioteca que la aplicación necesita (referencia). – ChrisW

+0

@ChrisW: ¿Puede haber una opción como "--whole-archive" para ld en linux para forzar al enlazador a incluir todo? – ThR37

+0

Sí esto funciona. Intenta vincular estáticamente wxWidgets. –

9

Si se trata del tamaño de archivo que desea aumentar, añada un archivo de texto al final del exe del tamaño requerido.

Solía ​​hacer esto cuando los clientes se quejaban de pequeños ex. No se dieron cuenta de que los pequeños exes son tan profesionales como los mayores. De hecho, en algunos idiomas hay un comando de hinchar() para aumentar el tamaño de los ex, generalmente en compiladores BÁSICOS.

EDIT: Encontró un antiguo enlace a un trozo de código que usa la gente: http://www.purebasic.fr/english/viewtopic.php?f=12&t=38994

Un ejemplo: https://softwareengineering.stackexchange.com/questions/2051/what-is-the-craziest-stupidest-silliest-thing-a-client-boss-asked-you-to-do/2698#2698

+3

¿Qué? !! ¿Clientes que se quejan de pequeños EXEs? No creo que haya tratado con un cliente tan tonto. – ptomato

+2

¡Sí, créalo o no! es similar a una cámara pesada. ¡Cuanto más pesado es, mejor debe ser! ¡Las versiones del programa inicial de Bloat y con cada actualización sucesiva reclaman huellas de memoria más pequeñas debido a optimizaciones adicionales! ;) –

+0

¿No hay alguna validación de suma de comprobación para EXE que fallará si agrega un archivo? – Amnon

2

impulsar el uso y compilar el ejecutable con información de depuración.

1

Agregue una imagen de 5MB (bmp).

0

Usted puede hacer esto:

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 

Si se tratara de un archivo por lotes, incluso se podría añadir como un paso posterior a la compilación por lo que sucedió automáticamente.

En general, puede copiar toda la información que desee al final de un exe. Todos los códigos/recursos se almacenan como desplazamientos desde el comienzo del archivo, por lo que aumentar su tamaño no debería afectarlo.

(supongo que tiene dd en Windows. Si no es así, consígalo).

0

Escriba un generador de código que genere funciones arbitrarias aleatorias. El único truco es asegurarse de que no se optimice y con una compilación separada que no sea difícil.

1

Después de hacer todos los métodos enumerados aquí, compilar con el indicador de depuración y con el indicador de optimización más alto (gcc -g -O3).

0

Enlace estático wxWidgets a su aplicación. Se convertirá instantáneamente en 5 MB de tamaño.

Cuestiones relacionadas