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; }
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); }
bool isProcessCtrlZ() { CESERVER_CONSOLE_MAPPING_HDR* pMap = GetConMap(); if (!pMap) return false; if (!pMap->cbSize || !(pMap->Flags & CECF_ProcessCtrlZ)) return false; return true; }
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; }
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); }
// !!! 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); } } }
void CheckVariables() { // Пока что он проверяет и меняет только ENV_CONEMUANSI_VAR_W ("ConEmuANSI") GetConMap(FALSE); }