Example #1
0
RegKeyHook* HooksRegistryPtr()
{
	if (!ghAdvapi32 || (ghNewKeyRoot == (HKEY)-1))
		return NULL;
		
	CESERVER_CONSOLE_MAPPING_HDR* pInfo = GetConMap();
	//if (!pInfo || !*pInfo->sHiveFileName)
	//	return NULL;
	gbRegHookedNow = pInfo && ((pInfo->isHookRegistry&3) == 3);
	if (!gbRegHookedNow)
		return NULL;
	
	// ghNewKeyRoot == ((HKEY)-1), - если был облом подключения виртуального реестра
	if (ghNewKeyRoot == NULL)
	{
		if (!InitRegistryRoot(pInfo))
			return NULL;
	}
	else if ((ghNewKeyRoot == NULL) || (ghNewKeyRoot == (HKEY)-1))
	{
		return NULL;
	}

	return gpRegKeyHooks;
}
Example #2
0
void OnConWndChanged(HWND ahNewConWnd)
{
	//BOOL lbForceReopen = FALSE;

	if (ahNewConWnd)
	{
		#ifdef _DEBUG
		if (user)
		{
			wchar_t sClass[64]; user->getClassNameW(ahNewConWnd, sClass, countof(sClass));
			_ASSERTEX(isConsoleClass(sClass));
		}
		#endif

		if (ghConWnd != ahNewConWnd)
		{
			ghConWnd = ahNewConWnd;
			//lbForceReopen = TRUE;
		}
	}
	else
	{
		//lbForceReopen = TRUE;
	}

	GetConMap(TRUE);
}
Example #3
0
bool isProcessCtrlZ()
{
	CESERVER_CONSOLE_MAPPING_HDR* pMap = GetConMap();
	if (!pMap)
		return false;
	if (!pMap->cbSize || !(pMap->Flags & CECF_ProcessCtrlZ))
		return false;
	return true;
}
Example #4
0
bool InitHooksReg()
{
	bool lbRc = false;
#ifdef HOOKS_USE_VIRT_REGISTRY
	CESERVER_CONSOLE_MAPPING_HDR* pInfo = GetConMap();
	if (!pInfo || !(pInfo->isHookRegistry&1) || !*pInfo->sHiveFileName)
		return false;

	DEBUGSTR(L"ConEmuHk: Preparing for registry virtualization\n");

	HookItem HooksRegistry[] =
	{
		/* ************************ */
		{(void*)OnRegCloseKey,		"RegCloseKey",		advapi32},
		{(void*)OnRegCreateKeyA,	"RegCreateKeyA",	advapi32},
		{(void*)OnRegCreateKeyW,	"RegCreateKeyW",	advapi32},
		{(void*)OnRegCreateKeyExA,	"RegCreateKeyExA",	advapi32},
		{(void*)OnRegCreateKeyExW,	"RegCreateKeyExW",	advapi32},
		{(void*)OnRegOpenKeyA,		"RegOpenKeyA",		advapi32},
		{(void*)OnRegOpenKeyW,		"RegOpenKeyW",		advapi32},
		{(void*)OnRegOpenKeyExA,	"RegOpenKeyExA",	advapi32},
		{(void*)OnRegOpenKeyExW,	"RegOpenKeyExW",	advapi32},
		{(void*)OnRegDeleteKeyA,	"RegDeleteKeyA",	advapi32},
		{(void*)OnRegDeleteKeyW,	"RegDeleteKeyW",	advapi32},
		/* ************************ */
		{(void*)OnRegConnectRegistryA,	"RegConnectRegistryA",	advapi32},
		{(void*)OnRegConnectRegistryW,	"RegConnectRegistryW",	advapi32},
		/* ************************ */
		{0}
	};
	lbRc = (InitHooks(HooksRegistry) >= 0);

	if (lbRc)
	{
		PrepareHookedKeyList();
		DEBUGSTR(L"ConEmuHk: Registry virtualization prepared\n");
		// Если advapi32.dll уже загружена - можно сразу дернуть экспорты
		if (ghAdvapi32)
		{
			RegOpenKeyEx_f = (RegOpenKeyEx_t)GetProcAddress(ghAdvapi32, "RegOpenKeyExW");
			RegCreateKeyEx_f = (RegCreateKeyEx_t)GetProcAddress(ghAdvapi32, "RegCreateKeyExW");
			RegCloseKey_f = (RegCloseKey_t)GetProcAddress(ghAdvapi32, "RegCloseKey");
		}
	}
	else
	{
		DEBUGSTR(L"ConEmuHk: Registry virtualization failed!\n");
	}
	
#else
	lbRc = true;
#endif
	return lbRc;
}
Example #5
0
static bool InitializeClink()
{
	if (gnCmdInitialized)
		return true;
	gnCmdInitialized = 1; // Single

	//if (!gnAllowClinkUsage)
	//	return false;

	CESERVER_CONSOLE_MAPPING_HDR* pConMap = GetConMap();
	if (!pConMap /*|| !(pConMap->Flags & CECF_UseClink_Any)*/)
	{
		//gnAllowClinkUsage = 0;
		gnCmdInitialized = -1;
		return false;
	}

	// Запомнить режим
	//gnAllowClinkUsage =
	//	(pConMap->Flags & CECF_UseClink_2) ? 2 :
	//	(pConMap->Flags & CECF_UseClink_1) ? 1 :
	//	CECF_Empty;
	gbAllowClinkUsage = ((pConMap->Flags & CECF_UseClink_Any) != 0);
	gbAllowUncPaths = (pConMap->ComSpec.isAllowUncPaths != FALSE);

	if (gbAllowClinkUsage)
	{
		wchar_t szClinkBat[MAX_PATH+32];
		wcscpy_c(szClinkBat, pConMap->ComSpec.ConEmuBaseDir);
		wcscat_c(szClinkBat, L"\\clink\\clink.bat");
		if (!FileExists(szClinkBat))
		{
			gbAllowClinkUsage = false;
		}
		else
		{
			int iLen = lstrlen(szClinkBat) + 16;
			gszClinkCmdLine = (wchar_t*)malloc(iLen*sizeof(*gszClinkCmdLine));
			if (gszClinkCmdLine)
			{
				*gszClinkCmdLine = L'"';
				_wcscpy_c(gszClinkCmdLine+1, iLen-1, szClinkBat);
				_wcscat_c(gszClinkCmdLine, iLen, L"\" inject");
			}
		}
	}

	return true;

	//BOOL bRunRc = FALSE;
	//DWORD nErrCode = 0;

	//if (gnAllowClinkUsage == 2)
	//{
	//	// New style. TODO
	//	wchar_t szClinkDir[MAX_PATH+32], szClinkArgs[MAX_PATH+64];

	//	wcscpy_c(szClinkDir, pConMap->ComSpec.ConEmuBaseDir);
	//	wcscat_c(szClinkDir, L"\\clink");

	//	wcscpy_c(szClinkArgs, L"\"");
	//	wcscat_c(szClinkArgs, szClinkDir);
	//	wcscat_c(szClinkArgs, WIN3264TEST(L"\\clink_x86.exe",L"\\clink_x64.exe"));
	//	wcscat_c(szClinkArgs, L"\" inject");

	//	STARTUPINFO si = {sizeof(si)};
	//	PROCESS_INFORMATION pi = {};
	//	bRunRc = CreateProcess(NULL, szClinkArgs, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, szClinkDir, &si, &pi);
	//
	//	if (bRunRc)
	//	{
	//		WaitForSingleObject(pi.hProcess, INFINITE);
	//		CloseHandle(pi.hProcess);
	//		CloseHandle(pi.hThread);
	//	}
	//	else
	//	{
	//		nErrCode = GetLastError();
	//		_ASSERTEX(FALSE && "Clink loader failed");
	//		UNREFERENCED_PARAMETER(nErrCode);
	//		UNREFERENCED_PARAMETER(bRunRc);
	//	}
	//}
	//else if (gnAllowClinkUsage == 1)
	//{
	//	if (!ghClinkDll)
	//	{
	//		wchar_t szClinkModule[MAX_PATH+30];
	//		_wsprintf(szClinkModule, SKIPLEN(countof(szClinkModule)) L"%s\\clink\\%s",
	//			pConMap->ComSpec.ConEmuBaseDir, WIN3264TEST(L"clink_dll_x86.dll",L"clink_dll_x64.dll"));
	//
	//		ghClinkDll = LoadLibrary(szClinkModule);
	//		if (!ghClinkDll)
	//			return false;
	//	}

	//	if (!gpfnClinkReadLine)
	//	{
	//		gpfnClinkReadLine = (call_readline_t)GetProcAddress(ghClinkDll, "call_readline");
	//		_ASSERTEX(gpfnClinkReadLine!=NULL);
	//	}
	//}

	//return (gpfnClinkReadLine != NULL);
}
Example #6
0
// !!! WARNING !!! В ЭТОЙ функции обращений к реестру (или advapi32) НЕ ДЕЛАТЬ !!!
void PrepareHookedKeyList()
{
	CESERVER_CONSOLE_MAPPING_HDR* pInfo = GetConMap();
	if (!pInfo || !(pInfo->isHookRegistry&1) || !*pInfo->sHiveFileName)
		return;

	// Сейчас HookedNow НЕ проверять, т.к. функция вызывается при первоначальной инициализации
    // Здесь важен сам факт того, что виртуальный реестр может быть включен (в любой момент)!
    gbRegHookedNow = ((pInfo->isHookRegistry&3) == 3);
	//BOOL lbHookedNow = ((pInfo->isHookRegistry&3) == 3);
	//if (gbRegHookedNow != lbHookedNow)
	//{
	//	if (gbRegHookedNow && gpRegKeyStore)
	//		gpRegKeyStore->Clear();
	//	gbRegHookedNow = lbHookedNow;
	//	if (!lbHookedNow)
	//		return;
	//}

	if (!gpRegKeyStore)
	{
		WARNING("gpRegKeyStore");
		gpRegKeyStore = (RegKeyStore*)calloc(1,sizeof(*gpRegKeyStore));
		if (!gpRegKeyStore)
		{
			_ASSERTE(gpRegKeyStore!=NULL);
			return;
		}
		gpRegKeyStore->Init();
	}
	
	if (!gpRegKeyHooks)
	{
		wchar_t wsGhost[42] = L"." VIRTUAL_REGISTRY_GUID; // L".{16B56CA5-F8D2-4EEA-93DC-32403C7355E1}";
		//char sGhost[42] = ".{16B56CA5-F8D2-4EEA-93DC-32403C7355E1}";
		
		{
			struct { HKEY hKey; LPCWSTR pszKey; } RegKeyHooks[] =
			{
				// Поддерживаются только ПОДКЛЮЧИ в "Software\\"
				{HKEY_LOCAL_MACHINE, L"Far"},
				{HKEY_CURRENT_USER,  L"Far"},
				{HKEY_LOCAL_MACHINE, L"Far2"},
				{HKEY_CURRENT_USER,  L"Far2"},
				{HKEY_LOCAL_MACHINE, L"Far Manager"},
				{HKEY_CURRENT_USER,  L"Far Manager"},
				{NULL}
			};
			
			gpRegKeyHooks = (RegKeyHook*)calloc(countof(RegKeyHooks)+1, sizeof(RegKeyHook));
			if (!gpRegKeyHooks)
			{
				_ASSERTE(gpRegKeyHooks!=NULL);
				gpRegKeyStore->Free();
				free(gpRegKeyStore);
				gpRegKeyStore = NULL;
				return;
			}
			//memmove(gpRegKeyHooks, RegKeyHooks, sizeof(RegKeyHooks));
			for (size_t i = 0; i < countof(RegKeyHooks) && RegKeyHooks[i].hKey; i++)
			{
				gpRegKeyHooks[i].hkRoot = RegKeyHooks[i].hKey;
				lstrcpyn(gpRegKeyHooks[i].wsHooked, RegKeyHooks[i].pszKey, countof(gpRegKeyHooks[i].wsHooked));
			}
		}
		
						
		// Подготовить структуру gpRegKeyHooks к использованию
		for (UINT i = 0; gpRegKeyHooks[i].hkRoot; i++)
		{
			// Длина перехватываемого ключа
			gpRegKeyHooks[i].nHookedLen = lstrlen(gpRegKeyHooks[i].wsHooked);
			WideCharToMultiByte(CP_ACP, 0, gpRegKeyHooks[i].wsHooked, gpRegKeyHooks[i].nHookedLen+1,
				gpRegKeyHooks[i].sHooked, gpRegKeyHooks[i].nHookedLen+1, 0,0);

			// Что показываем в RegEnumKey, вместо реальных ключей
			wcscpy_c(gpRegKeyHooks[i].wsGhost, PointToName(gpRegKeyHooks[i].wsHooked));
			wcscat_c(gpRegKeyHooks[i].wsGhost, wsGhost);
			gpRegKeyHooks[i].nGhostLen = lstrlen(gpRegKeyHooks[i].wsGhost);
			WideCharToMultiByte(CP_ACP, 0, gpRegKeyHooks[i].wsGhost, -1, gpRegKeyHooks[i].sGhost, countof(gpRegKeyHooks[i].sGhost), 0,0);

			// Для упрощения обработки - переопределенные пути
			msprintf(gpRegKeyHooks[i].wsNewPath, countof(gpRegKeyHooks[i].wsNewPath), L"%s\\Software\\%s",
				(gpRegKeyHooks[i].hkRoot == HKEY_LOCAL_MACHINE) ? L"HKLM" : L"HKCU", gpRegKeyHooks[i].wsHooked);
			WideCharToMultiByte(CP_ACP, 0, gpRegKeyHooks[i].wsNewPath, -1, gpRegKeyHooks[i].sNewPath, countof(gpRegKeyHooks[i].sNewPath), 0, 0);
		}
	}
}
Example #7
0
void CheckVariables()
{
	// Пока что он проверяет и меняет только ENV_CONEMUANSI_VAR_W ("ConEmuANSI")
	GetConMap(FALSE);
}