Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Detour send recv sendto recvfrom 
:(
    Опции темы
bigbuka
Дата 8.3.2011, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 1.10.2009

Репутация: нет
Всего: нет



Доброго времени суток всем
использую 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
Подскажите в чем может быть проблема и каково ее решение?

Это сообщение отредактировал(а) bigbuka - 9.3.2011, 01:13
PM MAIL   Вверх
Estranged
Дата 9.3.2011, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 30.8.2010

Репутация: 3
Всего: 3



Вы не поверите, в коде Send или SendTo есть переполнение буфера! Смотрите исходники этих функций (как я понимаю, Вы эти функции писали сами, а Detours только для перехвата желаемых функций использовали). При падении посмотрите по стеку вызовов, в каком месте Send или SendTo упало. Наверняка это функция проверки стековых переменных загнулась. Проект dll только соберите с генерацией pdb, чтобы отладчику было что вразумительное показать. А еще проще внедряемую dll под отладкой запустить, так можно будет отслеживать с бОльшим комфортом.
Выложили бы исходники Send и SendTo.
PM MAIL   Вверх
bigbuka
Дата 9.3.2011, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 1.10.2009

Репутация: нет
Всего: нет



На самом деле проблема была в объявлении моих функций нужно было не int MyRecvFrom а int WINAPI MyRecvFrom
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0406 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.