C/C++知识点之win驱动下进程操作相关函数
小标 2019-05-31 来源 : 阅读 251 评论 0

摘要:本文主要向大家介C/C++知识点之win驱动下进程操作相关函数绍了,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介C/C++知识点之win驱动下进程操作相关函数绍了,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

C/C++知识点之win驱动下进程操作相关函数

1。先要声名一些函数(已经导出)


// 1. 声明要使函数
NTKERNELAPI NTSTATUS PsSuspendProcess(PEPROCESS pEProcess);
NTKERNELAPI UCHAR* PsGetProcessImageFileName(IN PEPROCESS pEProcess);
NTKERNELAPI NTSTATUS PsResumeProcess(PEPROCESS pEProcess);
NTKERNELAPI HANDLE PsGetProcessInheritedFromUniqueProcessId(IN PEPROCESS pEProcess);



// 根据PID返回进程EPROCESS,失败返回NULL
PEPROCESS LookupProcess(HANDLE hPid)
{
    PEPROCESS pEProcess = NULL;
    if (NT_SUCCESS(PsLookupProcessByProcessId(
        hPid, &pEProcess)))
        return pEProcess;
    return NULL;
}

//挂起进程
BOOLEAN KernelSuspendProcess(ULONG Id)
{
    //1. 先根据ID得到EPORCESS
    PEPROCESS pEProcess;
    if ((pEProcess = LookupProcess((HANDLE)Id) )!= NULL)
    {
        //2. 暂停进程
        if (NT_SUCCESS(PsSuspendProcess(pEProcess)))
            return FALSE;
    }
    return TRUE;

}

//恢复进程
BOOLEAN KernelResumeProcess(ULONG Id)
{
    //1. 先根据ID得到EPORCESS
    PEPROCESS pEProcess;
    if ((pEProcess = LookupProcess((HANDLE)Id)) != NULL)
    {
        //2. 暂停进程
        if (NT_SUCCESS(PsResumeProcess(pEProcess)))
            return FALSE;
    }
    return TRUE;

}

//结束进程
void KernelKillProcess() {
    HANDLE            hProcess = NULL;
    CLIENT_ID         ClientId = { 0 };
    OBJECT_ATTRIBUTES objAttribut =
    { sizeof(OBJECT_ATTRIBUTES) };
    ClientId.UniqueProcess = (HANDLE)1234; // PID
    ClientId.UniqueThread = 0;
    // 打开进程,如果句柄有效,则结束进程
    ZwOpenProcess(
        &hProcess,    // 返回打开后的句柄
        1,            // 访问权限
        &objAttribut, // 对象属性
        &ClientId);   // 进程ID结构
    if (hProcess) {
        ZwTerminateProcess(hProcess, 0);
        ZwClose(hProcess);
    };
}

//遍历进程
VOID EnumProcess() {
    PEPROCESS pEProc = NULL;
    // 循环遍历进程(假设线程的最大值不超过0x25600)
    ULONG i = 0;
    for (i = 4; i<0x25600; i = i + 4) {
        // a.根据PID返回PEPROCESS
        pEProc = LookupProcess((HANDLE)i);
        if (!pEProc) continue;
        // b. 打印进程信息
        DbgPrint("EPROCESS=%p PID=%ld PPID=%ld Name=%s\n",
            pEProc, (UINT32)PsGetProcessId(pEProc),
            (UINT32)PsGetProcessInheritedFromUniqueProcessId(pEProc),
            PsGetProcessImageFileName(pEProc));
        // c. 将进程对象引用计数减1
        ObDereferenceObject(pEProc);
        DbgPrint("\n");
    }
}


注意这里不是那种普通的通过链遍历得到的。因为有可能故意断链。这里通过暴力的遍历(同时进程id都是偶数)

   

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:13167058313
小职老师的微信号:13167058313

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    ICP许可  沪B2-20190160

站长统计