C++ — удалить внедренную DLL

Я использовал этот код, который я нашел где-то в Интернете:

    void InjectDLL()
{
    char *dllName = "C:\\Project2.dll";

    HANDLE proc = OpenProcess(PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_SET_INFORMATION | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_CREATE_THREAD, FALSE, PID);

    LPVOID LoadLibAddr = (LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");
    LPVOID dereercomp = VirtualAllocEx(proc, NULL, strlen(dllName) + 1, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    WriteProcessMemory(proc, dereercomp, dllName, strlen(dllName) + 1, NULL);
    HANDLE asdc = CreateRemoteThread(proc, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddr, dereercomp, 0, NULL);

    WaitForSingleObject(asdc, INFINITE);
    VirtualFreeEx(proc, dereercomp, strlen(dllName) + 1, MEM_RELEASE);
    CloseHandle(asdc);
    CloseHandle(proc);
}

Все работает отлично, но после того, как я закончил то, что мне нужно было сделать, я хотел бы удалить внедренную dll либо из программы, которая внедряет dll, либо из самой dll.


person user3213103    schedule 25.06.2014    source источник
comment
Первое решение: DLL создает поток, не запускает другой код, ждет какого-то сигнала и затем использует FreeLibraryAndExitThread. Второе решение: ввести SetWindowsHookEx ; UnhookWindowsHookEx выгрузит DLL (будьте к этому готовы, это значит: никаких живых окон, никаких приватных потоков)   -  person manuell    schedule 26.06.2014
comment
Большое спасибо за ответ! Мне удалось это сделать через SetWindowsHookEx, и отцепить, чтобы DLL отсоединилась... У меня есть еще один вопрос. Можно ли разблокировать файл DLL на жестком диске после его загрузки перехваченной программой. Я пытался использовать FreeLibrary, но это, похоже, также отсоединяет DLL, хотя я бы хотел, чтобы она загружалась в процессе, но не на жестком диске.   -  person user3213103    schedule 27.06.2014
comment
Когда DLL загружается в процесс, вы можете переименовать ее, но не можете удалить или обновить (из другого процесса). Загрузка из памяти сложна. Вы не найдете здесь помощи, если не объясните четко, какова ваша цель, а именно: не писать вредоносное ПО.   -  person manuell    schedule 27.06.2014