если кому интересно кодес сплайсит отправку данных в опере скипает отправку любых данных на домены с встречающимся словом google но отличных от www.google.ru типа safebrowsing.google clients1.google помимо этого читает файлик с перечисленными полями которые надо удалять из всех запросов типа Referer: если кто не знает как отладить dll то в Linker->General->Output File пишем папку с оперой куда при билде сохранять дллку потом в Debugging->Command пишем что надо запустить при выборе отладки у меня так C:\Program Files\Opera\opera.exe все потом при выборе отладка будет запускатся браузер и останавливатся на вашей точке останова поставленной в дллке все потом берете LordPe и хардкодите в таблицу импорта opera.dll вашу дллку навсегда пробовал непосредственно к opera.exe брыкается чего то Code: #include <io.h> #include <stdio.h> #include <stdlib.h> #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <shlwapi.h> #define GTRACE 1 #include <headutil.h> #define MAX_OUTPUT_BUFF 256 static VOID __cdecl Show(PCSTR fmt, ...) { CHAR Buff[MAX_OUTPUT_BUFF]; va_list va; va_start(va, fmt); vsprintf(Buff, fmt, va); OutputDebugString(Buff); va_end(va); } BOOL __stdcall debug_privilege(VOID) { HANDLE Token; TOKEN_PRIVILEGES tkp; DWORD ReturnLength; if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &Token)) return FALSE; if (!LookupPrivilegeValue(NULL, "SeDebugPrivilege", &tkp.Privileges[0].Luid)) return FALSE; tkp.PrivilegeCount = 1; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; return AdjustTokenPrivileges(Token, FALSE, &tkp, 0, NULL, &ReturnLength); } // this routine copy past from wasm.ru i very lazy and small know in it theme BOOL __stdcall SetSplicingHook(void* pfnDst, void* pfnHook, UCHAR buffer[10]) { DWORD offset; DWORD old; memcpy(buffer, pfnDst, 5); // бекап начала функции buffer[5] = 0xE9; *((PDWORD)(buffer+6)) = (DWORD)pfnDst - (DWORD)buffer - 5; // разрешаем запись в страницу с кодом old = 0; VirtualProtect(pfnDst, 5, PAGE_READWRITE, &old); // мы запрашиваем 5 байт, но на самом деле изменятся права доступа всей страницы сразу // ставим JMP FAR offset = (DWORD) pfnHook - (DWORD) pfnDst - 5; *(BYTE*)pfnDst = 0xE9; // JMP FAR *(DWORD*)((DWORD)pfnDst+1) = offset; // восстанавливает старые атрибуты страницы VirtualProtect(pfnDst, 5, old, &old); // ништяк return TRUE; } static VOID WINAPI ClearIfExists(BYTE *Buff, DWORD *Size, CHAR *Field) { SIZE_T len; CHAR *p, *q, *clrf2, tmp; if (clrf2 = strstr(Buff, "\r\n\r\n")) { tmp = *clrf2; *clrf2 = '\0'; if (p = strstr(Buff, Field)) { *clrf2 = tmp; // @example // |<<<<<clear space>>>>>| // "Accept-Language:...\r\nAccept-Charset: ...\r\nAccept-Encoding: ...\r\n\r\n" q = p; while (q[0] != '\r' || q[1] != '\n') q++; len = q - p + 2; memcpy(p, p + len, Buff + *Size - p - len); *Size -= len; } else *clrf2 = tmp; } } static CHAR **option_array; static VOID WINAPI ReadFileOptions(VOID) { DWORD size = 0; CHAR *p, buff[512]; FILE *fin = fopen("c:\\options.txt", "r"); if (fin) { while (fgets(buff, _countof(buff), fin)) { if (p = strchr(buff, '\n')) *p = '\0'; if (*buff) { p = strdup(buff); option_array = realloc(option_array, sizeof(CHAR*) * (size + 2)); option_array[size] = p; option_array[size+1] = NULL; size++; } } fclose(fin); } } static VOID WINAPI CheckFields(PBYTE Buff, PDWORD Size) { CHAR **p; if (option_array) { p = option_array; while (*p) { ClearIfExists(Buff, Size, *p); p++; } } } typedef struct ABUF { unsigned long len; char FAR* buf; } ABUF, *LPABUF; static VOID WINAPI ClearSpyInfo(PBYTE Buff, DWORD Size) { CHAR fake[8] = "<>fuck<>"; DWORD cnt, ttk; PCHAR p; if (p = strstr(Buff, "google")) { if (strncmp(p-4, "www", 3) || strncmp(p+6, ".ru", 3)) { cnt = Size / sizeof(fake); ttk = 0; while (cnt--) { memcpy(Buff + ttk * sizeof(fake), fake, sizeof(fake)); ttk++; } memset(Buff + ttk * sizeof(fake), '$', Size % sizeof(fake)); } } } static VOID WINAPI ClearSpyInfoYandex(PBYTE Buff, DWORD Size) { CHAR fake[8] = "<>fuck<>"; DWORD cnt, ttk; PCHAR p; if (p = strstr(Buff, "yandex")) { if (strncmp(p-4, "www", 3) || strncmp(p+6, ".ru", 3)) { cnt = Size / sizeof(fake); ttk = 0; while (cnt--) { memcpy(Buff + ttk * sizeof(fake), fake, sizeof(fake)); ttk++; } memset(Buff + ttk * sizeof(fake), '$', Size % sizeof(fake)); } } } BYTE SendTrump[10]; static INT __stdcall HookSend(PVOID _1, PVOID _2, PVOID _3, PVOID _4, PVOID _5, PVOID _6, PVOID _7) { DWORD Old; LPABUF wsaBuf = _2; GTrace("///before///////////////////////////////////////////\n%.*s\n", wsaBuf->len, wsaBuf->buf); ClearSpyInfo(wsaBuf->buf, wsaBuf->len); ClearSpyInfoYandex(wsaBuf->buf, wsaBuf->len); Old = wsaBuf->len; CheckFields(wsaBuf->buf, &Old); GTrace("///after////////////////////////////////////////////\n%.*s\n", Old, wsaBuf->buf); GTrace("%p %p %p %p %p %p %p\n", _1, _2, _3, _4, _5, _6, _7); return ((INT(__stdcall*)())SendTrump)(_1, _2, _3, _4, _5, _6, _7); } PVOID pfnSend; static DWORD WINAPI RestoreHookEx(LPVOID lpReserved) { for (;;) { if (*(PBYTE)pfnSend != 0xE9) { Beep(700, 100); SetSplicingHook(pfnSend, HookSend, SendTrump); } else Sleep(1); } } #define IS_EXE FALSE #if IS_EXE #include <winsock2.h> int main(int argc, char **argv, char **envp) { HMODULE Mod = LoadLibrary("ws2_32.dll"); CHAR field[] = "Accept-Language:...\r\nAccept-Charset: ...\r\nAccept-Encoding: ...\r\n\r\n"; ReadFileOptions(); ClearIfExists(field, strlen(field) + 1, "Accept-Language"); GTrace("%.*s\n", 2, "test"); pfnSend = GetProcAddress(Mod, "WSASend"); SetSplicingHook(pfnSend, HookSend, SendTrump); CreateThread(NULL, 0, RestoreHookEx, NULL, 0, NULL); WSASend(0, 0, 0, 0, 0, 0, 0); Sleep(-1); return 0; } #else BOOL CALLBACK DllMain(HINSTANCE hInst, DWORD dwReason, LPVOID lpReserved) { if (DLL_PROCESS_ATTACH == dwReason) { HMODULE Mod = LoadLibrary("ws2_32.dll"); GTrace("Mod %p\n", Mod); pfnSend = GetProcAddress(Mod, "WSASend"); GTrace("pfnSend %p\n", pfnSend); if (SetSplicingHook(pfnSend, HookSend, SendTrump)) GTrace("SetSplicingHook return TRUE\n"); else GTrace("SetSplicingHook return FALSE\n"); if (CreateThread(NULL, 0, RestoreHookEx, NULL, 0, NULL)) GTrace("CreateThread return TRUE\n"); else GTrace("CreateThread return FALSE\n"); ReadFileOptions(); } return TRUE; } __declspec(dllexport) VOID FakeExport(VOID) { } #endif #if GTRACE # define GTrace(fmt, ...) ImpGTrace(fmt, __VA_ARGS__) #else # define GTrace(fmt, ...) #endif VOID ImpGTrace(const CHAR *fmt, ...) { va_list va; DWORD dwWrites; CHAR buff[7512]; va_start(va, fmt); buff[_countof(buff) - 1] = '\0'; _vsnprintf(buff, _countof(buff) - 1, fmt, va); EnterCriticalSection(&IsConsoleInitSection); if (!IsConsoleInitFlag) { AllocConsole(); IsConsoleInitFlag = TRUE; } LeaveCriticalSection(&IsConsoleInitSection); WriteConsole(GetStdHandle(-11), buff, strlen(buff), &dwWrites, NULL); va_end(va); }