Я ввел dll в сервер, потому что мне нужно было заблокировать некоторые плохие пакеты, которые сервер не отбрасывает.
Фрагмент из моего кода:
#pragma comment(lib, "detours.lib")
#pragma comment(lib, "Ws2_32.lib")
#pragma comment(lib, "Mswsock.lib")
(...)
int (WINAPI *pRecv)(SOCKET s, char* buf, int len, int flags) = recv;
int WINAPI MyRecv(SOCKET s, char* buf, int len, int flags);
(...)
AllocConsole();
freopen("CONOUT$", "w", stdout);
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)pRecv, MyRecv);
if(DetourTransactionCommit() == NO_ERROR)
cout << "[" << MyRecv << "] successfully detoured." << endl;
и для целей тестирования я просто распечатываю данные.
int WINAPI MyRecv(SOCKET s, char* buf, int len, int flags)
{
cout << "[ RECV " << len << " ] ";
for ( int i = 0; i < len; i++ )
{
printf( "%02x ", unsigned char (buf[i]) );
}
printf( "\n" );
return pRecv(s, buf, len, flags);
}
Теперь я подключил его, и он отображает [ address ] successfully detoured.
,
Я думаю, что все подключено и работает.
Теперь я иду к клиенту и начинаю отправку пакетов.
Например, я вхожу, теперь это отправляет пакет на сервер.
И мне удалось войти в систему, поэтому сервер должен был получить отправленный мной пакет.
Теперь я проверяю консоль, подключенную к server
и ничего не печатается.
Что странно, поэтому я попытался подключить WPE_PRO на сервере и снова начал общаться с клиентом. Теперь я узнал, что даже WPE не может регистрировать пакеты.
Как это возможно? Почему это происходит?
Я пытаюсь построить логгер / фильтр пакетов на сервере, чтобы не пропустить плохие пакеты.
Хакеры используют пакеты для сбоя наших серверов.
Информация о приложении, которое я пытаюсь подключить:
It works like a relay server. It receives info from the client then sends it to the right server inside the internal network.
So Client <-> `Application` <-> Servers
So what I'm trying to hook is the Application .
ОБНОВИТЬ
Попытка установить точку останова на recv()
, WSArecv()
функционировать и не сломаться.
Address Ordinal Name Library
------- ------- ---- -------
004121A8 23 socket WS2_32
004121A4 20 sendto WS2_32
004121E8 3 closesocket WS2_32
0041219C 9 htons WS2_32
004121A0 17 recvfrom WS2_32
004121E4 111 WSAGetLastError WS2_32
004121E0 115 WSAStartup WS2_32
004121DC 11 inet_addr WS2_32
004121D8 WSAIoctl WS2_32
004121D4 WSAConnect WS2_32
004121D0 22 shutdown WS2_32
004121CC 12 inet_ntoa WS2_32
004121C8 2 bind WS2_32
004121C4 8 htonl WS2_32
004121B4 16 recv WS2_32
004121BC WSASocketA WS2_32
004121B8 19 send WS2_32
004121B0 WSAAccept WS2_32
004121AC 13 listen WS2_32
004121C0 21 setsockopt WS2_32
Только эти dll импортируются, когда я проверил PE:
pdh.dll
WS2_32.dll
KERNEL32.dll
USER32.dll
GDI32.dll
WINMM.dll
ОБНОВИТЬ
Просто чтобы проверить, работает ли мой код, я подключил DLL к клиенту, и да, пакеты были зарегистрированы / напечатаны. Подтверждает, что мой код работает. Хммм.
ОБНОВИТЬ
Также пытался объехать фф.
int ( WINAPI *pSend )( SOCKET s, const char *buf, int len, int flags ) = send;
int ( WINAPI *pRecv )( SOCKET s, char *buf, int len, int flags ) = recv;
int ( WINAPI *pRecvFrom )( SOCKET s, char *buf, int len, int flags, sockaddr *from, int *fromlen ) = recvfrom;
int ( WINAPI *pWSARecvEx )( SOCKET s, char *buf, int len, int *flags ) = WSARecvEx;
и до сих пор ничего.
ОБНОВИТЬ
Так что я использовал wireshark
и увидел пакеты, проходящие через.
Я отлаживал программу весь день, устанавливая точки останова на всех вызовах winsock, и до сих пор ничего не получил.
Задача ещё не решена.
Других решений пока нет …