Здравствуйте. Каким образом / посредством чего можно написать такую программу: Софт перехватывает все HTTP-запросы, и если в одном из них найдено определенное ключевое слово (н.п. "GET /showprofile.php"), то часть ответа от сервера должна заменится. Что именно и на что указываю я. Если кто-то когда-то работал с такой программой, как Charles - нужно что-то наподобии функции Breakpoints. Тоесть при определенном запросе можно изменить ответ. ВАЖНО: без использования прокси-сервера, программа должна сама перехватывать и сама изменять ответ. Вобщем, как сделать подобное?
Попробуй с помощью winpcap или драйвер свой напиши или хукни соотв. функции в программе для которой подменять хочешь
В смысле? Ты же знаешь прототип функции, тебе нужно сделать, чтобы целевая программа вызвала твою кастомную функцию, вместо оригинальной. Программа передаст тебе необходимые параметры, ты их обработаешь, вызовешь оригинальную функцию из своей, но отдашь в том виде в котором тебе нужно.
схема такая Code: int (__stdcall*uniq_addr)(); void entry_point(void) { uniq_addr = set_hook_recv /* * set_hook_recv * может пропатчить IAT или JMP hook_recv * эта версия для патчинга IAT */ } /* здесь просто вызываем оригинальную для JMP пришлось бы снять перехват */ int __stdcall hook_recv(int sock, char *buff, int len, int flag) { char ent = "interes", *p; int ret = uniq_addr(sock, buff, len, flag); if (ret != ~0 && ret) { size_t len = strlen(ent); if (p = memstr(buff, ret, ent, len)) { modify_answer(p); } } return ret; } void* memstr(char *buf, size_t buf_len, void *sub, size_t sub_len) { return_val_if_fail(buf_len, 0); return_val_if_fail(sub_len, 0); while (buf_len-- >= sub_len) { if (!memcmp(buf, sub, sub_len)) return buf; buf++; } return 0; }
Рихтер написал эту функцию для патчинга IAT комментарии в коде оригинальные сохранены Code: void ReplaceIATEntryInOneMod(PCSTR pszCalleeModName, PROC pfnCurrent, PROC pfnNew, HMODULE hmodCaller) { ULONG ulSize; PIMAGE_THUNK_DATA pThunk; PIMAGE_IMPORT_DESCRIPTOR pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR) ImageDirectoryEntryToData(hmodCaller, TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT, &ulSize); if (pImportDesc == NULL) return; // в этом модуле нет раздела импорта // находим дескриптор раздела импорм со ссылками // на функции DLL (вызываемого модуля) for (; pImportDesc->Name; pImportDesc++) { PSTR pszModName = (PSTR) ((PBYTE) hmodCaller + pImportDesc->Name); if (lstrcmpiA(pszModName, pszCalleeModName) == 0) break; } if (pImportDesc->Name == 0) // этот модуль не импортирует никаких функций из данной DLL return; // получаем таблицу адресов импорта (IAT) для функций DLL pThunk = (PIMAGE_THUNK_DATA) ((PBYTE) hmodCaller + pImportDesc->FirstThunk); // заменяем адреса исходных функций адресами своих функций for (; pThunk->u1.Function; pThunk++) { // получаем адрес адреса функции PROC* ppfn = (PROC*) &pThunk->u1.Function; // та ли это функция, которая нас итересует? BOOL fFound = (*ppfn == pfnCurrent); // см. текст программы-примера, в котором // содержится трюковый код для Windows 98 if (fFound) { // адреса сходятся, изменяем адрес в разделе импорта WriteProcessMemory(GetCurrentProcess(), ppfn, &pfnNew, sizeof(pfnNew), NULL ); return; // получилось, выходим } } // если мы попали сюда, значит, в разделе импорта // нет ссылки на нужную функцию }
Прочитай эту статью для начала: http://wasm.ru/article.php?article=apihook_1 Перехват API функций происходит с помощью сплайсинга, редактирования таблицы импорта и т. д. Очень интересно посмотреть, как ты сможешь реализовать перехват Winsock функций, используя SetWindowsHookEx. Поэтому хочу посмотреть на статью "Перехват Winsok-функций с помощью SetWindowsHookEx" by M_script.
по мне перехват API функций юзать тупо ибо геморно и палевно для меня самый приемлемый вариант использовать winpcap... а там уж обрабатывать только пакеты идущие на 80 порт. P.S: SLESH давал наводку на еще одну технологию, но доков по ней оч мало
winpcap не очень хорошо использовать если нужен перехват всего траффика, т.к. настраивать надо под каждую машину и всякие там мегафон модемы, телефонные модемы и т.д. перехватить не выйдет. Советую написать простейший TDI драйвер, в WinDDK есть пример, за дня 4 можно разобраться. Это лучще чем неделю ждать здесь ответа) Единственно плохо то что нужны права админа и загрузить его безпалевно будет сложно.
Вот у меня в ddk нет сорсов вообще.Может ты выложишь сюда этот сорс. Кстати,про перехват Send/Recv,то тут проблема очень большая есть - это ssl