Guardar cambios en OllyDBG v1.10
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:
- Ejecuto OllyDBG 1.10
- Pulso F3 o voy al menú File ? Open
- Selecciono el mismo OllyDBG.exe
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:
¿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 seleccionados.
- Guardar todos los cambios que hayas hecho. Te permitirá ver los cambios uno a uno.
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):
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:
- Ejecuto OllyDBG 1.10 original
- Abro en este OllyDBG el nuevo que acabo de crear llamado ollydbg002.exe
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:
- Ejecutas OllyDBg v1.10
- Abres OllyDBG en el mismo OllyDBG v1.10
- Realizas diversos cambios
- Pulsas sobre el código asm el botón derecho del ratón y seleccionas: Copy to executable ? All modifications (solo aparecerá si has realizado cambios...). Verás la siguiente ventana:
- Copy, Copy All, Skip. Esto significa que OllyDBG va a ir mostrándote todas las modificaciones que hayas hecho. Si pulsas:
- Copy: quiere decir que la selección donde se encuentra, será añadida en el dumpeado. Permitirás los cambios.
- Copy All: la opción más usual. Permites que todos los cambios se realicen en el dumpeado. No te preguntará uno por uno, como el caso anterior.
- Skip: Saltar. Cuando OllyDBG va preguntando por los cambios, Skip le dice que no quieres que se realice en esa selección los cambios y en el dumpeado mostrará el código original.
- Tras pulsar Copy All, aparece una ventana conocida del punto anterior y solo queda pulsar de nuevo con el botón derecho del ratón y seleccionar Save File.
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.
Si no te deja, cambia el nombre, borra el has depurado y cambia de nuevo el nombre.
Guarda copias de seguridad de tus exe si haces muchas modificaciones. Saludos
Sí, con OllyDBG versión 2 es un poco diferente. Va a ser el siguiente artículo que se va a escribir en la web.
Un saludo