• Win64 驱动内核编程-26.强制结束进程


    强制结束进程

        依然已经走到驱动这一层了,那么通常结束掉一个进程不是什么难的事情。同时因为win64 位的各种保护,导致大家慢慢的已经不敢HOOK了,当然这指的是产品。作为学习和破解的话当然可以尝试各种hook。目前来说很多杀软进程保护都是通过回调了保护的,简单,稳定,安全。So,强制结束进程会比当年简单很多。

    首先就是上一个最基本的驱动里结束进程的方法:

     

    1.直接调用ZwTerminateProcess去结束进程,这个是公开导出的函数,也就是说它很稳定。不要小看这个东西,我测试过很多杀软。目前停不掉的只有国外的 某伞,可能有人会关心国内的各种卫士能不能停掉!我觉得可以尝试一下,通常不会失望。OK不废话,上代码:

    TerminateProcess ->NtTerminateProcess ->ZwTerminateProcess
    
    void ZwKillProcess(HANDLE hdPid)
    {
    __try {
        HANDLE hProcess = NULL;
        CLIENT_ID ClientId = {0};
        OBJECT_ATTRIBUTES oa = {0};
        ClientId.UniqueProcess = (HANDLE)hdPid; 
        ClientId.UniqueThread = 0;
        oa.Length = sizeof(oa);
        oa.RootDirectory = 0;
        oa.ObjectName = 0;
        oa.Attributes = 0;
        oa.SecurityDescriptor = 0;
        oa.SecurityQualityOfService = 0;
        ZwOpenProcess(&hProcess, 1, &oa, &ClientId);
        if (hProcess)
        {
            ZwTerminateProcess(hProcess, 0);
            ZwClose(hProcess);
        };
      }
      __except (EXCEPTION_EXECUTE_HANDLER)
     {;}}
    

    2.方法2就是通过PsTerminateSystemThread找到PspTerminateThreadByPointer

     

    下面是Win7 64 双机调试 windbg获取的信息


        然后要找到Win7 64PspTerminateThreadByPointer结构(注意下面的是win7 64每个系统要单独去找):

    typedef NTSTATUS (__fastcall *PSPTERMINATETHREADBYPOINTER)
    (
    IN PETHREAD Thread,
    IN NTSTATUS ExitStatus,
    IN BOOLEAN DirectTerminate
    );

        然后就是定位一个特征码,从PsTerminateSystemThread开始往下找,直接把学习资料的代码拿过来吧,作者是定位了01e8也就是两条汇编指令相关的部分。然后自定义了一个计算公式hash这个特征码,代码如下(这个地方不固定,定位的越长,越准确):

    if(PspTerminateThreadByPointer==NULL)
    {
    	AddressOfPsTST=(ULONG64)GetFunctionAddr(L"PsTerminateSystemThread");
    	if(AddressOfPsTST==0)
    		return STATUS_UNSUCCESSFUL;
    	for(i=1;i<0xff;i++)
    	{
    		if(MmIsAddressValid((PVOID)(AddressOfPsTST+i))!=FALSE)
    		{
    		if(*(BYTE*)(AddressOfPsTST+i)==0x01&&*(BYTE*)(AddressOfPsTST+i+1)==0xe8) //目标地址-原始地址-5=机器码 ==> 目标地址=机器码+5+原始地址
    			{
    				RtlMoveMemory(&callcode,(PVOID)(AddressOfPsTST+i+2),4);
    				AddressOfPspTTBP=(ULONG64)callcode + 5 + AddressOfPsTST+i+1;
    			}
    		}
    	}
    PspTerminateThreadByPointer=(PSPTERMINATETHREADBYPOINTER)AddressOfPspTTBP;
    	}

        找到函数位置之后,剩下的可以直接枚举线程id,找到进程id,通过进程id进行对比之后决定是否结束掉这个线程。

    for(i=4;i<0x40000;i+=4)
    {
        status=PsLookupThreadByThreadId((HANDLE)i, &Thread);
        if(NT_SUCCESS(status))
        {
        tProcess=IoThreadToProcess(Thread);
        if(tProcess==Process)
        PspTerminateThreadByPointer(Thread,0,1);
        ObDereferenceObject(Thread);
        }
    }

    3.第三种方式就是强行切到对方内存里,然后直接 进程虚拟内存擦除(这个自己也会退出,但是可以继续打开新进程链接服务干活,或者擦除的时候就直接启动一个擦除进程):

    BOOLEAN ZeroKill(ULONG PID)   //X32  X64
    {
        NTSTATUS ntStatus = STATUS_SUCCESS;
        int i = 0;
        PVOID handle;
        PEPROCESS Eprocess;
        ntStatus = PsLookupProcessByProcessId(PID, &Eprocess);
        if (NT_SUCCESS(ntStatus))
        {
        PKAPC_STATEpKs=(PKAPC_STATE)ExAllocatePool(NonPagedPool, sizeof(PKAPC_STATE));
        KeStackAttachProcess(Eprocess , pKs);//Attach进程虚拟空间
        for (i = 0; i <= 0x7fffffff; i += 0x1000)
        {
        if (MmIsAddressValid((PVOID)i))
            {
                _try
               {
                  ProbeForWrite((PVOID)i,0x1000,sizeof(ULONG));
                  memset((PVOID)i,0xcc,0x1000);
               }_except(1){continue;}
         }else{
          if (i>0x1000000)  //填这么多足够破坏进程数据了  
             break;
          }
       }
        KeUnstackDetachProcess(pKs);
        if (ObOpenObjectByPointer((PVOID)Eprocess, 0, NULL, 0, NULL, KernelMode, &handle) != STATUS_SUCCESS)
            return FALSE;
        ZwTerminateProcess((HANDLE)handle, STATUS_SUCCESS);
        ZwClose((HANDLE)handle);
        return TRUE;
        }
        return FALSE;
    }


  • 相关阅读:
    github 生成配置ssh 秘钥方法详解
    记录1linux系统之创建用户,用户登录,查看用户名,切换用户登录,退出登录
    postman笔记1postman插件安装教程
    jmeter安装配置教程
    dos命令 创建数据库,建表,两表联查,三表联查(mysql第一篇)
    从本地上传项目到 github 以及从github 下载项目到本地环境
    python json.dumps()函数输出json格式,使用ensure_ascii参数对中文输入的支持
    fiddler笔记1fiddler的安装 和 证书安装 以及 证书导出失败问题解决
    记录1python+linux+vim之while循环语句使用
    fiddler笔记2fiddler工具界面的功能使用与介绍
  • 原文地址:https://www.cnblogs.com/csnd/p/12061992.html
Copyright © 2020-2023  润新知