强制卸载目标进程模块

代码来源于网络,卸载模块后通过查询PEB得到进程信息的程序没有得到更新,(如:Windows优化大师和360的进程查看),可以通过冰刃查看。

注:强制卸载可能导致目标进程崩溃。

哈哈,又有了种结束进程的方式,卸载目标进程的ntdll.dll。

下面是代码:

class ForceQuit
{
public:
    bool EnablePriv()
    {
            HANDLE hToken;
            if ( OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken) )
            {
                    TOKEN_PRIVILEGES tkp;
		
                    LookupPrivilegeValue( NULL,SE_DEBUG_NAME,&tkp.Privileges[0].Luid );//修改进程权限
                    tkp.PrivilegeCount=1;
                    tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
                    AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限
		
                    return( (GetLastError()==ERROR_SUCCESS) );
            }
            return false;
    }
    bool GetProcessIdByName(LPSTR lpProcessName,LPDWORD lpdwPID)
    {
            HANDLE hSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
            assert(hSnap!=INVALID_HANDLE_VALUE);
            PROCESSENTRY32 pt32;
            pt32.dwSize=sizeof pt32;
            bool result=false;
            if (Process32First(hSnap,&pt32))
            {
                    do
                    {
                            if (!lstrcmpi(pt32.szExeFile,lpProcessName))
                            {
                                    *lpdwPID=pt32.th32ProcessID;
                                    result=true;
                                    break;
                            }
                    }while (Process32Next(hSnap,&pt32));
            }
            CloseHandle(hSnap);
            return result;
    }
    bool GetModuleBaseAddrByPID(DWORD dwProcessID,LPSTR lpDllName,LPDWORD lpdwBaseAddr)
    {
       HANDLE hSnap=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,dwProcessID);
       assert(hSnap!=INVALID_HANDLE_VALUE);
       MODULEENTRY32 md32;
       md32.dwSize=sizeof md32;
       bool result=false;
       if(Module32First(hSnap,&md32))
       {
           do
           {
              if(!lstrcmpiA(lpDllName,md32.szModule))
              {
                 *lpdwBaseAddr=(DWORD)md32.modBaseAddr;
                 result=true;
                 break;
              }
           }
           while(Module32Next(hSnap,&md32));
       }
       CloseHandle(hSnap);
       return result;
    }

    bool Execute(LPSTR lpProcessName,LPSTR lpDllName)
    {
        typedef DWORD (_stdcall *XXXNtUnmapViewOfSection)( HANDLE hProcess, PVOID Address);

        PVOID   NtdllAddress;
        HANDLE   hProcess;
       
        DWORD dwProcessID;
        EnablePriv();
        if(GetProcessIdByName(lpProcessName,&dwProcessID))
        {
            hProcess = OpenProcess( PROCESS_VM_OPERATION, FALSE, dwProcessID);
            assert(hProcess!=NULL);
            XXXNtUnmapViewOfSection  NtUnmapViewOfSection = (XXXNtUnmapViewOfSection)GetProcAddress(LoadLibraryA("ntdll.dll"), "NtUnmapViewOfSection" );
            assert(NtUnmapViewOfSection!=NULL);
            NtdllAddress = (PVOID)NtUnmapViewOfSection;
            
            DWORD moduleBaseAddr;
            if(GetModuleBaseAddrByPID(dwProcessID,lpDllName,&moduleBaseAddr))
            NtUnmapViewOfSection( hProcess,(PVOID)moduleBaseAddr);

            CloseHandle( hProcess );
            return true;
        }   
        return false;
    }
};

调用:

 ForceQuit quit;
    quit.EnablePriv();
    quit.Execute(DestProcessName,DestModuleName);


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值