|
|
| Посл.отвђт | Сообщен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 |