принудительно выгружать модули процесса

0

Я хочу выгрузить некоторый модуль в процессе.

Я использую эту функцию:

bool UnInjectDll(const TCHAR* ptszDllFile, DWORD dwProcessId)    
{    
    if (NULL == ptszDllFile || 0 == ::_tcslen(ptszDllFile))    
    {    
        return false;    
    }    
    HANDLE hModuleSnap = INVALID_HANDLE_VALUE;    
    HANDLE hProcess = NULL;    
    HANDLE hThread = NULL;    
    hModuleSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessId);    
    if (INVALID_HANDLE_VALUE == hModuleSnap)    
    {    
        return false;    
    }    
    MODULEENTRY32 me32;    
    memset(&me32, 0, sizeof(MODULEENTRY32));    
    me32.dwSize = sizeof(MODULEENTRY32);    
    if(FALSE == ::Module32First(hModuleSnap, &me32))    
    {    
        ::CloseHandle(hModuleSnap);    
        return false;    
    }    
    bool isFound = false;    
    do    
    {    
        isFound = (0 == ::_tcsicmp(me32.szModule, ptszDllFile) || 0 == ::_tcsicmp(me32.szExePath, ptszDllFile));    
        if (isFound)   
        {    
            break;    
        }    
    } while (TRUE == ::Module32Next(hModuleSnap, &me32));    
    ::CloseHandle(hModuleSnap);    
    if (false == isFound)    
    {    
        return false;    
    }    
    hProcess = ::OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION, FALSE, dwProcessId);    
    if (NULL == hProcess)    
    {    
        return false;    
    }    
    LPTHREAD_START_ROUTINE lpThreadFun = (PTHREAD_START_ROUTINE)::GetProcAddress(::GetModuleHandle(_T("Kernel32")), "FreeLibrary");    
    if (NULL == lpThreadFun)    
    {    
        ::CloseHandle(hProcess);    
        return false;    
    }    
    hThread = ::CreateRemoteThread(hProcess, NULL, 0, lpThreadFun, me32.modBaseAddr , 0, NULL);    
    if (NULL == hThread)    
    {    
        ::CloseHandle(hProcess);    
        return false;    
    }    
    ::WaitForSingleObject(hThread, INFINITE);    
    ::CloseHandle(hThread);    
    ::CloseHandle(hProcess);    
    return true;    
}  

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

Я также использую инструмент "process detective" для этого, но этот инструмент также не может этого сделать.

Теперь я хочу функцию, которая, я уверен, выгрузит специальный модуль из процесса, который я хочу. например, вы создаете простую программу, в которой отображается только сообщение, теперь, если вы видите модули этого процесса, у него есть модуль ntdll.dll и некоторые другие модули, теперь вы не можете удалить из него модуль ntdll.dll или какой-либо другой модуль, Я хочу, чтобы функция заставляла процесс удалять любой модуль из процесса, который я хочу.

  • 1
    Было бы больно иметь отступы? И, пожалуйста, объясните, что именно вы хотите, чтобы ваш код делал, а что не работает ... Какой шаг терпит неудачу, что происходит / не происходит, что вы ожидаете быть другим?
  • 0
    Вам нужно будет вставить DLL, чтобы вы могли вызвать FreeLibrary (). Проблема курицы и яйца должна быть очевидной :) Очень большие шансы сбоя целевого процесса при его выполнении, поскольку он просто продолжит пытаться выполнить код в DLL, - это то, что вы обнаружите на своем пути.
Показать ещё 2 комментария
Теги:
visual-c++

1 ответ

1

То, что вы пытаетесь сделать, совершенно опасно (и, насколько мне известно, к счастью, невозможно).

Ваша программа или библиотека связана с некоторыми другими DLL. Эти библиотеки в свою очередь ссылаются и на другие, и так далее, и так далее. Когда ваша программа или DLL загружается в пространство памяти загрузчиком Windows, эти "зависимости" также будут загружены, а ваши таблицы адресов импорта будут исправлены, чтобы ваши звонки знали, куда прыгать, когда они будут выполнены. Весь ваш код будет жестко связан как атомный объект.

Выгрузка DLL, статически связанная таким образом (файлы DLL можно связать статически и не путать со статическими.lib файлами) в основном заставляет ваше приложение аварийно завершить второй вызов, который зависит от этого libarary - особенно the ntdll.dll который станет корнем большинства связанных с вами ntdll.dll. Вызовы будут выброшены в пустоту. Эти библиотеки не могут быть выгружены, потому что они в некотором смысле являются частью вашей программы.

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

Вы можете взять шляпу так, как вам хочется, но вы не можете (и не должны) разорвать свое сердце;)

Он не полностью отвечает на ваш вопрос, хотя я знаю, но хотя это всего лишь предупреждение о том, что вы никогда не должны делать это без очень веской причины (чего я не знаю, что у вас действительно есть), я вполне уверен, что вы можете не делай того, о чем ты просишь, - но я счастлив позволить другим людям исправить меня здесь.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню