프로세스의 일부 모듈을 언로드하려고합니다.프로세스의 모듈을 강제로 언로드하십시오.
나는이 기능을 사용
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 모듈이나 다른 모듈을 제거 할 수 없습니다 . 프로세스가 원하는 프로세스에서 모듈을 제거하도록하는 함수가 필요합니다.
들여 쓰기가 많을까요? 그리고 코드가 무엇을 원하는지, 작동하지 않는 것이 무엇인지 설명하십시오 ... 어떤 단계가 실패하고, 어떤 단계가 다른 것으로 예상되는지/일어나지 않습니까? –
FreeLibrary()를 호출 할 수 있도록 DLL을 삽입해야합니다. 닭고기와 달걀 문제는 분명해야합니다 :) DLL에서 코드를 실행하려고 시도하기 때문에 대상 프로세스가 충돌하는 매우 높은 확률은 어려운 방법을 찾아내는 것입니다. –
@HansPassant 정적으로로드 된 DLL의 핸들에서'FreeLibrary'를 시도하는 것이 효과적이지 않습니다.재미있게도'FreeLibrary'에 대한 호출은 TRUE를 리턴하지만 lib가 언로드되지 않았지만 마지막 에러는 0입니다 ... 허. – PuerNoctis