TRACEANDO UN PROGRAMA
Supongamos que queremos averiguar donde se encuentra una rutina determinada de realiza un trabajo determinado, digamos, por ejemplo, que hay una pantalla de presentación que no queremos que se ejecute (por decir algo).
Bien... los pasos a seguir son:
1.- Cargaremos el programa con cualquier debugger.
A estas alturas, ya debemos de saber cual es la diferencia entre tracear con F7 y tracear con F8 (comandos "P" y "T" en debug, F8 y F10 en softice). Cuando el debugger tracea con F7 y se encuentra con una instrucción call loquesea:loquesea, éste se irá a ese lugar concreto y para continuar traceando seguiremos utilizando F7. En cambio, si al llegar a call loquesea:loquesea traceamos con F8 el debugger ejecutará todas las instrucciones que hay en loquesea:loquesea de un golpe y cuando termine esta ejecución nos devolverá el control (después de una instrucción ret o ret far).
2.- Tracearemos el programa haciendo uso de F8 (si no, se nos haría eterno el traceo)
3.- Observamos que en un punto determinado, se carga la pantalla que queremos eliminar y también se ejecutan otras instrucciones que NO QUEREMOS ELIMINAR.
4.- Pues ya sabemos en qué punto sucede esto, así que volvemos a cargar el programa con el debugger y cuando llegamos a este call loquesea:loquesea lo traceamos con F7 ya que esa rutina realiza lo que buscamos y otras cosas.
5.- Seguimos traceando con F8 siguiendo la misma filosofía de antes hasta que aislemos un call tal:tal que exclusivamente CARGA LA PANTALLA que queremos eliminar.
6.- Una vez localizado ese salto, apuntaremos los bytes que lo componen, será algo parecido a esto "E8-54-1A-00-00". También tomaremos nota de algún que otro byte más, bien por delante o por detrás de estos ya que es probable que el ejecutable contenga varias instrucciones iguales y nos sería imposible adivinar cual es la que nosotros andamos buscando.
7.- Haciendo uso de un editor hexadecimal de archivos ( os recomiendo HEX WORKSHOP) cargaremos nuestro ejecutable y buscaremos la cadena que previamente hemos apuntado.
8.- Una vez que tenemos la seguridad de haberla encontrado, modificaremos estos bytes cambiándolos por instrucciones nulas ( o sea NOP, en hexadecimal "90").
9.- ATENCION, si la cadena a parchear consta de 5 bytes pondremos 5 veces "90" reemplazando encima , si la cadena consta de 3 pues 3 veces "90".
10.- Grabamos los cambios y ya tenemos nuestro ejecutable con el parche donde nosotros lo queremos.
Hay muchos programadores que utilizan instrucciones anti-traceo. Esto lo hacen de varias formas, bien poniendo instrucciones INT 3, bien modificando la pila con instrucciones de retorno falsas, o modificando los registros de los segmentos. En este caso no te compliques la vida traceando, ya que te resultará mas complicado modificar el código para poder tracearlo que parchear lo que te interesa realmente. La solución es utilizar W32DASM. Este programa desensambla la totalidad del ejecutable y nos permite (en la versión registrada) grabar un archivo de texto con todas las instrucciones del ejecutable y en la parte derecha nos indica los bytes en hexadecimal que componen cada instrucción. Una vez que lo tenemos, seguiremos las instrucciones desensambladas hasta que localicemos el fragmento de código que pensamos que es el que hay que parchear, apuntamos la cadena correspondiente y volvemos a hacer uso de HEX WORKSHOP. Probablemente no demos con ella a la primera, mas bien, se nos colgará nuestro ejecutable un montón de veces (cosa a la que nos deberemos de acostumbrar ya que esto sucede en millones de ocasiones), practicamente hay que ADIVINAR dónde está la rutina que queremos eliminar. Después de mil cuelgues, observarás que los resultados son buenos.
autor: Crack El Destripador
Supongamos que queremos averiguar donde se encuentra una rutina determinada de realiza un trabajo determinado, digamos, por ejemplo, que hay una pantalla de presentación que no queremos que se ejecute (por decir algo).
Bien... los pasos a seguir son:
1.- Cargaremos el programa con cualquier debugger.
A estas alturas, ya debemos de saber cual es la diferencia entre tracear con F7 y tracear con F8 (comandos "P" y "T" en debug, F8 y F10 en softice). Cuando el debugger tracea con F7 y se encuentra con una instrucción call loquesea:loquesea, éste se irá a ese lugar concreto y para continuar traceando seguiremos utilizando F7. En cambio, si al llegar a call loquesea:loquesea traceamos con F8 el debugger ejecutará todas las instrucciones que hay en loquesea:loquesea de un golpe y cuando termine esta ejecución nos devolverá el control (después de una instrucción ret o ret far).
2.- Tracearemos el programa haciendo uso de F8 (si no, se nos haría eterno el traceo)
3.- Observamos que en un punto determinado, se carga la pantalla que queremos eliminar y también se ejecutan otras instrucciones que NO QUEREMOS ELIMINAR.
4.- Pues ya sabemos en qué punto sucede esto, así que volvemos a cargar el programa con el debugger y cuando llegamos a este call loquesea:loquesea lo traceamos con F7 ya que esa rutina realiza lo que buscamos y otras cosas.
5.- Seguimos traceando con F8 siguiendo la misma filosofía de antes hasta que aislemos un call tal:tal que exclusivamente CARGA LA PANTALLA que queremos eliminar.
6.- Una vez localizado ese salto, apuntaremos los bytes que lo componen, será algo parecido a esto "E8-54-1A-00-00". También tomaremos nota de algún que otro byte más, bien por delante o por detrás de estos ya que es probable que el ejecutable contenga varias instrucciones iguales y nos sería imposible adivinar cual es la que nosotros andamos buscando.
7.- Haciendo uso de un editor hexadecimal de archivos ( os recomiendo HEX WORKSHOP) cargaremos nuestro ejecutable y buscaremos la cadena que previamente hemos apuntado.
8.- Una vez que tenemos la seguridad de haberla encontrado, modificaremos estos bytes cambiándolos por instrucciones nulas ( o sea NOP, en hexadecimal "90").
9.- ATENCION, si la cadena a parchear consta de 5 bytes pondremos 5 veces "90" reemplazando encima , si la cadena consta de 3 pues 3 veces "90".
10.- Grabamos los cambios y ya tenemos nuestro ejecutable con el parche donde nosotros lo queremos.
Hay muchos programadores que utilizan instrucciones anti-traceo. Esto lo hacen de varias formas, bien poniendo instrucciones INT 3, bien modificando la pila con instrucciones de retorno falsas, o modificando los registros de los segmentos. En este caso no te compliques la vida traceando, ya que te resultará mas complicado modificar el código para poder tracearlo que parchear lo que te interesa realmente. La solución es utilizar W32DASM. Este programa desensambla la totalidad del ejecutable y nos permite (en la versión registrada) grabar un archivo de texto con todas las instrucciones del ejecutable y en la parte derecha nos indica los bytes en hexadecimal que componen cada instrucción. Una vez que lo tenemos, seguiremos las instrucciones desensambladas hasta que localicemos el fragmento de código que pensamos que es el que hay que parchear, apuntamos la cadena correspondiente y volvemos a hacer uso de HEX WORKSHOP. Probablemente no demos con ella a la primera, mas bien, se nos colgará nuestro ejecutable un montón de veces (cosa a la que nos deberemos de acostumbrar ya que esto sucede en millones de ocasiones), practicamente hay que ADIVINAR dónde está la rutina que queremos eliminar. Después de mil cuelgues, observarás que los resultados son buenos.
autor: Crack El Destripador