[C con Clase] ¿Alguien sabe destripar librerías...?

Programante programante en gmail.com
Vie Ago 29 19:54:02 CEST 2008


xonly escribió:
> Hola bueno, antes de nada dar las gracias a Steven por ayudarme y hacer que este mensaje sea posible, y felicitar a todos por hacer que esto mejore, ya que es de lo mejorcito que he visto por la red.
>
> Ahora ya en materia, resulta que me encanta complicarme la vida, y a pesar que me encanta el mundo de la programación desde hace mucho tiempo (época del Spectrum y el Amstrad) resulta que no he podido dedicarme demasiado a este mundo, y cada día tengo más ganas de dedicarme en sério, pero resulta que como decía antes me encanta romperme la cabeza en tonterías, y por ello me cuesta tanto avanzar.
>
> CUESTIÓN: porqué resulta que si hago un simple ejemplo que hay para empezar (ese que te trae el Dev-C++ de "Hola mundo") resulta que ocupa nadamenos que 474.990 bytes, resulta que según esto jamás sería posible escribir algo con el amstrad o con el spectrum (los primeros tenían solo 4k) que pasa es que vamos para atrás en lugar de hacia delante, pues parece ser que sí.
>   

#define Mensaje "Hola mundo"
#include <fcntl.h>
int main() {
 write (1, Mensaje, sizeof(Mensaje) - 1);
 return 0;
}

En código asm, 20 líneas
16.091 bytes de programa


#include <stdio.h>
int main() {
 printf("Hola mundo");
 return 0;
}
15.473 bytes

Mucho menos de lo que tú mencionas. No estamos incluyendo templates y 
las llamadas
Pero no hemos acabado, si eliminamos la información de símbolos y 
reposicionamiento (necesaria si queremos que se pueda cargar en otra 
dirección de memoria virtual), ambos casos bajan a 5.632 bytes.
Y buena parte de ese espacio se debe a "redondeos" de las secciones del 
ejecutable, para que sea múltiplo del tamaño de página, etc. Podría 
comprimirse más. Sin ir más lejos, podríamos eliminar los últimos 322 bytes.
Pero tienes que tener en cuenta la sobrecarga que se añáde al principio. 
Así, los primeros 1024 bytes del ejecutable no contienen nada del 
programa. Sólo el stub de msdos y la definición de lñas secciones. 
Además el compilador añade antes de tu programa algo más de código para 
procesar los argumentos del programa, establecer el acceso a la consola...
En todo caso es un tamaño fijo, que en programas que no sean un "hola 
mundo" es superado por el código del propio programa.

Si te empeñas en seguir reduciendo el tamaño, podemos usar un compresor, 
como upx, bajando a 3584 bytes.

> El caso es que yo ya tenía mis sospechas pero al ir empezando aprovechando estas mini vacaciones que me ha dado el trabajo, he decidido intentarlo una vez más, y resulta que a las primeras de cambio me he quedado altamente indignado, además de por supuesto tener que tragarte numerosa documentación toda en inglés, que ya nos valdría a algún españolito o latinoamericano el hacer alguna traducción que otra, y sobre todo me he mosqueado muchísimo al ver que el tema este de código abierto, es todo un poco menos que una gran "farsa" al final todo está en librerías ocultas que no dejan ver ni la mitad de código que realmente va debajo de cada #include que hacemos, así que decidí ponerme manos a la obra con "buscar otros métodos" encontrandome gratamente con una actualización de los "viejos asm" con un super programa, el WinASM que tiene muy muy buena pinta, de hecho el mismo ejemplo me ha dejado el ficherito del "hola que tal" en tan solo 2.886 bytes al que después de alguna optimización lo he llegado a conseguir dejar en 2.560 bytes, todo un buen resultado comparandolo con el anterior ejemplo, el caso es que en este caso el WinASM, adolece de los mismos principios que el compilador de C, que tiene "librerías con funciones ocultas".
>   
Puedes usar nasm.

> Para mejorar esto, y en vista de que ningún debugger me resulta satisfactorio, no me ha quedado más remedio que utilizar el Visual Studio (al que me negaba tremendamente debido a que no me gusta precisamente su política de "ocultar" para que me puedas pagar....), pero sin duda, es un debugger genial, en el que al ir dándole a la ejecución paso a paso, te va mostrando las repetidas llamadas a funciones y más funciones, en el que creo haber contado hasta 26 ficheros abiertos, y por supuesto casi todos ellos inentendible e indescifrable para alguien que esta "medio empezando", a pesar de ello, me he dado cuenta de que por lo visto, la salida de datos en pantalla, la toma como si fuera un fichero, en la que como "stdout" tiene la "consola", aunque luego también es super patético y ridículo la conversión que realiza a una supuesta tabla de caracteres UTF que luego encima lo pone fatal, pues resulta que en el ejemplo precisamente del Dev-C++ resulta que en lugar de escribir "¡Hola mundo!" escribe "ÍHola Mundo" confundiendo el signo "¡" por una i mayúscula con acento, totalmente patético...
>   
No lo confunde. Se debe a la diferencia de charsets entre MS-DOS y 
Windows. En todo caso, esas conversiones y "funciones y funciones" deben 
estar en alguna librería del sistema, no en tu programa. La consola 
utiliza el mismo charset que los antiguos programas de ms-dos. Redirige 
la salida a un archivo y verás cómo puedes leer los caracteres bien en 
Windows.

> Vamos a ver señores de windows, que lo único que necesito es:
>
> - activar el modo consola
> - escribir literalmete("Hola que tal")
> - devolver el control sacando otro mensaje de "pulsa una tecla porque he terminado"
> - cerrar la consola
>
> para todo esto se necesitan 474.990 bytes, que no, que no me lo trago, que así no se llega a ningún sitio, que no me puedo permitir comprarme ordenadores todos los días, ni megas ni discos duros... 
>
> En fin que si alguien me puede ayudar (preferiblemente en español) pues encantado, sino pues seguiré peleandome con los debugger y con "los supuestos servicios o APIs" o historias que no me gustaria aprender, pero que veo que no me quedará más remedio.
>   
Las prioridades han cambiado. Antes lo importante era que el programa 
ocupase poco, debiendo los programadores adaptar los programas a la 
máquina. Ahora es al revés, la prioridad está en que los programadores 
puedan programar de forma rápida, fácil y segura, aunque ello conlleve 
un ligero aumento del espacio. Es más importante el programador que la 
máquina, gracias a la Ley de Moore.

> NOTA: el linux es otra batalla abandonada que tengo, puede que retome esta historia si es que veo que el seguir con las libreríass estas no tiene buen final, pero me temo, que debido a que los supuestos "open source" no son más de lo mismo que lo que estoy viendo en programas de "código abierto" como con Dev-C++ o MinGW, que son las librerías que "intento destripar" sin ningún éxito por cierto, y al final me he tenido que "vender al enemigo". No me gusta tener que practicar esta forma de ingeniería inversa, pero veo que no queda más remedio.
En Linux, el primer programa sin símbolos, 3084 bytes.





Más información sobre la lista de distribución Cconclase