Задача: добавить в контент страницы отображаемой браузерами (Opera, Firefox, IE6-7) свои данные. Проблема: ловить контент я уже научился, но когда пытаюсь изменить buf и потом вызвать реальный recv (Real_recv) с модифицированым буфером браузер просто падает. Подскажите что не так? Код: #include <stdio.h> #include <windows.h> #include <detours.h> //#include <Winsock2.h> #pragma warning(disable:4100) #pragma comment(lib,"detours.lib") //#pragma comment(lib,"wsock32.lib") #pragma comment(lib,"Ws2_32.lib") DETOUR_TRAMPOLINE(int WINAPI Real_send(SOCKET a0, char* a1, int a2, int a3), send); //--------------------------------------------------------------------------- DETOUR_TRAMPOLINE(int WINAPI Real_recv(SOCKET a0, char* a1, int a2, int a3), recv); //--------------------------------------------------------------------------- int WINAPI custom_recv(SOCKET sock, char FAR* buf, int len, int flags) { if (strstr(buf, "</html>") != NULL) { //MessageBox(0, buf, "content", MB_OK); char* adddata="NEW DATA IN CONTENT"; malloc(buf, sizeof(buf)+sizeof(adddata)); strcat(buf, adddata); return Real_recv(sock, buf, sizeof(buf)+sizeof(adddata), flags); } else { return Real_recv(sock, buf, len, flags); } } //--------------------------------------------------------------------------- int WINAPI custom_send(SOCKET sock, char* buf, int len, int flags) { return Real_send(sock, buf, len, flags); } //--------------------------------------------------------------------------- void WINAPI HookInit() { DetourFunctionWithTrampoline((PBYTE)Real_send,(PBYTE)custom_send); DetourFunctionWithTrampoline((PBYTE)Real_recv,(PBYTE)custom_recv); } //--------------------------------------------------------------------------- void WINAPI HookDone() { DetourRemove((PBYTE)Real_send,(PBYTE)custom_send); DetourRemove((PBYTE)Real_recv,(PBYTE)custom_recv); } //--------------------------------------------------------------------------- BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, LPVOID reserved) { if ( reason == DLL_PROCESS_ATTACH ) { HookInit(); } return true; }
Ну для начала твоя custom_recv() кривая: переменная buf используется как арг и как локальная, strcat() после malloc() вызывать нельзя... просто писец. Отладчиком пройди по коду. P.S. перехват recv() - этого мало. В прогах могут использоваться io completion ports и WSARecv() - ассинхронный.
Если пишешь для себя, то проще написать HTTP-proxy и пользовать браузер через нее Перехватывать и модифицировать данные таким макаром гораздо проще
s0larian Спасибо за ответ, про перехват recv() я знаю что не все юзают. scf Спасибо за ответ, тоесть лучше прехватывать конект и напрявлять его на нависной прокси? Ребята, что я пишу вы наверное догадались, есть еще какие то предложения по технологии реализации? (BHO, плагины FF не предлагать) Всем спасибо.
Зачем? У в любом браузере есть меню "Настройки", где и можно прописать проксю Если не малварь пишешь конечно
тебе нужно СНАЧАЛА вызывать функцию recv, а уже ПОТОМ смотреть, что в буфере и пробовать это модифицировать
сорри за оффтоп - ответь в личке. я так понимаю просто не приходит уведомление об ответах и о сообщениях в личке.