подключить функцию ws2_32 recv к буферу flu sh out - PullRequest
0 голосов
/ 09 февраля 2020

Я использую объездные пути. так как мне нужно вызвать реальную функцию recv, прежде чем я смогу узнать buf. но minex_recv вставит инструкцию перехода в начало реальной функции recv, как только вы вызовете реальную функцию recv, поток управления перейдет к управлению целевого exe. Есть ли другой способ вставить код после вызова recv? объезд на обходе dll, зацепив адрес возврата? Могу ли я отследить указатель буфера, читаемый / записываемый в целевом exe-процессе?

minex_recv function, if i tried to do anything after  call real_recv, I messed up the stack the target exe hung.
0F6D16C0 > 55               PUSH EBP
0F6D16C1   8BEC             MOV EBP,ESP
0F6D16C3   83EC 08          SUB ESP,0x8
0F6D16C6   8B45 04          MOV EAX,DWORD PTR SS:[EBP+0x4]
0F6D16C9   8945 FC          MOV DWORD PTR SS:[EBP-0x4],EAX
0F6D16CC   8B4D FC          MOV ECX,DWORD PTR SS:[EBP-0x4]
0F6D16CF   51               PUSH ECX
0F6D16D0   68 A0626E0F      PUSH dll32.0F6E62A0                      ; ASCII "recv ret:%p "
0F6D16D5   E8 46010000      CALL dll32.printf
0F6D16DA   83C4 08          ADD ESP,0x8
0F6D16DD   8B55 14          MOV EDX,DWORD PTR SS:[EBP+0x14]
0F6D16E0 > 52               PUSH EDX
0F6D16E1   8B45 10          MOV EAX,DWORD PTR SS:[EBP+0x10]
0F6D16E4   50               PUSH EAX
0F6D16E5   8B4D 0C          MOV ECX,DWORD PTR SS:[EBP+0xC]
0F6D16E8   51               PUSH ECX
0F6D16E9   8B55 08          MOV EDX,DWORD PTR SS:[EBP+0x8]
0F6D16EC   52               PUSH EDX
0F6D16ED   FF15 04D06E0F    CALL DWORD PTR DS:[Real_Recv]


recv function got patched. begining of real_recv fucntion
769A681F  ^EB E3            JMP SHORT WS2_32.769A6804
769A6821   90               NOP
769A6822   90               NOP
769A6823   90               NOP
769A6824   90               NOP
769A6825   90               NOP
769A6826 >-E9 95AED298      JMP dll32.Minex_Recv
769A682B   83EC 10          SUB ESP,0x10
769A682E   53               PUSH EBX
769A682F   33DB             XOR EBX,EBX
769A6831   813D 48709C76 29>CMP DWORD PTR DS:[0x769C7048],WS2_32.769>


int WINAPI Minex_Recv( SOCKET s, char *buf, int len, int flags ) {
// .. do stuff ..

  LPVOID ret;
  ret=_ReturnAddress();
  printf("recv ret:%p \n", ret);
  int return_value= Real_Recv( s, buf, len, flags );
  return return_value;
}
...