safebrowsing.google

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by greki_hoy, 22 Aug 2010.

  1. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    если кому интересно кодес сплайсит
    отправку данных в опере скипает отправку любых данных
    на домены с встречающимся словом
    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);
    }
    
    
     
    1 person likes this.