Guardar cambios en OllyDBG v1.10

Creado: Lunes, 10 Diciembre 2012 Escrito por Administrador Visto: 14908
Tamaño de letra:

Crear nuevo .exe salvando los cambios

Seguramente, si no tienes mucha experiencia con OllyDBG 1.10 y acabas de modificar bytes en un ejecutable, es posible que luego no sepas cómo realizar o guardar esos cambios. Como OllyDBG 1.10 es todavía una versión muy utilizada y con cientos de tutoriales, hoy voy a mostrar cómo efectuar y guardar los cambios realizados en un programa.

Voy a usar la versión 1.10 de OllyDBG sin ningún plugin, tal cual está en descarga. Descarga esta versión desde su web oficial, desde aquí: OllyDBG 1.10.

Abrir un programa cualquiera

Voy a abrir un programa cualquiera pero para seguir este tutorial voy a abrir OllyDBG desde el mismo OllyDBG, así que:

Veo el siguiente código -que debes ver tú también-:

 
00401000 > $ /EB 10         jmp short 00401012                       ;  OLLYDBG.00401012
00401002     |66            db 66                                    ;  CHAR 'f'
00401003     |62            db 62                                    ;  CHAR 'b'
00401004     |3A            db 3A                                    ;  CHAR ':'
00401005     |43            db 43                                    ;  CHAR 'C'
00401006     |2B            db 2B                                    ;  CHAR '+'
00401007     |2B            db 2B                                    ;  CHAR '+'
00401008     |48            db 48                                    ;  CHAR 'H'
00401009     |4F            db 4F                                    ;  CHAR 'O'
0040100A     |4F            db 4F                                    ;  CHAR 'O'
0040100B     |4B            db 4B                                    ;  CHAR 'K'
0040100C     |90            nop
0040100D     |E9            db E9
0040100E     |28014B00      dd offset OLLYDBG.___CPPdebugHoo
00401012   > \A1 1B014B00   mov eax,dword ptr ds:[4B011B]
00401017   .  C1E0 02       shl eax,2
0040101A   .  A3 1F014B00   mov dword ptr ds:[4B011F],eax
0040101F   .  52            push edx
00401020   .  6A 00         push 0                                   ; /pModule = NULL
00401022   .  E8 4BE00A00   call 004AF072                            ; \GetModuleHandleA
...
 

Realizar un cambio

Voy a hacer un cambio cualquiera, por ejemplo:

00401020 6A 00 push 0

push 0 corresponde a los bytes 6A 00.

En OllyDBG me pongo sobre push 0 y hago doble clic. Se abre una ventana y modifico push 0 por lo siguiente:

gf

¿Por qué pongo push cx? -Porque he visto que cx en ese momento tiene valor cero y así el programa se ejecutará sin errores pero tú puedes poner lo que quieras. En estos momentos compruebo que el resultado es el siguiente:

00401020 66 51 push cx

Como puedes observar se han modificado 2 bytes: 6A por 66 y 00 por 51. Ya están hechos los cambios, ahora toca guardarlos físicamente en un nuevo archivo -o en el mismo-.

Guardar los cambios

Puedes guardar los cambios, principalmente, de dos formas:

Guardar solamente los cambios realizados

De esta forma guardaremos en el exe solamente los cambios que seleccionemos. Selecciona solo la dirección 0041020, donde tienes push cx.

Importante: Debes seleccionar lo que quieras que sea modificado. En este caso son solo 2 bytes que corresponden a push cx.

Ahora pulsa el botón derecho del ratón y elige: Copy to executable ? Selection. Se abrirá una nueva ventana mostrando el siguiente código:

 
00000620    66:51           push cx
00000622    E8 4BE00A00     call 000AE672
00000627    8BD0            mov edx,eax
00000629    E8 DA240A00     call 000A2B08
...
 

¿Qué ha pasado? ¿Por qué 00401020 se ha cambiado a 00000620? Es muy sencillo de entender: porque la dirección virtual (Virtual Address) ha sido convertida a Offset en el archivo físico. Lógicamente lo que estamos generando es un nuevo archivo exe ¿se entiende?

Volvemos a pulsar con el botón derecho del ratón (en cualquier parte de esa ventana) y elegimos en el menú emergente la opción Save file (guardar archivo):

kj

Nos aparecerá una típica ventana de Windows para que guardemos el archivo donde y con el nombre que queramos. Yo lo guardo en el mismo directorio de OllyDBG 1.10 y lo voy a nombrar como ollydbg002.exe. Pulso Guardar.

Verificando los nuevos cambios

Ahora simplemente hay que revisar si hemos realizado todo correctamente, así que:

Descubro el siguiente código:

 
00401000 > $ /EB 10         jmp short 00401012                       ;  ppp.00401012
00401002     |66            db 66                                    ;  CHAR 'f'
00401003     |62            db 62                                    ;  CHAR 'b'
00401004     |3A            db 3A                                    ;  CHAR ':'
00401005     |43            db 43                                    ;  CHAR 'C'
00401006     |2B            db 2B                                    ;  CHAR '+'
00401007     |2B            db 2B                                    ;  CHAR '+'
00401008     |48            db 48                                    ;  CHAR 'H'
00401009     |4F            db 4F                                    ;  CHAR 'O'
0040100A     |4F            db 4F                                    ;  CHAR 'O'
0040100B     |4B            db 4B                                    ;  CHAR 'K'
0040100C     |90            nop
0040100D     |E9            db E9
0040100E     |28014B00      dd offset ppp.___CPPdebugHo
00401012   > \A1 1B014B00   mov eax,dword ptr ds:[4B011B]
00401017   .  C1E0 02       shl eax,2
0040101A   .  A3 1F014B00   mov dword ptr ds:[4B011F],eax
0040101F   .  52            push edx
00401020   .  66:51         push cx                                  ; /pModule
00401022   .  E8 4BE00A00   call 004AF072                            ; \GetModuleHandleA
...

Viendo ese push cx ya podemos decir que hemos hecho correctamente nuestro trabajo.

Guardar todos los cambios realizados

Esta opción es muy útil cuando modificas un poco por aquí, otro poco por allí, otro poco más por allá. Seleccionar todo el código que ves en la ventana de desensamblado es sencillo porque puedes hacer clic al comienzo del código, desplazarte hasta el final y pulsar la tecla mayúsculas + clic del ratón.

Sin embargo, si realizas distintos cambios es posible que no quieras modificarlos todos y analizar uno a uno o, por el contrario, permitir generar un dumpeado con todos las modificaciones. El proceso es muy similar al anterior:

OllyDBG: Copy modifications

En el siguiente tutorial veremos cómo hacer esto mismo desde OllyDBG versión 2, que es también muy sencillo.

Nota final: Debes tener en cuenta que estás generando un nuevo archivo ejecutable, esto significa que si por ejemplo haces modificaciones en una sección creada por el programa en tiempo de ejecución (por ejemplo en un packer), los cambios no se podrán ver reflejados. Aunque no lo recordaba, lo acabo de testear ahora mismo y no sé si existe algún plugin que lo permita, debes tener en cuenta que aunque quieras guardar todas las modificaciones, solo se harán en la sección en la que te encuentres.

Última actualización: Lunes, 10 Diciembre 2012