На сайте в статье есть сишный код. Я попробовал его перевести в delphi. http://wasm.ru/article.php?article=sasapi Код (Text): bool RemoveFWHook(char* szDllPath, char* szFuncName) // в szDllPath полный путь к DLL ! { // получаем указатель на функцию HMODULE lpBase = LoadLibrary(szDllPath); LPVOID lpFunc = GetProcAddress(lpBase, szFuncName); if(!lpFunc) return false; // получаем RVA DWORD dwRVA = (DWORD)lpFunc-(DWORD)lpBase; // проецируем файл в память HANDLE hFile = CreateFile(szDllPath,GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL); if(INVALID_HANDLE_VALUE == hFile) return false; DWORD dwSize = GetFileSize(hFile, NULL); HANDLE hMapFile = CreateFileMapping(hFile, NULL, PAGE_READONLY|SEC_IMAGE, 0, dwSize, NULL); LPVOID lpBaseMap = MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, dwSize); // указатель на настоящую функцию LPVOID lpRealFunc = (LPVOID)((DWORD)lpBaseMap+dwRVA); // изменяем права на доступ и копируем DWORD dwOldProtect; BOOL bRes=true; if(VirtualProtect(lpFunc, 10, PAGE_EXECUTE_READWRITE, &dwOldProtect)) { memcpy(lpFunc, lpRealFunc, 10); }else{ bRes=false; } UnmapViewOfFile(lpBaseMap); CloseHandle(hMapFile); CloseHandle(hFile); return bRes; Мой вариант уже указанной библиотекой и функцией: Код (Text): procedure RemoveFWHook; type TConnect = function (s: TSocket; var name: TSockAddr; namelen: Integer): Integer; stdcall; const szDllPath = 'C:\WINNT\system32\wsock32.dll'; szFuncName = 'connect'; var lpBase, hFile, hMapFile: THandle; lpFunc, lpRealFunc, lpBaseMap: Pointer; dwRVA, dwSize, dwOldProtect: DWord; ConnectFunc: TConnect; Socket: TSocket; SockAddr: TSockAddr; WsaData: TWsaData; begin lpBase := LoadLibrary(PAnsiChar(szDllPath)); lpFunc := GetProcAddress(lpBase, PAnsiChar(szFuncName)); if lpFunc = nil then begin ShowMessage('lpFunc = nil'); Exit; end; dwRVA := DWord(lpFunc) - DWord(lpBase); hFile := CreateFile(PAnsiChar(szDllPath), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if INVALID_HANDLE_VALUE = hFile then begin ShowMessage('INVALID_HANDLE_VALUE = hFile'); Exit; end; dwSize := GetFileSize(hFile, nil); hMapFile := CreateFileMapping(hFile, nil, PAGE_READONLY or SEC_IMAGE, 0, dwSize, nil); lpBaseMap := MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, dwSize); lpRealFunc := Pointer(DWord(lpBaseMap) + dwRVA); // if VirtualProtect(lpFunc, 10, PAGE_EXECUTE_READWRITE, dwOldProtect) then // Move(lpRealFunc, lpFunc, 10); UnmapViewOfFile(lpBaseMap); CloseHandle(hMapFile); CloseHandle(hFile); WSAStartup(1, WsaData); @ConnectFunc := lpRealFunc; ConnectFunc(Socket, SockAddr, 0); end; В итоге - в моем случае получаю при вызове lpRealFunc (->ConnectFunc) AV. Что тут не так?