Hook/Detour a WSASend/WSARecv [Desencriptar paquetes]

Iniciado por Aless69, Febrero 05, 2018, 11:45:54 PM

Tema anterior - Siguiente tema

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

Febrero 05, 2018, 11:45:54 PM Ultima modificación: Febrero 06, 2018, 12:55:03 PM por Aless69
Buenas ;) hace poco empece con la ingeniería inversa por lo que he estado a full con la práctica pero me he encontrado un inconveniente que no puedo resolver tengo una función de encriptado de paquetes:
Código: asm
0040C120   > 8B5424 1C      MOV EDX,DWORD PTR SS:[ESP+1C]
0040C124   > 8BC7           MOV EAX,EDI
0040C126   . 25 FF010000    AND EAX,1FF
0040C12B   . 03C2           ADD EAX,EDX
0040C12D   . 8B14C5 482D460>MOV EDX,DWORD PTR DS:[EAX*8+1462D48]      ;  Guarda en EDX un DWORD de la tabla
0040C134   . 8B04C5 4C2D460>MOV EAX,DWORD PTR DS:[EAX*8+1462D4C]      ;  Guarda en EAX un DWORD de la tabla
0040C13B   . 3316           XOR EDX,DWORD PTR DS:[ESI]                ;  xor de la tabla con ESI = un DWORD del packet
0040C13D   . 3346 04        XOR EAX,DWORD PTR DS:[ESI+4]              ; con la siguiente posición de ESI
0040C140   . 3355 10        XOR EDX,DWORD PTR SS:[EBP+10]             ;  ? Ni idea, siempre es 0
0040C143   . 3345 14        XOR EAX,DWORD PTR SS:[EBP+14]             ;  ? Ni idea, siempre es 0
0040C146   . 8916           MOV DWORD PTR DS:[ESI],EDX                ;  Guarda DWORD resultado del xor en el packet
0040C148   . 8946 04        MOV DWORD PTR DS:[ESI+4],EAX              ;  Guarda DWORD resultado del xor en el packet
0040C14B   . 83C7 01        ADD EDI,1
0040C14E   . 83C6 08        ADD ESI,8
0040C151   . 83E9 01        SUB ECX,1                                 ;  ECX = indice
0040C154   .^75 CA          JNZ SHORT DBOG.0040C120
0040C156   . 8B4424 20      MOV EAX,DWORD PTR SS:[ESP+20]

Es solo una parte pero como se puede ver no es muy complicada se trata de dos xor de los paquetes con un tabla aleatoria dentro de un ciclo en teoría para desencriptarlo solo debería hacer de nuevo el xor, el inconveniente que tengo es que no se como hacerlo en C++, el programa al que hago ingeneria inversa envia los packet por WSA por lo cual para acceder al buffer me da un puntero y longitud:
Código: cpp

typedef struct __WSABUF {
  u_long   len;
  char FAR *buf;
} WSABUF, *LPWSABUF;

Alguna idea u opinión de cómo?:(