Buenas comunidad,
les comparto un ejemplo de inyeccion de codigo en memoria de una aplicacion.
NOTA 1:
aplicando una practica de la revista HHZINE n5, la cual habla sobre inyección de código en la memoria de un programa.
NOTA 2: adjunto un archivo de word en donde esta explicado todo el procedimiento, con analisis en ollydbg y el extraño error.
ACLARACION 1:
Las direcciones de memoria varian según la maquina en donde se ejecuten.
ACLARACION 2:
Al final comentare algo muy extraño en las direcciones de memoria.
EN EL ARCHIVO DE WORD:
Primero explicare el codigo de la aplicacion victima (escrito en c en devc++)
Segundo explicare como se obtienen las direcciones de memoria utilizando ollydbg
Tercero explicare el codigo de la aplicacion inyectora (escrito en c++ en devc++)
Código victima (.c):
#include <stdio.h>
int A; //variable global
main (){
printf("Programa victima de una inyeccion. Por HySTD\n");
printf("El objetivo es conseguir que muestre '1'\n");
getchar();
// asm en sistaxis intel no soportada por el dev c++
/*__asm{
lea edx, a
mov eax, 0
mov [edx], eax
}*/
//asm en sintaxis AT&T que es la que entiende el dev c++
//obtenemos la direccion en memoria donde se encuentra la variable "A"
__asm("leal _A, %edx");
//movemos un valor 0 a el registro eax
__asm("movl $0, %eax");
//movemos el valor del registro eax (en este caso 0) dentro de la direccion de la variable "A"
__asm("movl %eax, (%edx)");
printf("%d\n", A);
getchar();
}
codigo inyector (.cpp):
/* programa inyector por javware*/
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
using namespace std;
main()
{
int n=2; //variable con el valor a inyectar
unsigned long escritos; //variable que muestra cuantos bytes que fueron escritos
HWND victima; //manejador de ventana
DWORD pid; //PID de la ventana victima
HANDLE proceso; //el manejador de proceso
//buscamos la ventana por titulo
victima = FindWindow(NULL,"inyeccion");
//si el manejador da 0 quiere decir que la ventana no se encontro
if(victima==0)
{
cout<<"La ventana no esta abierta"<<endl;
}
//si el manejador da un resultado diferente de 0 la ventana se encontro
else
{
cout<<"Ventana capturada"<<endl;
//obtenemos el PID de la ventana y lo guardamos en "pid
GetWindowThreadProcessId(victima,&pid); "
//le damos permisos de lectura y escritura de memoria a el proceso
proceso = OpenProcess(PROCESS_ALL_ACCESS,0,pid);
//escribimos en el lugar de memoria que deseamos modificar
WriteProcessMemory(proceso, (LPVOID)(0x4012EA), &n, 1, &leidos);
printf("leidos: %d %p\n",leidos,&leidos);
printf("n: %d %p\n",n,&n);
CloseHandle(proceso);
}
system("pause");
}
Después de que tenemos esto, podemos correr nuestra aplicación victima, y después nuestra aplicación inyectora y si las direcciones de memoria han sido analizadas y escritas correctamente obtendremos nuestra inyección a un lugar especifico de memoria.



LinkBack URL
About LinkBacks
Citar
