Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Detour send recv sendto recvfrom


Автор: bigbuka 8.3.2011, 23:50
Доброго времени суток всем
использую Microsoft Research Detours Package, Version 2.1.
пытаюсь перехватить сабж
вот код 
Код

int (WINAPI *WSASendToProc)(   SOCKET s,     LPWSABUF lpBuffers,     DWORD dwBufferCount,   
 LPDWORD lpNumberOfBytesSent,     DWORD dwFlags,     const struct sockaddr *lpTo,     int iToLen,     LPWSAOVERLAPPED lpOverlapped,     LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)=WSASendTo;
int (WINAPI *SendToProc)(   SOCKET s,
    const char *buf,
    int len,
    int flags,
    const struct sockaddr *to,
    int tolen) = sendto;
int (WINAPI *WSARecvFromProc)(      SOCKET s,    LPWSABUF lpBuffers,       DWORD dwBufferCount,    
     LPDWORD lpNumberOfBytesRecvd,    LPDWORD lpFlags,      struct sockaddr *lpFrom,    LPINT lpFromlen,  
     LPWSAOVERLAPPED lpOverlapped,       LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)=WSARecvFrom;
int (WINAPI *RecvFromProc)(          SOCKET s,
          char *buf,
           int len,
           int flags,
          struct sockaddr *from,
    int *fromlen)=recvfrom;
int (WINAPI *SendProc)(   SOCKET s,
    const char *buf,
    int len,
    int flags)=send;
int (WINAPI *RecvProc)(   SOCKET s,
    char *buf,
     int len,
     int flags)=recv;

int MyWSASendTo(     SOCKET s,     LPWSABUF lpBuffers,     DWORD dwBufferCount,
    LPDWORD lpNumberOfBytesSent,     DWORD dwFlags,     const struct sockaddr *lpTo,
     int iToLen,     LPWSAOVERLAPPED lpOverlapped,
     LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
int MySendTo(   SOCKET s,
    const char *buf,
    int len,
    int flags,
    const struct sockaddr *to,
    int tolen);

int MyWSARecvFrom(     SOCKET s,   LPWSABUF lpBuffers,       DWORD dwBufferCount,
                      LPDWORD lpNumberOfBytesRecvd,    LPDWORD lpFlags, 
                      struct sockaddr *lpFrom,   LPINT lpFromlen, 
                       LPWSAOVERLAPPED lpOverlapped, 
                       LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
int MyRecvFrom(         SOCKET s,          char *buf,           int len,           int flags,
          struct sockaddr *from,    int *fromlen);
int MySend(  SOCKET s,    const char *buf,    int len,    int flags);
int MyRecv(   SOCKET s,    char *buf,     int len,     int flags);
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        {
            s_hDll=hModule;
             DetourTransactionBegin();
                DetourUpdateThread( GetCurrentThread() );
                char buf[5];
                int res=DetourAttach( &(PVOID &)WSASendToProc, MyWSASendTo );
                MessageBox(NULL,itoa(res,buf,10),"DetourAttach WSASendToProc",MB_OK);
                DetourUpdateThread( GetCurrentThread() );
                res=DetourAttach( &(PVOID &)SendToProc, MySendTo );
                MessageBox(NULL,itoa(res,buf,10),"DetourAttach SendToProc",MB_OK);
                DetourUpdateThread( GetCurrentThread() );
                res=DetourAttach( &(PVOID &)WSARecvFromProc, MyWSARecvFrom );
                MessageBox(NULL,itoa(res,buf,10),"DetourAttach WSARecvFromProc",MB_OK);
                DetourUpdateThread( GetCurrentThread() );
                res=DetourAttach( &(PVOID &)RecvFromProc, MyRecvFrom );
                MessageBox(NULL,itoa(res,buf,10),"DetourAttach RecvFromProc",MB_OK);
                DetourUpdateThread( GetCurrentThread() );
                res=DetourAttach( &(PVOID &)SendProc, MySend );
                MessageBox(NULL,itoa(res,buf,10),"DetourAttach SendProc",MB_OK);
                DetourUpdateThread( GetCurrentThread() );
                res=DetourAttach( &(PVOID &)RecvProc, MyRecv );
                MessageBox(NULL,itoa(res,buf,10),"DetourAttach RecvProc",MB_OK);
                DetourUpdateThread( GetCurrentThread() );
                DetourTransactionCommit();
                
            return TRUE;
            DetourTransactionBegin();
                DetourUpdateThread( GetCurrentThread() );
                DetourDetach( &(PVOID &)WSASendToProc, MyWSASendTo );
                DetourDetach( &(PVOID &)SendToProc, MySendTo );
                DetourDetach( &(PVOID &)WSARecvFromProc, MyWSARecvFrom );
                DetourDetach( &(PVOID &)RecvFromProc, MyRecvFrom );
                DetourDetach( &(PVOID &)SendProc, MySend );
                DetourDetach( &(PVOID &)RecvProc, MyRecv );
                DetourTransactionCommit();
        }
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}


int MySendTo(  SOCKET s,    const char *buf,    int len,    int flags,    const struct sockaddr *to,    int tolen)
{
    return SendToProc( s,  buf, len, flags,to,tolen);
}


Приложение куда внедряется Dll не мое
После вызова функций Send SendTo гдето в коде приложения возникает ошибка :
A buffer overrun has occurred in progarm.exe which has corrupted the program's internal state. Press Break to debug the program or Continue to terminate the program.

For more details please see Help topic 'How to debug Buffer Overrun Issues'.
в отладчике обнаружил что все падет на функции _crt_debugger_hook
Подскажите в чем может быть проблема и каково ее решение?

Автор: Estranged 9.3.2011, 11:41
Вы не поверите, в коде Send или SendTo есть переполнение буфера! Смотрите исходники этих функций (как я понимаю, Вы эти функции писали сами, а Detours только для перехвата желаемых функций использовали). При падении посмотрите по стеку вызовов, в каком месте Send или SendTo упало. Наверняка это функция проверки стековых переменных загнулась. Проект dll только соберите с генерацией pdb, чтобы отладчику было что вразумительное показать. А еще проще внедряемую dll под отладкой запустить, так можно будет отслеживать с бОльшим комфортом.
Выложили бы исходники Send и SendTo.

Автор: bigbuka 9.3.2011, 12:54
На самом деле проблема была в объявлении моих функций нужно было не int MyRecvFrom а int WINAPI MyRecvFrom

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)