Приветствую! Что то не могу понять, как правильно получить данные из функции. Вот код: 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 не фукает.
Те вы хотите сказать если я не буду реализовывать перехват из 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
Принцип может и используется, а реализация может быть багнутой. А, забыл, ещё отладчики для себя стоит открыть.
Это всё хорошо, но как это влияет на буфер, в который функция пишет данные? Есть предположения что ещё что то надо хукнуть.
Самому себе хукнуть неплохо бы. Если есть железная уверенность, что код выше написан без ошибок, то примите к сведению, что в случае с, например, https или gzip в буфере таки будут бинарные нечитабельные данные. Хочется сделать свою крутую малварь? Берите сорцы зевса или чего-нибудь подобного и смотрите реализацию.
вот я и спрашиваю: как правильнос делать? какую именно функцию надо перехватывать? P.S. пишу не малварь, мне просто нужно получать таким способ данные со страницы.
С какой страницы то? О чем идет речь, о каком-то браузере, о пользовательской программе или ещё о чем? Если о браузере, то гугли сорцы зевса.
зевс использует GetUrlCacheEntryInfoW, а если кэш пустой? Опишу я что мне полностью надо: есть сайт, работает по https, мне нужно получить значение некоторых полей на нём, и записать это в файл. Обязательное условие: пользователь должен сам ходить по сайту используя IE. Вот я и ищю, какая функция выдаёт html код сайта на парсинг браузеру.
Нет, говорил же - не малварь. Можно пример плагина который будет искать контент на старнице? И потом обращаться к файлу на жёстком диске? Видел примеры на шарпе, но в нём не силён. P.S. всё е лучше конечно бы было перехватом... то с плагином не много не удобно будет. P.S.2. читал про вот такой способ - http://omegacoder.com/?p=63, но не нашёл ни где описания под С\С++.