Zwalnianie bibliotek dll innych procesów

0

Witam.
Napisałem funkcje, która zwalnia bibliotekę dll innego procesu. Funkcja działa, jednak zwalnia tylko niektóre biblioteki. Nie zwalnia bibliotek, typu KERNEL32, GDI32, WINSOCK itd. Czy one są jakoś zabezpieczone ?
Jak je zwolnić? Może trzeba je jakoś odblokować.

Tutaj na wszelki wypadek wrzucam kod mojej funkcji

bool EjectDll(DWORD pid, char* dll)
{
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,false,pid);
    if(hProcess==INVALID_HANDLE_VALUE) return false;
    
    HMODULE hK32 = GetModuleHandle("Kernel32");
    DWORD hDll;
    HANDLE hThr;
    
    int listLength = 0;
    MODULEENTRY32* me32 = GetModuleList(pid,&listLength);
    
    for(int i=0; i<listLength; i++)
    {
        if(strcmp(me32[i].szModule,dll)==0)
        {
            hDll = (DWORD)me32[i].hModule;
            break;
        }
    }
    
    delete[] me32;
    
    if(!hDll) return false;

    hThr = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)GetProcAddress(hK32,"FreeLibrary"),(void*)hDll,0,NULL);
    WaitForSingleObject(hThr,10000);
    CloseHandle(hThr);
    
    CloseHandle(hProcess);
    
    return true;
}

Pozdrawiam, i Proszę o pomoc.

0
Gokor napisał(a)

Nie zwalnia bibliotek, typu KERNEL32, GDI32, WINSOCK itd. Czy one są jakoś zabezpieczone ?

omg :| rozbroiłeś mnie, ich się zwolnić nie da, bo bez nich w żaden spsoób system pracować nie może...

0

Hm, w sumie faktycznie, ale powiem dokładniej.

Podszkalam sobie umiejętności i ściągnałem program do blokowania stron o niewłaściwych treściach. Chce go sobie "ominąć". Zauważyłem, że w rejestrach HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Servies\Winsock2\Parameters\Protocol_catalog dodaje nazwe swojej biblioteki dll. Dzięki temu ta biblioteka jest uruchamiana z każdą aplikacją używającą WINSOCK. No i właśnie proboje zwolnić bibliotekę dll tego programu i się nie da.

Jak ją zwolnić?

Prosze o pomoc, pozdrawiam

0

crayze napisał:

omg rozbroiłeś mnie, ich się zwolnić nie da, bo bez nich w żaden spsoób system pracować nie może...

Chyba jednak sie da - zerknij na to: http://gynvael.coldwind.pl/?id=91

0

Dzięki wielkie Cyriel, skorzystam.

Pozdrawiam.

0

Hmm, po przejrzeniu tam nie ma dokładnie jak zwolnić jedną biblioteke dll zabezpieczoną przed zwalnianiem.
Jakby ktoś miał jakieś pomysły to Proszę pisać.

Pozdrawiam.

0
cyriel napisał(a)

crayze napisał:

omg rozbroiłeś mnie, ich się zwolnić nie da, bo bez nich w żaden spsoób system pracować nie może...

Chyba jednak sie da - zerknij na to: http://gynvael.coldwind.pl/?id=91

hardkorowiec :> no dobra da się, pokłony dla takich ludzi

1

Hmm, po przejrzeniu tam nie ma dokładnie jak zwolnić jedną biblioteke dll zabezpieczoną przed zwalnianiem.

Ano dokładnie nie ma, bo to przez przypadek wyszło ;>
Chodzi o UnmapViewOfFile albo NtUnmapViewOfSection ;> Użyj tego na adresie tamtej DLLki, oczywiście w kontekście obcego procesu.
Pamiętaj jednak że samo uwolnienie DLLki przyniesie ci tyle że aplikacja się wyłoży przy próbie skorzystania z winsocka - lepiej zamiast uwalniania pomyśl o przeanalizowaniu jak ten lib działa (tzn jakie procedury ta DLLka exportuje), i spatchowaniu ich w pamięci jakimś RET czy RETN 8 lub kapkę dłuższym fragmentem kodu.
A może można jakoś wyrejestrować taką DLLkę korzystając z procedurek winsocka ?

0

@Gynvael Coldwind
Ta biblioteka co jest ustawiona w rejestrach przy włączaniu aplikacji z Winsockiem ma wyexportowaną tylko jedną funkcje: WSPStartup().

A gdyby tak zwolnić tą biblioteke za pomocą UnmapViewOfFile i na niej miejsce wstawic inną z funkcją WSPStartup() ?

A moglby mi ktos powiedziec dlaczego aplikacja się niszczy po probie skorzystania z Winsocka ?
Winsock korzysta z tej biblioteki czy co? przecieŻ ta biblioteka nie jest jakąś częścią mechanizmu Winsocka. To poco winsock z niej korzysta?

1

Rozważmy pomysł wstawienia innej DLL z WSPStartup().
Po pierwsze, kiedy WSPStartup() jest wywoływane i po co jest? Tutaj będę zgadywał, ale prawdopodobnie dość trafnie ;> WSPStartup będzie wywoływane gdzieś na początku inicjacji winsocka, i będzie prawdopodobnie rejestrować jakieś inne wewnętrzne funkcje (callbacki) które będą wywoływane od czasu do czasu.
W takim razie, czy podmienienie DLLki w dowolnym momencie coś da? Tak, da tyle że aplikacja się wysypie ;>
A czy podmienienie DLLki przy starcie aplikacji coś da. Tak, i to sporo, natomiast to jest bardzo trudne do wykonania.
Więc pomysł niestety nie przejdzie imho.

Co do tego że "nie jest częścią mechanizmu Winsock" - jeśli się zarejestrowała jako część mechanizmu winsock (a tak pisałeś gdzieś wyżej), to JEST częścią mechanizmu winsock, kz którego winsock zapewne aktywnie korzysta ;>

Poczytaj o Winsock SPI, z tego chyba korzysta programik z którym walczysz ;>

1 użytkowników online, w tym zalogowanych: 0, gości: 1