Hook InternetReadFile IE - туплю

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by boryisk, 18 Jan 2013.

  1. boryisk

    boryisk New Member

    Joined:
    17 Jan 2013
    Messages:
    0
    Likes Received:
    1
    Reputations:
    0
    Приветствую!
    Что то не могу понять, как правильно получить данные из функции.
    Вот код:
    Code:
    #include <Windows.h>
    #include <Wininet.h>
    #include <stdio.h>
    
    BOOL (WINAPI *OldInternetReadFile)(HINTERNET hFile, LPVOID lpBuffer, DWORD dwNumberOfBytesToRead, LPDWORD lpdwNumberOfBytesRead);
    
    BOOL WINAPI NewInternetReadFile(HINTERNET hFile, LPVOID lpBuffer, DWORD dwNumberOfBytesToRead, LPDWORD lpdwNumberOfBytesRead) {
    	
    	BOOL ret;
    	ret = OldInternetReadFile(hFile, lpBuffer, dwNumberOfBytesToRead, lpdwNumberOfBytesRead);
    	FILE *f;
    	f = fopen("C:\\Documents and Settings\\blablabla\\\Local Settings\\Temp\\ielog.txt", "a");
    	fprintf(f, "\n\n%s%d%s%d%s\n\n%s", "<-->", dwNumberOfBytesToRead, "<-->", lpdwNumberOfBytesRead, "<-->", (char *)lpBuffer);
    	fclose(f);
    
    	return ret;
    }
    
    BOOL PatchAPI(LPSTR lpszLib, LPSTR lpszFunc, FARPROC *lpOldFunc, FARPROC fpNewFunc) { // by Napalm
    	BOOL bResult = FALSE;
    	DWORD dwProtect;
    	LPBYTE lpPatch;
    	FARPROC fpOldFunc;
    	if(fpOldFunc = GetProcAddress(LoadLibrary(lpszLib), lpszFunc)){
    		lpPatch = (LPBYTE)fpOldFunc - 5;
    		if(!memcmp(lpPatch, "\x90\x90\x90\x90\x90\x8B\xFF", 7)) {
    			if(VirtualProtect(lpPatch, 7, PAGE_EXECUTE_READWRITE, &dwProtect)){
    				*lpPatch = 0xE9;
    				*(LPDWORD)(lpPatch + 1) = (DWORD)((LONG)fpNewFunc - (LONG)fpOldFunc);
    				*(LPDWORD)lpOldFunc = ((DWORD)fpOldFunc + 2);
    				InterlockedExchange((LPLONG)fpOldFunc, (LONG)((*(LPDWORD)fpOldFunc & 0xFFFF0000) | 0xF9EB));
    				VirtualProtect(lpPatch, 7, dwProtect, NULL);
    				bResult = TRUE;
    			}
    		}
    	}
    	return bResult;
    }
    
    BOOL UnPatchAPI(LPSTR lpszLib, LPSTR lpszFunc, FARPROC *lpOldFunc) {  
    	BOOL bResult = FALSE;
    	DWORD dwProtect;
    	LPBYTE lpPatch;
    	FARPROC fpOldFunc;
    	if(fpOldFunc = GetProcAddress(LoadLibrary(lpszLib), lpszFunc)) {
    		lpPatch = (LPBYTE)fpOldFunc - 5;
    		if(VirtualProtect(lpPatch, 7, PAGE_EXECUTE_READWRITE, &dwProtect)) {
    			InterlockedExchange((LPLONG)fpOldFunc, (LONG)((*(LPDWORD)fpOldFunc & 0xFFFF0000) | 0xFF8B));
    			FillMemory(lpPatch, 5, 0x90);
    			*lpOldFunc = NULL;
    			VirtualProtect(lpPatch, 7, dwProtect, NULL);
    			bResult = TRUE;
    		}
    	}
    	return bResult;
    }
    
    BOOL __stdcall DllMain( HANDLE hModule, DWORD dwReason, LPVOID lpReserved ) {
    	BOOL bHooked = FALSE;
    	if( dwReason == DLL_PROCESS_ATTACH )
    		if( !( bHooked = PatchAPI( "Wininet.dll", "InternetReadFile", (FARPROC *)&OldInternetReadFile, (FARPROC)NewInternetReadFile )))
    			MessageBox(0, "Unable to patch!", "InternetReadFile", 0);
    	else if( dwReason == DLL_PROCESS_DETACH )
    		if( bHooked ) 
    			UnPatchAPI( "wininet.dll", "InternetReadFile", (FARPROC *)&OldInternetReadFile);
        return bHooked;
    }
    
    Вот таким способом получаю не понятные кракозябры.
    Как правильно сделать что бы получать полностью содержимое страницы?

    P.S. InternetReadFileExA - тот же результат, а вот InternetReadFileExW не фукает.
     
    #1 boryisk, 18 Jan 2013
    Last edited: 18 Jan 2013
  2. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    Откройте для себя detours, mhook и форматирование кода.
     
    _________________________
  3. boryisk

    boryisk New Member

    Joined:
    17 Jan 2013
    Messages:
    0
    Likes Received:
    1
    Reputations:
    0
    Те вы хотите сказать если я не буду реализовывать перехват из dll, а на прямую писать функции, и использовать что то вроде
    Code:
    		
    __asm{ push ecx }
    __asm{ call getDelta } 
    __asm{ getDelta: }
    __asm{ pop ecx }
    __asm{ sub ecx,offset getDelta }
    __asm{ push eax }
    __asm{ lea eax,Hooked }
    __asm{ add eax,ecx }
    __asm{ mov temp,eax }
    __asm{ pop eax }
    __asm{ pop ecx }
    и получать значения из ecx, aex...
    всё будет исправно работать?

    P.S. в коде dll и так используется принцип detours
     
    #3 boryisk, 18 Jan 2013
    Last edited: 18 Jan 2013
  4. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    Принцип может и используется, а реализация может быть багнутой. А, забыл, ещё отладчики для себя стоит открыть.
     
    _________________________
  5. boryisk

    boryisk New Member

    Joined:
    17 Jan 2013
    Messages:
    0
    Likes Received:
    1
    Reputations:
    0
    Это всё хорошо, но как это влияет на буфер, в который функция пишет данные? Есть предположения что ещё что то надо хукнуть.
     
  6. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    Самому себе хукнуть неплохо бы. Если есть железная уверенность, что код выше написан без ошибок, то примите к сведению, что в случае с, например, https или gzip в буфере таки будут бинарные нечитабельные данные.
    Хочется сделать свою крутую малварь? Берите сорцы зевса или чего-нибудь подобного и смотрите реализацию.
     
    _________________________
  7. boryisk

    boryisk New Member

    Joined:
    17 Jan 2013
    Messages:
    0
    Likes Received:
    1
    Reputations:
    0
    вот я и спрашиваю: как правильнос делать? какую именно функцию надо перехватывать?


    P.S. пишу не малварь, мне просто нужно получать таким способ данные со страницы.
     
  8. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    С какой страницы то? О чем идет речь, о каком-то браузере, о пользовательской программе или ещё о чем?
    Если о браузере, то гугли сорцы зевса.
     
    _________________________
  9. boryisk

    boryisk New Member

    Joined:
    17 Jan 2013
    Messages:
    0
    Likes Received:
    1
    Reputations:
    0
    зевс использует GetUrlCacheEntryInfoW, а если кэш пустой?

    Опишу я что мне полностью надо: есть сайт, работает по https, мне нужно получить значение некоторых полей на нём, и записать это в файл.
    Обязательное условие: пользователь должен сам ходить по сайту используя IE. Вот я и ищю, какая функция выдаёт html код сайта на парсинг браузеру.
     
    #9 boryisk, 22 Jan 2013
    Last edited: 22 Jan 2013
  10. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    Значит делается простой плагин для браузера, зачем извращаться то? Не малварь же пишите, да?
     
    _________________________
  11. boryisk

    boryisk New Member

    Joined:
    17 Jan 2013
    Messages:
    0
    Likes Received:
    1
    Reputations:
    0
    Нет, говорил же - не малварь.
    Можно пример плагина который будет искать контент на старнице? И потом обращаться к файлу на жёстком диске?
    Видел примеры на шарпе, но в нём не силён.


    P.S. всё е лучше конечно бы было перехватом... то с плагином не много не удобно будет.
    P.S.2. читал про вот такой способ - http://omegacoder.com/?p=63, но не нашёл ни где описания под С\С++.
     
    #11 boryisk, 22 Jan 2013
    Last edited: 22 Jan 2013