· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Интересная идея пришла в голову...

Посл.отвђт Сообщенiе


Дата: Май 5, 2004 01:05:36

Задача - минимизировать время присутствия модуля в памяти.
т.е. чтоб через всякие handleex и т.д. было достаточно сложно найти загруженный модуль.
Что делает код :
выгружает библиотеку, ждет указанный таймаут и загружает её заново.
void SleepAndReloadLibrary(HMODULE hMod,DWORD dwDelay)
{
	byte* pCodeBase=(byte*)VirtualAlloc(0,MAX_PATH+1024,MEM_COMMIT,PAGE_EXECUTE_ READWRITE);
	ZeroMemory(pCodeBase,MAX_PATH+1024);
	byte CodeFreeLibrary[]={
			0xB8, 0xFF, 0xFF, 0xFF, 0xFF,	//mov         eax,offset FreeLibrary
			0xBB, 0xFF, 0xFF, 0xFF, 0xFF,    //mov         ebx,hModule
			0x53,							//push        ebx
			0xFF, 0xD0						//call        eax 			
	};
	byte CodeExitThread[]={
			0xB8, 0xFF, 0xFF, 0xFF, 0xFF,	//mov         eax,offset ExitThread@4
			0x6A, 0x00,						//push        0
			0xFF, 0xD0						//call        eax		
	};
	byte CodeSleepAndLoadLibrary[]={
			0xB8, 0x00, 0x00, 0x00, 0x00,    //mov         eax,offset Sleep
			0xBB, 0xE8, 0x03, 0x00, 0x00,    //mov         ebx,Delay
			0x53,							//push        ebx
			0xFF, 0xD0,						//call        eax				

			0xB8, 0x00, 0x00, 0x00, 0x00,    //mov         eax,offset LoadLibrary
			0xBB, 0xE8, 0x03, 0x00, 0x00,    //mov         ebx,librarypath
			0x53,							//push        ebx
			0xFF, 0xD0						//call        eax 	
	};
	
	DWORD pfnFL;
	byte * pCode=pCodeBase+MAX_PATH+1;
	pfnFL=(DWORD)GetProcAddress(LoadLibrary("kernel32.dll"),"FreeLibrary" );
	GetModuleFileName(hMod,(char*)pCodeBase,MAX_PATH);
	memcpy (&CodeFreeLibrary[1],&pfnFL,4);
	memcpy (&CodeFreeLibrary[6],&hMod,4);
	pfnFL=(DWORD)GetProcAddress(LoadLibrary("kernel32.dll"),"ExitThread") ;
	memcpy (&CodeExitThread[1],&pfnFL,4);
	pfnFL=(DWORD)GetProcAddress(LoadLibrary("kernel32.dll"),"Sleep");
	memcpy (&CodeSleepAndLoadLibrary[1],&pfnFL,4);
	memcpy (&CodeSleepAndLoadLibrary[6],&dwDelay,4);
	pfnFL=(DWORD)GetProcAddress(LoadLibrary("kernel32.dll"),"LoadLibraryA ");
	memcpy (&CodeSleepAndLoadLibrary[14],&pfnFL,4);
	memcpy (&CodeSleepAndLoadLibrary[19],&pCodeBase,4);
	
	byte * pCode1,*pCode2,*pCode3;
	pCode1=(byte*)&CodeFreeLibrary;
	pCode2=(byte*)&CodeExitThread;
	pCode3=(byte*)&CodeSleepAndLoadLibrary;
	int cflsz=sizeof(CodeFreeLibrary);
	int cetsz=sizeof(CodeExitThread);
	int cslallsz=sizeof(CodeSleepAndLoadLibrary);
	int i=0;
	for (i=0;i<32;i++)
	{
		memcpy (pCode+cflsz*i,&CodeFreeLibrary,cflsz);
	}
	memcpy (pCode+cflsz*i,&CodeSleepAndLoadLibrary,cslallsz);
	memcpy (pCode+cslallsz+cflsz*i,&CodeExitThread,cetsz);

	__asm
	{
		mov eax,pCode
		jmp eax
	}
}


Дата: Май 5, 2004 14:26:57

А зачем таймаут то? Тогда уж, наверное, надо делать обертку вокруг каждого вызова функции из модуля, который грузил бы модуль, звал функцию и выгружал модуль.


Дата: Май 5, 2004 16:32:38

таймаут - это для примера.
В моей конкретной таске так надо.
А вообще я модифицировал код - теперь у меня помимо этого стоит watchdog на счетчик вызовов нужной мне функции, и теперь работает так :
выгружается модуль, анализируется в цикле счетчик, когда значение переступет Threshold, то грузится модуль заново.


Дата: Май 5, 2004 16:35:58

Я сейчас думаю над другой идеей :
загрузить модуль, скопировать всю память модуля в "карман"
выгрузить модуль, произвести аллокацию по тому же адресу, и скопировать память обратно. Правда здесь не факт, что я смогу аллоцировтаь память по тому же адресу.


Дата: Май 5, 2004 17:51:44

Не сможешь по тому адресу (хотя должОн смочь) - сможешь по другому. Потом придется только reloc поправить :) Вот только если ты его скопируешь целиком, то можно будет распознать MZ/PE заголовок, и таким образом узнать о наличии постороннего модуля. С другой стороны, ты можешь и сам этот заголовок подпортить... А с третьей стороны, я, как админ, тебя за такие идеи "убыв бы!" :-E


Дата: Май 5, 2004 21:05:12

ну насчет - смогу по другому - не хоцца мне релоки править.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.055