elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


  Mostrar Temas
Páginas: [1]
1  Programación / Ingeniería Inversa / Parchear ejecutable y direcciones de memoria en: 25 Junio 2019, 15:47 pm
Estoy teniendo el siguiente problema:

Digamos que abro un ejecutable con un debugger y agrego el siguiente codigo:

Código:
push rbp
mov rbp, rsp
push r9
push r8
push rdx
push rcx
sub rsp, 20
mov r9, 0
mov r8, 0x0000F7855219251      ; en esta direccion hay una cadena
mov rdx, 0x0000F7855219251    ; ^
mov rcx, 0
call user32.MessageBoxA
add rsp, 20
pop rcx
pop rdx
pop r8
pop r9
pop rbp

Funciona perfecto y sin problemas, pero a la hora de parchear el ejecutable y ejecutarlo de nuevo, las direcciones quedan obsoletas.

Es decir, la cadena ya no esta en 0x0000F7855219251 si no que se cargo en otra direccion diferente, lo mismo pasa con la direccion de user32.MessageBoxA.
Esto por supuesto produce que el programa crashee.

Para destacar: La cadena se carga en una direccion diferente, pero es la misma direccion relativa al codigo. Es decir, esta siempre a 55 bytes desde el inicio del codigo.
Lo mismo con la funcion MessageBoxA, pero la libreria user32 se carga en una direccion diferente.

Como puedo resolver este problema?

Gracias
2  Programación / Ingeniería Inversa / Encontrar funcion que me interesa en: 17 Junio 2019, 00:33 am
Buenas.

Soy bastante nuevo en el tema de la ingenieria inversa y tengo el siguiente problema:

Tengo un programa que realiza una peticion HTTP a un servidor al presionar un boton.
Lo que quiero lograr es conseguir la direccion de esta funcion para hookearla con un detour y poder interceptar esta peticion HTTP para modificarla/logearla/cancelarla/desviarla/etc (solo con fines de aprendizaje :rolleyes:).

El problema es que no logro encontrar cual es la funcion que esta enviando la peticion.

Estoy usando Cheat Engine para debuggear el programa, por la unica razon de que ya me acostumbre a utilizarlo. Asumo que cualquier otro debugger tendra las mismas capacidades.

Que es lo que intente y no funciono?

  • Setear un breakpoint en WS2_32.send() y mirar la stacktrace para ver que funcion esta llamando a send(), que deberia ser la funcion que prepara la consulta HTTP. No funciono, el programa nunca se detiene ahi. Como sea que se este enviando no utiliza esta libreria.
  • Coneguir el address del buffer donde se guarda el input del usuario (que se incluye en el body de la peticion HTTP) y fijarme que instrucciones acceden a esta direccion, suponiendo que la funcion que prepara la peticion lee el input desde ahi. No funciono, todas las instrucciones que acceden a esta direccion no tienen nada que ver con la consulta. Al parecer, este buffer se guarda en algun tipo de estructura y la funcion que envia la peticion HTTP no accede directamente a este buffer si no a la estructura.
  • Revisar las librerias que carga el ejecutable para ver si hay alguna relacionada al protocolo HTTP que pudiese ser usada para enviar la consulta (al estilo WinHTTP). No funciono, no encontre ninguna libreria que me haga ruido.
  • Buscar parte de la consulta HTTP en la memoria, ejemplo "GET /foobar" y fijarme que accede a esta direccion (que deberia ser alguna funcion que prepara la consulta y otra que la envia). No funciono, cada consulta tiene su propio buffer aparte, por lo tanto cuando me pongo a "escuchar" que instrucciones acceden a esa direccion ninguna lo hace, puesto que ya lo hicieron al enviar la consulta y las futuras consultas tienen su propio buffer.

Estoy procediendo de manera correcta?
Que harian ustedes para localizar la funcion?

Siempre utilice estos procedimientos para encontrar funciones en otros programas y tuve exito, pero esta vez se me esta complicando.

Desde ya gracias por su ayuda.
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines