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.
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 ...
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-.
Puedes guardar los cambios, principalmente, de dos formas:
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:
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.
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:
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.