Ejemplo 06
Sobre Visual Basic 6 (I)
Muchísima gente sigue utilizando todavía el querido (queridísimo) Visual Basic 6. Por este motivo existen en la actualidad cientos de programas compilados en este lenguaje.
¿Quién no ha tenido alguna vez la curiosidad de abrir un programa compilado en Visual Basic (VB) con un editor de recursos?¿Qué observaremos?.
-Pues normalmente sólo veremos dos carpetas: Icon Group y Version.
¿Por qué?
-Pues porque como comenté al principio de todo, los editores de recursos analizan la sección de recursos (.rsrc) pero en los programas compilados con VB6, los recursos NO se encuentran en esa sección.
Un programa compilado con VB6 normalmente tiene 3 secciones:
-text (aquí el Entry Point)
-data
-rsrc (y es la que los editores de recursos leen)
Entonces, ¿dónde se guardan los recursos?
-Se guardan en la sección .text.
Buscar determinados recursos a mano por la sección .text, es una locura así que voy a utilizar un programa muy bueno que nos va a indicar dónde está cada cosa:
VB Decompiler Lite
Lo primero es configurarlo, así que en el menú Tools-Options en los apartados Form y Disasembler señalamos todas las tildes.
Ahora ya podemos abrir cualquier programa compilado en Visual Basic. Yo voy a abrir uno de ejemplo que acabo de hacer. Es éste:
Imagen33
Como se observa el botón no está centrado.
Veo en VB Decompiler lo siguiente:
Me está diciendo que:
-Se trata de un botón: CommandButton
-Su "caption": Caption
-Su posición en el formulario: Left y Top
-Sus dimensiones: Width y Height
-El índice del Tab: TabIndex = 0
-Y lo más importante de todo: Que se encuentra en el offset 00001230. (¡Qué buena información!. Esta información nos va a ayudar en nuestro cometido y pocos programas la dan).
Lo que voy a hacer es modificar por ejemplo:
-La posición del botón para centrarlo.(Solamente horizontal)
-Y voy a modificar también el texto mostrado ("Caption") por "Aceptar". En este último caso no tendré problemas ya que los dos textos constan de 7 bytes.
Voy a abrir el ejecutable en VB con cualquier editor hexadecimal. A la izquierda los editor hexadecimales nos indican el offset así que nos dirigimos a 00001230 y tendremos que ver lo siguiente:
Lo primero que voy a hacer es cambiar lo más fácil en este caso :el texto. Así que modificamos "Caption" y escribimos encima "Aceptar".
Ahora voy a mover el botón a la derecha para centrarlo. Sé por el VB Decompiler que el Left = 480. Utilizo la calculadora de Windows y convierto 480 decimal en hexadecimal: 480d == 01E0h.
Como sé que los datos se guardan al revés, sé que tengo que buscar por E001, así que en el código que he puesto arriba lo localizo rápidamente en la segunda linea (los dos penúltimos bytes).
Ahora hago unos cálculos matemáticos sencillos para centrar el botón:
Ancho formulario = 4185; 4185/2 = 2093
Ancho botón = 1335; 1335/2 = 668
Posición resultante para centrar: 2093 - 668 = 1425
1425 decimal = 0591 hex por lo tanto tengo que modificar los bytes E001 por 9105.
El final del código es el siguiente:
Lo guardo como ejemplo.exe, lo ejecuto y...
Imagen34
Esto es similar en todos los controles...
Ahora para finalizar viene de nuevo mi pasión por las imágenes, es un poco diferente.
Cómo modificar una imagen:
Voy a ir directamente al ejemplo. He creado una aplicación que sólo consta de una imagen. El acerca de, puede ser el siguiente:
Imagen35
Consta de una imagen. Vamos a ver cómo la podemos modificar.
Para extraer las imágenes voy a utilizar otro programa excelente, se trata de VBreformer su página web es la siguiente:
http://www.decompiler-vb.net/
Voy a abrir el programa en VB con este VB reformer. En mi caso, yo he utilizado el programa Trial Edition v.4.2. Y tras analizar la aplicación aparecen a la izquierda las siguientes carpetas:
*Informations-headers (para este tutorial nos olvidamos de ella)
*Forms-objetcs:
-Form1 - VB.form:
-Mi_imagen - VB.Image
*Visual Basic resources:
-Form1.frx:
-Form1.frx: 00000000
Ahora miro a la derecha y veo el siguiente código:
Yo me fijo en estos detalles:
1º El nombre de la imagen: Mi_imagen
2º El offset que me indica el formulario. Ya que la imagen estará más abajo de ahí: 'address 00001178
3º La imagen en cuestion. A la derecha me indica que la imagen es esta: Picture="Form1.frx":00000000. Así que voy a la izquierda (donde las carpetas) y selecciono la imagen correspondiente: -Form1.frx: 00000000
Ya tengo la imagen que quiero modificar. VBreformer tiene una opción valiosísima que nos permite extraer la imagen tal cual aparece en el código, así que lo voy a hacer: "File --> enregistrer l'image sous"
Yo la he llamado: imagen.bmp.
Ahora voy a buscar un dato importantísimo:
-El tamaño: 102734 bytes
Con toda esta información ya puedo modificar la imagen o crear otra a mi gusto. La única condición es que la imagen nueva NO DEBE sobrepasar de 102734 bytes. No he probado a modificar el formato pero supongo que dará error así que lo dejo igual: .bmp. La imagen que he creado la he llamado imagen_modificada.bmp
Yo he hecho esta imagen de igualmente 102734 bytes:
Imagen36
Ahora viene la parte más difícil de todo. Insertar esa imagen.
Voy a abrir el programa con un editor hexadecimal cualquiera y me voy a ir al offset antes marcado: 00001178.
Ahora bien, yo sé que una imagen en formato mapa de bits comienza por BM, así que un poco más abajo de ese offset voy a buscar esto comentado:
Ahí está el nombre de mi imagen, y después aparece lo comentado:BM. Ya tengo el inicio.
Ahora abro en otra pestaña del editor hexadecimal la imagen_modificada.bmp y copio todos sus bytes.
Ahora tengo que pegarlo pero sin que se agrege ningún byte de más, así que hay que hacer cálculos matemáticos:
Offset de inicio: 00001242 hex
Tamaño de la imagen: 102734 dec = 1914E hex
Offset final imagen: 00001242 + 0001914E = 0001A390 hex
Pero como el offset 00001242 ya contiene un byte pues hay que restarle 1. ¡IMPORTANTE!
Por lo tanto:
offset inicial: 00001242
offset final: 0001A38F
Ahora solamente y con mucho cuidado hay que seleccionar los bytes que hay entre esos offsets y pegar los que habíamos copiado. Sé por experiencia que seleccionarlos para un bitmap puede ser complicado, así que algunos editores hexadecimales permiten seleccionar pulsando la tecla Shift o simplemente lo que hago yo: visualizo 128 bytes por columna y en un momento lo selecciono todo.
Bueno, tras pegar lo que acabo de comentar ya tiene que aparecer lo siguiente:
Imagen37
Ciertamente si no se tiene experiencia, puede ser complicado realizar este último ejemplo que acabo de hacer.
Sobre Visual Basic 6 (I)
Muchísima gente sigue utilizando todavía el querido (queridísimo) Visual Basic 6. Por este motivo existen en la actualidad cientos de programas compilados en este lenguaje.
¿Quién no ha tenido alguna vez la curiosidad de abrir un programa compilado en Visual Basic (VB) con un editor de recursos?¿Qué observaremos?.
-Pues normalmente sólo veremos dos carpetas: Icon Group y Version.
¿Por qué?
-Pues porque como comenté al principio de todo, los editores de recursos analizan la sección de recursos (.rsrc) pero en los programas compilados con VB6, los recursos NO se encuentran en esa sección.
Un programa compilado con VB6 normalmente tiene 3 secciones:
-text (aquí el Entry Point)
-data
-rsrc (y es la que los editores de recursos leen)
Entonces, ¿dónde se guardan los recursos?
-Se guardan en la sección .text.
Buscar determinados recursos a mano por la sección .text, es una locura así que voy a utilizar un programa muy bueno que nos va a indicar dónde está cada cosa:
VB Decompiler Lite
Lo primero es configurarlo, así que en el menú Tools-Options en los apartados Form y Disasembler señalamos todas las tildes.
Ahora ya podemos abrir cualquier programa compilado en Visual Basic. Yo voy a abrir uno de ejemplo que acabo de hacer. Es éste:
Imagen33
Como se observa el botón no está centrado.
Veo en VB Decompiler lo siguiente:
Código [Seleccionar]
Begin VB.CommandButton Command1 'Offset: 00001230
Caption = "Caption"
Left = 480
Top = 240
Width = 1335
Height = 495
TabIndex = 0
End
Me está diciendo que:
-Se trata de un botón: CommandButton
-Su "caption": Caption
-Su posición en el formulario: Left y Top
-Sus dimensiones: Width y Height
-El índice del Tab: TabIndex = 0
-Y lo más importante de todo: Que se encuentra en el offset 00001230. (¡Qué buena información!. Esta información nos va a ayudar en nuestro cometido y pocos programas la dan).
Lo que voy a hacer es modificar por ejemplo:
-La posición del botón para centrarlo.(Solamente horizontal)
-Y voy a modificar también el texto mostrado ("Caption") por "Aceptar". En este último caso no tendré problemas ya que los dos textos constan de 7 bytes.
Voy a abrir el ejecutable en VB con cualquier editor hexadecimal. A la izquierda los editor hexadecimales nos indican el offset así que nos dirigimos a 00001230 y tendremos que ver lo siguiente:
Código [Seleccionar]
1230 0000 0001 0800 436F 6D6D 616E 6431 0004 ......Command1..
1240 0107 0043 6170 7469 6F6E 0004 E001 F000 ...Caption..à....
1250 3705 EF01 1100 00FF 0204 0000 5000 0000 7.......ÿ....P.....
Lo primero que voy a hacer es cambiar lo más fácil en este caso :el texto. Así que modificamos "Caption" y escribimos encima "Aceptar".
Ahora voy a mover el botón a la derecha para centrarlo. Sé por el VB Decompiler que el Left = 480. Utilizo la calculadora de Windows y convierto 480 decimal en hexadecimal: 480d == 01E0h.
Como sé que los datos se guardan al revés, sé que tengo que buscar por E001, así que en el código que he puesto arriba lo localizo rápidamente en la segunda linea (los dos penúltimos bytes).
Ahora hago unos cálculos matemáticos sencillos para centrar el botón:
Ancho formulario = 4185; 4185/2 = 2093
Ancho botón = 1335; 1335/2 = 668
Posición resultante para centrar: 2093 - 668 = 1425
1425 decimal = 0591 hex por lo tanto tengo que modificar los bytes E001 por 9105.
El final del código es el siguiente:
Código [Seleccionar]
1240 0107 0041 6365 7074 6172 0004 9105 F000 ...Aceptar..`...
Lo guardo como ejemplo.exe, lo ejecuto y...
Imagen34
Esto es similar en todos los controles...
Ahora para finalizar viene de nuevo mi pasión por las imágenes, es un poco diferente.
Cómo modificar una imagen:
Voy a ir directamente al ejemplo. He creado una aplicación que sólo consta de una imagen. El acerca de, puede ser el siguiente:
Imagen35
Consta de una imagen. Vamos a ver cómo la podemos modificar.
Para extraer las imágenes voy a utilizar otro programa excelente, se trata de VBreformer su página web es la siguiente:
http://www.decompiler-vb.net/
Voy a abrir el programa en VB con este VB reformer. En mi caso, yo he utilizado el programa Trial Edition v.4.2. Y tras analizar la aplicación aparecen a la izquierda las siguientes carpetas:
*Informations-headers (para este tutorial nos olvidamos de ella)
*Forms-objetcs:
-Form1 - VB.form:
-Mi_imagen - VB.Image
*Visual Basic resources:
-Form1.frx:
-Form1.frx: 00000000
Ahora miro a la derecha y veo el siguiente código:
Código [Seleccionar]
'address 00001178
Begin VB.Form Form1
...
...
Begin VB.Image Mi_imagen
'Object ID: 0x0001
Picture="Form1.frx":00000000
Left..
Top..
....
End
End
Yo me fijo en estos detalles:
1º El nombre de la imagen: Mi_imagen
2º El offset que me indica el formulario. Ya que la imagen estará más abajo de ahí: 'address 00001178
3º La imagen en cuestion. A la derecha me indica que la imagen es esta: Picture="Form1.frx":00000000. Así que voy a la izquierda (donde las carpetas) y selecciono la imagen correspondiente: -Form1.frx: 00000000
Ya tengo la imagen que quiero modificar. VBreformer tiene una opción valiosísima que nos permite extraer la imagen tal cual aparece en el código, así que lo voy a hacer: "File --> enregistrer l'image sous"
Yo la he llamado: imagen.bmp.
Ahora voy a buscar un dato importantísimo:
-El tamaño: 102734 bytes
Con toda esta información ya puedo modificar la imagen o crear otra a mi gusto. La única condición es que la imagen nueva NO DEBE sobrepasar de 102734 bytes. No he probado a modificar el formato pero supongo que dará error así que lo dejo igual: .bmp. La imagen que he creado la he llamado imagen_modificada.bmp
Yo he hecho esta imagen de igualmente 102734 bytes:
Imagen36
Ahora viene la parte más difícil de todo. Insertar esa imagen.
Voy a abrir el programa con un editor hexadecimal cualquiera y me voy a ir al offset antes marcado: 00001178.
Ahora bien, yo sé que una imagen en formato mapa de bits comienza por BM, así que un poco más abajo de ese offset voy a buscar esto comentado:
Código [Seleccionar]
Offset ASCII
1220 ..........Mi_ima
1230 gen.............
1240 ..BMN..........
Ahí está el nombre de mi imagen, y después aparece lo comentado:BM. Ya tengo el inicio.
Ahora abro en otra pestaña del editor hexadecimal la imagen_modificada.bmp y copio todos sus bytes.
Ahora tengo que pegarlo pero sin que se agrege ningún byte de más, así que hay que hacer cálculos matemáticos:
Offset de inicio: 00001242 hex
Tamaño de la imagen: 102734 dec = 1914E hex
Offset final imagen: 00001242 + 0001914E = 0001A390 hex
Pero como el offset 00001242 ya contiene un byte pues hay que restarle 1. ¡IMPORTANTE!
Por lo tanto:
offset inicial: 00001242
offset final: 0001A38F
Ahora solamente y con mucho cuidado hay que seleccionar los bytes que hay entre esos offsets y pegar los que habíamos copiado. Sé por experiencia que seleccionarlos para un bitmap puede ser complicado, así que algunos editores hexadecimales permiten seleccionar pulsando la tecla Shift o simplemente lo que hago yo: visualizo 128 bytes por columna y en un momento lo selecciono todo.
Bueno, tras pegar lo que acabo de comentar ya tiene que aparecer lo siguiente:
Imagen37
Ciertamente si no se tiene experiencia, puede ser complicado realizar este último ejemplo que acabo de hacer.