Я работаю над dll, которая перехватывает функции winsock2, используя C++ и обходные пути. Моя цель — изменить TCP-трафик, который идет от и к исходному исполняемому файлу. В какой-то момент мне нужно остановить доставку определенного пакета (чтобы исходный исполняемый файл вообще не знал об этом пакете, но все еще сохранял соединение).
С хуком WSASend все ясно (вы просто не вызываете исходный WSASend и возвращаете 0). Но я понятия не имею, как это сделать в хуке WSARecv, используя структуру WSAOVERLAPPED.
Я надеюсь, что этот код ниже демонстрирует, что я хочу:
__declspec(dllexport) int WINAPI WSARecv_hook(SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesRecvd, LPDWORD lpFlags, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
{
// Recieve real data
int ret = WSARecv_real(s, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags, lpOverlapped, lpCompletionRoutine);
// Loop over lpBuffers and analyze it
for(int i=0; i < dwBufferCount; i++)
{
// analyze it
if(packet_should_be_blocked(lpBuffers[i].buf, lpBuffers[i].len))
{
// Do or return what?
} else {
// Otherwise, just process as usual
}
}
return ret;
}
Как сделать вид, что ничего не произошло и пакет не получен (типа поддельного WSA_IO_PENDING)? Любые идеи/мысли?
P.S. Насколько я знаю, исполняемый файл не использует процедуру завершения (lpCompletionRoutine всегда имеет значение NULL), а только перекрывающуюся структуру.
packet_should_be_blocked
не может работать, так как TCP не ориентирован на сообщения. Вам придется буферизовать данные, пока у вас не будет достаточно для анализа, а затем, возможно, удалить только часть данных, которые вы получили за один вызов. Это относится и к блокировке входящих вызовов. - person Ben Voigt   schedule 07.08.2014