Я использую объездные пути. так как мне нужно вызвать реальную функцию 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;
}