Здр. Перехватываю send в проложении, заменяю первые 5 байт ( по статье ) Код (Text): // DLL внедряемая в АП Lotus Notes // #include "stdafx.h" #define __dbg 1 void *oldSend; void *newSend; UCHAR oldFunc[5]; void __debug(char *buff,int len){ FILE *fp; int i; if ((fp=fopen("c:\\__debug.txt","a+"))!=NULL){ // файл открыт, надо писать fputs("\r\n--------------------------------- PACKET START ---------------------------------\r\n",fp); for (i = 0; i<=len ; i++) { fputc(buff[i],fp); } fputs("\r\n--------------------------------- PACKET END ---------------------------------\r\n",fp); fclose(fp); } // if != NULL fopen } bool SetSplicingHook(void* pfnDst, void* pfnHook, UCHAR buffer[5]) { memcpy(buffer, pfnDst, 5); // бекап начала функции // разрешаем запись в страницу с кодом DWORD old = 0; VirtualProtect(pfnDst, 5, PAGE_READWRITE, &old); // мы запрашиваем 5 байт, но на самом деле изменятся права доступа всей страницы сразу // ставим JMP FAR DWORD offset = (DWORD) pfnHook - (DWORD) pfnDst - 5; *(BYTE*)pfnDst = 0xE9; // JMP FAR *(DWORD*)((DWORD)pfnDst+1) = offset; // восстанавливает старые атрибуты страницы VirtualProtect(pfnDst, 5, old, &old); // ништяк return true; } // снимаем локальный хук void UnsetSplicingHook(void* pfnDst, UCHAR buffer[5]) { DWORD old = 0; VirtualProtect(pfnDst, 5, PAGE_READWRITE, &old); __asm int 3 memcpy(pfnDst, buffer, 5); // восстанавливаем первые 5 байт из бекапа VirtualProtect(pfnDst, 5, old, &old); } int hsend(SOCKET s,const char* buf,int len,int flags){ int nRet; __debug((char*)buf,len); UnsetSplicingHook(oldSend,oldFunc); nRet = send(s,buf,len,flags); SetSplicingHook(oldSend,newSend,oldFunc); return nRet; } BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { HMODULE hMod_ws2_32dll; if(ul_reason_for_call == DLL_PROCESS_ATTACH ) { _asm mov newSend,offset hsend // Get newSend addr hMod_ws2_32dll = LoadLibrary("Ws2_32.dll"); oldSend = GetProcAddress(hMod_ws2_32dll, "send"); if (oldSend){ if (!SetSplicingHook(oldSend,newSend,oldFunc)){ MessageBox(0,(char *)oldFunc,0,0); } // if SetSplicingHook } // if oldSend } return TRUE; } Только вот после 2 вызова Lotus Notes падает, никак не мог отследить почему при востановлении 5 байтов в начало send ( в ws2_32 ) записывается всякое гавно....мож вы поможете.
Да не в этом дело, всё нормально шлёт 2 раза, но потом какой-то мусор в начале функции send, щяс я по другому пробую сплайсить
WIN32 Многопоточное приложение точно упадет т.к. ты каждый раз восстанавливаешь 5 байт чего делать нельзя. Посмотри вот посты http://www.wasm.ru/forum/viewtopic.php?id=20203. Тебе придется еще дизассемблер длин использовать. То есть схема должна быть: до: void target_example(){ // цель push ebp mov ebp, esp mov eax, 123 ........ } после: void target_example(){ // цель jmp allocated_address __original: ........ ........ } allocated_address: // выделеный в памяти адрес push ebp mov ebp, esp mov eax, 123 call _our_proc // вызов нужной процедуры, чтобы зарегать что-либо jmp __original - ничего не востанавливаем, просто несколько инструкций перенесли в другое место и выолнили свой код