windows遍历进程与杀死进程

windows下遍历进程有多种方式:

进程快照:CreateToolhelp32Snapshot;

进程状态API:PSAPI;


在psapi中主要使用到的方法有:

EnumProcesses——枚举进程;

EnumProcessModules——枚举进程内模块;

GetModuleFileNameEx——获取模块名;

通过这3个方法就可以遍历进程以及进程内各个模块;

其中基本数据结构QString、QList是基于Qt的,如果用的不是Qt库,换成C++对应STL标准库List、String的即可;

    //Win32Api:
    void AdjustPrivilege()
    {
        HANDLE hToken;
        if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
        {
            TOKEN_PRIVILEGES tp;
            tp.PrivilegeCount = 1;
            tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
            if (LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid))
            {
                AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
            }
            CloseHandle(hToken);
        }
    }
	
    //根据进程所在的路径查询进程,并返回进程的ID列表
    QList<DWORD> CheckProcess(const QString &processPath)
    {
        AdjustPrivilege();
        QList<DWORD> pIDList;
        DWORD dwProcessId[1024];
        DWORD bytesRet;
        if (EnumProcesses(dwProcessId, sizeof(dwProcessId), &bytesRet))
        {
            HANDLE hProcess = NULL;
            HMODULE hModus[1024];
            DWORD bytesModuRet;
            TCHAR szModuleName[MAX_PATH];
            QStringList tempPathList = processPath.toLower()
                    .split(QRegExp("[/\\\\]"), QString::SkipEmptyParts);
            QString processPathWinStd;//转成windows标准的路径
            int listLength = tempPathList.length();
            for (int idx = 0; idx < listLength; ++idx)
            {
                if (idx != 0)
                    processPathWinStd.push_back("\\");
                processPathWinStd.push_back(tempPathList[idx]);
            }
            int ProcessNum = (bytesRet/sizeof(DWORD));
            for (int i = 0, j = 0; i < ProcessNum; ++i)
            {
                hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, dwProcessId[i]);
                if (hProcess)
                {
                    //Do not call CloseHandle on any of the handles returned by this function.
                    //The information comes from a snapshot, so there are no resources to be freed.
                    if (EnumProcessModules(hProcess, hModus, sizeof(hModus), &bytesModuRet))
                    {
                        int ModuleNum = (bytesRet/sizeof(DWORD));
                        for (j = 0; j < ModuleNum; ++j)
                        {
                            if (GetModuleFileNameEx(hProcess, hModus[j], szModuleName, sizeof(szModuleName))
                             && processPathWinStd == QString::fromWCharArray(szModuleName, _tcslen(szModuleName)).toLower())
                            {
                                pIDList.push_back(dwProcessId[i]);
                            }
                        }
                    }
                    CloseHandle(hProcess);
                }
            }
        }
        return pIDList;
    }
注意其中的EnumProcessModules中的hModus句柄不能使用CloseHandle(因为这些句柄来自一个快照snapshot,不是实际的资源):

Do not call CloseHandle on any of the handles returned by this function.
The information comes from a snapshot, so there are no resources to be freed.


windows下杀死进程也有两种方式:

TerminateProcess——系统API;

NtTerminateProcess——ntdll.dll中未公开导出方法;

TerminateProcess实际上也是调用NtTerminateProcess实现具体功能的;

正常情况下,调用这两个任何一个都可以终结或者杀死一个进程(夸用户杀进程需要先提权,提权见“windows提权方法”),但是在有些情况下有些应用程序为了防止自己被杀,会hook系统的TerminateProcess方法,导致TerminateProcess失效;所以用NtTerminateProcess可以使杀死进程的成功率更高一些;

    void Terminate(const QString &processPath)
    {
        AdjustPrivilege();
        //================TerminateProcess================//遍历进程列表与进程模块,匹配路径后强杀
        DWORD dwProcessId[1024];
        DWORD bytesRet;
        if (EnumProcesses(dwProcessId, sizeof(dwProcessId), &bytesRet))
        {
            HANDLE hProcess = NULL;
            HMODULE hModus[1024];
            DWORD bytesModuRet;
            TCHAR szModuleName[MAX_PATH];
            QStringList tempPathList = processPath.toLower()
                    .split(QRegExp("[/\\\\]"), QString::SkipEmptyParts);
            QString processPathWinStd;//转成windows标准的路径
            int listLength = tempPathList.length();
            for (int idx = 0; idx < listLength; ++idx)
            {
                if (idx != 0)
                    processPathWinStd.push_back("\\");
                processPathWinStd.push_back(tempPathList[idx]);
            }
            int ProcessNum = (bytesRet/sizeof(DWORD));
            for (int i = 0, j = 0; i < ProcessNum; ++i)
            {
                hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, dwProcessId[i]);
                if (hProcess)
                {
                    //Do not call CloseHandle on any of the handles returned by this function.
                    //The information comes from a snapshot, so there are no resources to be freed.
                    if (EnumProcessModules(hProcess, hModus, sizeof(hModus), &bytesModuRet))
                    {
                        int ModuleNum = (bytesRet/sizeof(DWORD));
                        for (j = 0; j < ModuleNum; ++j)
                        {
                            if (GetModuleFileNameEx(hProcess, hModus[j], szModuleName, sizeof(szModuleName))
                             && processPathWinStd == QString::fromWCharArray(szModuleName, _tcslen(szModuleName)).toLower())
                            {
                                TerminateProcess(hProcess, 4);
                            }
                        }
                    }
                    CloseHandle(hProcess);
                }
            }
        }
    }

    void Terminate(const DWORD &pID)
    {
        AdjustPrivilege();
        //================TerminateProcess================//根据进程ID强杀
        HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pID);
        if (hProcess)
        {
            TerminateProcess(hProcess, 4);
            CloseHandle(hProcess);
        }
    }

ntdll.dll导出方式:

    const unsigned long SE_DEBUG_PRIVILEGE = 0x14;
    typedef int (__stdcall *fRtlAdjustPrivilege)(ULONG, BOOLEAN, BOOLEAN, PBOOLEAN);
    typedef DWORD (__stdcall *fNtTerminateProcess)(HANDLE, UINT);
    HMODULE hNtDll = NULL;
    fRtlAdjustPrivilege funcAdjustPrivilege = NULL;
    fNtTerminateProcess funcTerminateProcess = NULL;

    //================
    //NtDll方式:
    //================
    bool NtInit()
    {
        hNtDll = LoadLibrary(_T("ntdll.dll"));
        if (!hNtDll)
            return false;
        funcAdjustPrivilege =
                (fRtlAdjustPrivilege)GetProcAddress(hNtDll, "RtlAdjustPrivilege");
        funcTerminateProcess =
                (fNtTerminateProcess)GetProcAddress(hNtDll, "NtTerminateProcess");
        return true;
    }

    void NtFree()
    {
        if (hNtDll)
            FreeLibrary(hNtDll);
    }

    void NtAdjustPrivilege()
    {
        if (funcAdjustPrivilege)
        {
            BOOLEAN oldStatus;
            funcAdjustPrivilege(SE_DEBUG_PRIVILEGE, true, false, &oldStatus);
        }
    }

    void NtTerminate(const QString &processPath)
    {
        NtAdjustPrivilege();
        //================TerminateProcess================//遍历进程列表与进程模块,匹配路径后强杀
        if (funcTerminateProcess)
        {
            DWORD dwProcessId[1024];
            DWORD bytesRet;
            if (EnumProcesses(dwProcessId, sizeof(dwProcessId), &bytesRet))
            {
                HANDLE hProcess = NULL;
                HMODULE hModus[1024];
                DWORD bytesModuRet;
                TCHAR szModuleName[MAX_PATH];
                QStringList tempPathList = processPath.toLower()
                        .split(QRegExp("[/\\\\]"), QString::SkipEmptyParts);
                QString processPathWinStd;//转成windows标准的路径
                int listLength = tempPathList.length();
                for (int idx = 0; idx < listLength; ++idx)
                {
                    if (idx != 0)
                        processPathWinStd.push_back("\\");
                    processPathWinStd.push_back(tempPathList[idx]);
                }
                int ProcessNum = (bytesRet/sizeof(DWORD));
                for (int i = 0, j = 0; i < ProcessNum; ++i)
                {
                    hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, dwProcessId[i]);
                    if (hProcess)
                    {
                        //Do not call CloseHandle on any of the handles returned by this function.
                        //The information comes from a snapshot, so there are no resources to be freed.
                        if (EnumProcessModules(hProcess, hModus, sizeof(hModus), &bytesModuRet))
                        {
                            int ModuleNum = (bytesRet/sizeof(DWORD));
                            for (j = 0; j < ModuleNum; ++j)
                            {
                                if (GetModuleFileNameEx(hProcess, hModus[j], szModuleName, sizeof(szModuleName))
                                 && processPathWinStd == QString::fromWCharArray(szModuleName, _tcslen(szModuleName)).toLower())
                                {
                                    funcTerminateProcess(hProcess, 4);
                                }
                            }
                        }
                        CloseHandle(hProcess);
                    }
                }
            }
        }
    }

    void NtTerminate(const DWORD &pID)
    {
        NtAdjustPrivilege();
        //================TerminateProcess================//根据进程ID强杀
        if (funcTerminateProcess)
        {
            HANDLE hProcess = NULL;
            hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pID);
            if (hProcess)
            {
                funcTerminateProcess(hProcess, 4);
                CloseHandle(hProcess);
            }
        }
    }






  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
⼤数据linux命令 1.vim三种模式 2.vim +⽂件名(修改该⽂件) 3.进⼊编辑模式–i或insert都可以 编辑完成后esc退出编辑模式 :wq-----保存后返回命令⾏ :wq!----强制离开 q!----不保存⽽强制离开 4.vim快捷键 拷贝当前⾏:yy,拷贝当前⾏向下的5⾏:5yy。粘贴:p。【⼀般模式】 删除当前⾏:dd,删除当前⾏向下的5⾏:5dd 【⼀般模式】 在⽂件中查找某个单词 【命令模式下:/关键字,回车查找,输⼊n就是查找下⼀个】 编辑/etc/profile⽂件,使⽤快捷键到底⽂档的最末⾏[G]和最⾸⾏[gg]【⼀般模式下】 在⼀个⽂件中输⼊"hello",然后⼜撤销这个动作u【⼀般模式下】 5.halt 关机 reboot 重启 sync 把内存的数据同步到磁盘(关机前保存) logout 注销 6.⽤户管理 添加⽤户— useradd -d[指定⽬录] ⽤户名 指定密码----passwd ⽤户名 删除⽤户----userdel 删除⽤户 ⼆。实⽤指令 7.1 ⽂件和⽬录相关的指令 1 pwd 该命令⾏的意思就是print working directory,显⽰当前⼯作⽬录的绝对路径。 2 ls [选项] 显⽰当前⽬录下的⽂件和⽬录 选项: -a :显⽰当前⽬录所有的⽂件和⽬ -l : 以列表的⽅式显⽰信息 -h : 显⽰⽂件⼤⼩时,以 k , m, G 单位显⽰ ⽰例: ls -alh 显⽰当前⽬录的全部⽂件和⽬录 ls -alh /home 显⽰/home⽬录的全部⽂件和⽬录 3 mkdir 该命令⾏的意思就是make directory,新建⼀个⽂件夹(⽬录) ⽰例: 单级⽬录:mkdir ⽬录名 mkdir sharm 创建sharm这个⽂件夹 多级⽬录:mkdir –p ⽬录名 4.touch [⽂件名] [⽂件名] 创建⼀个或者多个空⽂件,如果⽂件存在,则刷新⽂件的修改时间 5.rmdir [空⽬录] 只能删除空⽬录 6.rm -rf [空⽬录或者⾮空⽬录] 7.find [搜索范围][选项] find指令是将从指定⽬录向下递归地遍历其各个⼦⽬录,将满⾜条件的⽂件或者⽬录显⽰在终端。 ⽰例: find /home -name hello.txt 根据⽂件名称查找/home⽬录下的hello.txt⽂件 find /home -user sharm 根据⽂件所有者查找/home⽬录下⽤户名为sharm的⽂件 find /home -size +10M 查找整个linux系统下⼤于10M的⽂件(+n⼤于-n⼩于n等于) 8.locate hello.txt 查找整个Linux系统下hello.txt的位置 9.tar 指令 是打包指令,最后打包后的⽂件是 .tar.gz 的⽂件。该命令可以压缩,也可以解压缩 10.任务调度 crontab 就是定时启动任务 11.配置固定的ip地址 修改该⽂件:vim /etc/sysconfig/network-scripts/ifcfg-eth0 12.修改主机名 13.进程管理 ps -aux:查看当前进程 kill 进程杀死进程 14.rpm和yum包管理器 rpm相当于windows的setup.exe 14.1 rpm –qa 查询已安装的rpm列表 rpm -e firefox 卸载软件包 14.2 yum管理器可以⾃动下载RPM包并安装 15.xsync将⽂件同步到所有虚拟机上 16.hadoop fs 具体命令 是指该命令可以⽤于⽂件系统。 hdfs dfs 具体命令 是指将具体命令专门针对hdfs分布式⽂件系统。 17.-ls: 显⽰⽬录信息 -cat:显⽰⽂件内容 mkdir:创建路径 -rm -r:递归删除⽬录及⽬录⾥⾯内容

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值