结束进程的几种方法

进程强杀探究 前言 我们知道在windows操作系统里面有ring0跟ring3的概念(ring1、ring2在windows中并未使用),因为ring0的特权级别是比ring3高的,那么我们肯定不能在ring3调用windows提供的api杀死ring0特权级别的进程,那么这时候我们就需要使用的ring0的函数来强行结束一些处于ring0级别的进程。 测试 我们首先打开PCHunter32.exe看一下,应用层是不能够访问的,我们知道可以在cmd里面使用taskkill命令来结束进程,但这种方式对ring0特权级别的程 阅读详情

 释放驱动HOOK了SSDT表中的NtOpenProcess,但是对参数过滤不严密,只过滤   PROCESS_TERMINATE, PROCESS_WRITE, XXXX(忘记了),,三种.然后比较的PID是放在全局变量中,可以通过发送 DeviceIoControl 改变这个值~

所以我们还是可以以其他的参数打开这个进程的(只要不含有那三个参数)~

不过大家似乎都不感兴趣这个题目,于是代码就不放了,想要可以直接给我消息.顺便要求刀客公开他的方法~~


1.使用 FindWindow 的方法,然后想窗口发送 WM_CLOSE 的消息

2.找到进程的线程, PostThreadMessage 发送 WM_QUIT 消息结束主线程

3.OpenThread ---> TerminateThread

4.RemoteExitProcess,以 PROCESS_CREATE_THREAD|VM_OPERATION方式打开进程,然后创建个远程线程,线程开始地址是 ExitProcess 参数0 ,程序自行了断.

5.首先确保进程能被打开(8和9介绍),然后创建一个线程去 DebugActiveProcess 他,然后什么也不做退出线程,程序无人接管,于是挂掉~

6.以 VM_OPERATION方式打开进程, 然后调用 NtUnmapViewOfSection 卸载掉他的ntdll.dll 这个时候程序还未崩溃,然后再随意发送个消息给它,它的程序一经调用直接就会异常,但是ntdll已经挂掉,无法用户空间异常处理,自行了断~(我认为这个方法应和往进程空间写垃圾数据属于同一方法)

7.发送键盘 ESC 单击的消息(这个和发送窗口消息不能算同一个的).

8.下面是重点要介绍的:-----------------------------
由于CrackMeApp打开了驱动的文件句柄,所以直接不能卸载驱动的.因此需要把这个句柄给关闭.
于是怎么去获取远程的文件句柄呢?首先想到的是 DuplicateHandle ,
BOOL DuplicateHandle(
   HANDLE hSourceProcessHandle,   // handle to source process
   HANDLE hSourceHandle,       // handle to duplicate
   HANDLE hTargetProcessHandle,   // handle to target process
   LPHANDLE lpTargetHandle,    // duplicate handle
   DWORD dwDesiredAccess,        // requested access
   BOOL bInheritHandle,       // handle inheritance option
   DWORD dwOptions             // optional actions
);

先看最后一个参数:
DUPLICATE_CLOSE_SOURCE
Closes the source handle. This occurs regardless of any error status returned.
DUPLICATE_SAME_ACCESS
Ignores the dwDesiredAccess parameter. The duplicate handle has the same access as the source handle.

也就是说当我们选择DUPLICATE_CLOSE_SOURCE时,远程的句柄就会自动关闭了

第一个参数,我们可以直接OpenProcess(PROCESS_DUP_HANDLE ,XXX)获得,
第二个参数比较难找,就是CrackMeApp进程里打开驱动的句柄,要想获得这个我们得借助个ntdll.dll中的一个 API, ZwQuerySystemInformation 这个可以获得整个系统中所有的句柄信息,我们可以全部找出来,然后判断哪些句柄是属于 CrackMeApp进程的,并且ObjectTypeNumber类型为文件类型的.关于这个的具体实现可以看我的实现代码.

typedef struct _SYSTEM_HANDLE_INFORMATION { // Information Class 16
   ULONG ProcessId;
   UCHAR ObjectTypeNumber;
   UCHAR Flags;   // 0x01 = PROTECT_FROM_CLOSE, 0x02 = INHERIT
   USHORT Handle;
   PVOID Object;
   ACCESS_MASK GrantedAccess;
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;

这样CrackMeApp进程中通过CreateFile打开的句柄就全找到了,一般有三个,我们可以把它全部都关闭,也可以只关闭最后一个(因为最后就是打开驱动的句柄,打开驱动是最后一次调用CreateFile).


这个我就得到了第二个参数,下面的参数都很简单了~

于是一调用这个 DuplicateHandle ,我们不仅关闭了远程的句柄,而且还获得了驱动的句柄,为所欲为了~~

于是我的第8个方法就是发送IO请求到CrackMeApp的驱动里,请求它修改被保护的进程PID为0,这样我们就可以用常规方法结束它了(Open+Terminate)

9.上面方法的远程句柄关闭了,我们就自然可以去卸载驱动了~于是这个就是去 ZwUnloadDriver或者停止了它的Service.这样再用常规方法结束~~

10.所有的win32子系统的进程都会有一个句柄在csrss.exe进程里面,CrackMeApp.exe自然也在,于是我们就可以把 csrss.exe 里面的句柄给 dup 过来自己使用,DUP过来的方法大致和上面相同,不过判断的进程该为csrss,类型要该为5(进程句柄的类型),然后呢对每个进程句柄做一个ZwQueryInformationProcess() 参数为 BASIC_INFORMATION=0 的查询,看看这个句柄是不是CrackMeApp的 ,如果是就直接拿来用,TerminateProcess之~

---------------以下是用借助驱动来结束的-----------

11.用驱动patch了它的保护的PID值,然后用户空间里常规方法~

12.用驱动恢复SSDT中ZwOpenProcess,这里我偷懒直接硬编码,调用那个驱动自身的恢复SSDT的函数,嘿嘿~~之后用户空间里常规方法(这个和11不算一种的)

13.直接在驱动里调用 NtOpenProcess绕过它的SSDT HOOK就可以了,不过应该注意的是需要先把 KTHREAD 结构体里的 PreviousMode 值改为KernelMode,否则有可能会失败的~
获取句柄后调用ZwTerminateProcess,这个不需要修改PreviousMode,直接用就可以~

14.和13的方法不同的是打开句柄的方法,使用了 PsLookupProcessByProcessId+ObOpenObjectByPointer的方法,然后还是调用 ZwTerminateProcess~(这个也要算不同的,,因为规则上曾经说过ObXXX和NtXX算不同的API的)

15.最后一种了,首先获取CrackMeApp线程的TID,然后根据 PsLookupThreadByThreadId 获取 EThread 指针,然后向这个线程插入APC调用,在APC过程函数中,主要是执行的 ZwTerminateProcess( 0xffffffff, 0 );这个东西就是结束自己的意思(嘿嘿,,这个方法是我从IceSword里面抠出来的)~~本来想去调用Nt/ZwTerminateThread,结果那个函数没导出还得自己找,于是索性就简单点ZwTerminateProcess了.

我的方法都较普通,跟你差不多
驱动中只用了4种方法
方法11:
在驱动中NtOpenProcess取得句柄, 然后在驱动中TerminateProcess

方法12:
PsLookupProcessByProcessId取得Process,然后切换到进程空间,最后
ZwTerminateProcess(NULL, 0);

方法13:
通过ObOpenObjectByPointer获取句柄,然后Terminate

方法14:
恢复SSDT(ZwOpenProcess),然后在应用层直接OpenProcess并Terminate

运放+三极管恒流源电路设计实战:从原理到仿真一步到位(附Multisim文件) 本文详细解析了运放与三极管构建恒流源电路的核心原理,重点阐述了负反馈机制如何实现精准的电流控制。通过Multisim仿真实战,从电路搭建、参数计算到负载调整率与动态响应分析,一步步指导设计过程,并提供常见故障的调试技巧与PCB设计要点,帮助工程师从理论平稳过渡到可靠实践。 阅读详情

相关推荐

【Bug已解决】Codex CLI 报错 apply_patch 失败:无法应用补丁的解决方案

方案适用场景推荐指数统一换行符规范跨平台协作项目的标准配置⭐⭐⭐⭐⭐关闭自动格式化冲突IDE 与 Codex 并发编辑同一文件⭐⭐⭐⭐缩小任务改动范围长期有效的使用习惯优化⭐⭐⭐⭐⭐统一 UTF-8 编码涉及非 UTF-8 遗留文件的项目⭐⭐⭐提示重新读取文件单次失败后的快速恢复方式⭐⭐⭐⭐报错的本质是Codex 生成补丁时读取的文件内容,与实际应用补丁时磁盘上的文件内容出现了不一致,常见诱因包括换行符风格混用、文件被其他工具并发修改、编码问题等。

一键难忘的博客 6813

错误模块名称: ntdll.dll 导致SQLSERVER服务停止

根据系统日志提示:错误模块名称: ntdll.dll,C:Windows\SYSTEM32\ntdll.dll 造成错误,操作系统的这个动态链接库出现问题。根据网上查找的资料分析,如果这个 ntdll.dll 没问题,那就是系统里面某些其他的 dll 损坏了。解决办法:ntdll.dll模块出问题,或者其他dll 损坏,单纯解决这些dll 文件,未必能根本上解决我呢提。建议将数据库文件备份,服务器中其他重要文件备份,重新安装数据服务器系统。有可能是 windows update 出错或者宕机造成的。

qq1507171150的博客 1373

TIA PORTAL V17硬件支持包HSP(2025.04最新)

TIA PORTAL是西门子公司推出的一款集成了多种功能的自动化工程软件平台,V17版本的硬件支持包更新至2025年4月的最新版本,意味着其中包含了该时间点之前所有兼容硬件设备的支持文件、驱动程序以及相关固件等重要资料,有助于确保硬件与TIA PORTAL软件之间的正常通信和高效协作。;适合人群:从事工业自动化领域工作的工程师或技术人员,尤其是那些正在使用或者计划使用TIA PORTAL V17进行项目开发、维护的人士。;使用场景及目标:①当需要将新的硬件设备接入到基于TIA PORTAL V17构建的系统时,可以利用此硬件支持包来安装相应的驱动程序和支持文件;②对于已经存在的项目,若遇到硬件兼容性问题,也可以尝试更新硬件支持包以解决这些问题。;

内核级结束进程c代码

  #include     #include     #include    #include     #pragma comment (lib,"ntdll.lib")    // Copy From DDK    #pragma comment (lib,"Kernel32.lib")    #pragma comment (lib,"Advapi32.l

xinew的专栏 2328

NtTerminateProcess 终止进程

用NtTerminateProcess真正终止进程. 首先,要使用Native API,要对它进行声名: typedef DWORD (CALLBACK* NTTERMINATEPROCESS)(HANDLE,UINT);NTTERMINATEPROCESS NtTerminateProcess;HMODULE hNtdll = NULL; hNtdll = LoadLibrary( "...

weixin_30699235的博客 1082

进程方法大全

Windows下杀进程22种方法: '1.结束进程 (参数:进程ID) Sub KillProcess(ByVal dwProcessId As Long) SetDebug '提权 Dim hProcess As Long '方法1,使用普通API hProcess = OpenProcess(PROCESS_TE...

zzmzzff的博客 3530

Android结束进程几种方法

结束进程几种方法

kakakk_k的博客 8705

Android 结束进程几种方法

转自:http://www.cnblogs.com/sunjialiang/articles/2132410.html   第一种方法: 主要适合api Level   ActivityManager am = (ActivityManager)getSystemService(ACTIVITY_SERVICE); am.restartPackage("com.andro

Hknock的专栏 3253

C# 结束进程或程序的几种方法

正常情况下不需要为C#的程序写结束语句的。除非在特殊情情下才需要强制退出程序,像程序开了几个互不隶属的窗口,或是创建了几个线程。但一般也不推荐强制终止,容易引发不可预测的错误。 这里有几种方法可以实现: Application.Exit()是比较彻底的终止,会结束当前的进程,但也只结束当前的进程。 this.close()是关闭语句所在的窗口。进程有可能没有结束,当然如果程序只有一个窗口的话...

weixin_30832143的博客 826

QTP 结束进程几种方法

1. Function KillProcess(ProcessName) strComputer = "." Set objWMIService = GetObject("winmgmts://" & strComputer & "/root/cimv2") Set colProcessList = objWMIService.ExecQuery("Select * from Win32_

软件自动化测试专栏 3313

用系统命令结束可疑进程几种方法

教大家不使用任何进程管理工具,只使用系统命令来结束可疑进程几种方法。 一、用强大的ntsd命令,ntsd命令可用来结束一些常规情况下结束不了的进程。 首先要查看可疑进程的pid值,这个可以在windows任务管理器中查看到,也可以使用CMD下的tasklist命令或wmic下的process list brief命令进行查看。假如可疑进程的pid值是666和888,可疑进程或病毒进程

The_IT_Crowd的专栏 1668

java安卓结束进程_Android 杀死进程几种方法详细介绍

Android 杀死进程:对于进程结束在开发APP应用当中还是有必要的,这里整理了三种方法,大家可以根据需求选用。当应用不再使用时,通常需要关闭应用,可以使用以下三种方法关闭android应用:第一种方法:首先获取当前进程的id,然后杀死该进程。android.os.Process.killProcess(android.os.Process.myPid())接下来实践一下:xmlns:tools...

weixin_29924309的博客 844

如何保护进程 不被结束_如何保护隐私,Windows中你可能不知道的几种方法

如何保护隐私,Windows中你可能不知道的几种方法 7SIZE丨部分插图内容来自于网络侵权删随着电脑的普及,我们越来越习惯于将自己的文件、照片等资料放到电脑中存储,但是隐私是一个必须要考虑的问题。因为这些文件中,往往有某些东西是不想让别人看到的,也是不能共享的。而这个时候可能会有同学或者亲友要借用你的电脑,不借不合适,借给他们的话又担心自己电脑里的小秘密被发现,那么怎么办呢?没错,加密!本期,小...

weixin_39568172的博客 1968

【转】利用NtProtectVirtualMemory结束进程

标题:【原创】利用NtProtectVirtualMemory结束进程 作者:KiDebug 时间:2011-07-13,09:37:08 链接:http://bbs.pediy.com/showthread.php?t=137067 原理很简单,用PROCESS_VM_OPERATION打开目标进程(没必要PROCESS_ALL...

1646

浅析360在系统的进程自保护及突破

自从改行玩硬件后,就很少关注病毒和反病毒之间的斗争了。某天在中关村论坛听到一 名网友说 360在WIN64 上有了进程自我保护,万分牛逼,连微软的Process Explorer都不 能结束呢!我听后心里十分好奇,于是重操旧业,下载了最新版本的360 安全卫士7.7版本 (2011-5-6),安装在64位 Windows 7虚拟机上来测试。 首先拿“任务管理器”...

weixin_33728708的博客 756

windbg内核模式调试用户态程序

使用内核调试会话也可以执行一些用户态调试任务,比如向位于用户态的模块设置断点。但这样做与使用用户态调试器有什么不同呢?我们就以向NTDLL.dll模块的ZwTerminateProcess函数(Stub)为例谈谈二者的区别。 区别一、在内核调试会话中设置这个断点的“难度”略大些。这是因为NTDLL不属于内核态的模块,所以内核会话通常不会加载这个模块(的符号),因此当执行bp命令时很可能被自动蜕化为bu命令。 0: kd> bp ntdll!ZwTerminateProcess ..

Steven_programe_life的专栏 596

驱动开发:内核强制结束进程运行

内核态,但有时我们不得不想办法结束掉这些特殊的进程,当然某些正常进程在特殊状态下也会无法被正常结束,此时使用驱动前行在内核态将其结束掉就变得很有用了,驱动结束进程有多种方法。存在时则可以看到结束效果,当然这种方式只是在内核层面调用了结束进程函数,其本质上还是正常结束,只是这种方式权限要大一些仅此而已。没有被导出,所以我们需要动态的这个内存地址,然后动态调用即可,这个寻找方法可以总结为以下步骤。第二种方法,其原理就是将进程内的线程全部结束掉从而让进程自动结束,由于。首先是第一种方法结束进程,封装实现。

微软技术分享 1万+

SSDT HookHookZwTerminateProcess)—— 实现任务管理器无法关闭进程

本节的目的是通过驱动程序修改 ntoskrnl.exe 程序的 SSDT 表中的函数地址表,以实现 SSDT Hook 。本次的测试函数为 R3 API 函数 ZwTerminateProcess ,通过 Hook 该函数,以实现任务管理器无法强制关闭进程,只有通过进程关闭方法才可以正常结束进程Hook 该函数的关键是判断 ZwTerminateProcess 函数中的进程句柄 hProcess 。当进程是通过自身的关闭方法关闭的话,该句柄的值应为 0xffffffff 或 0x00 ,而通过其他进

walker的博客 794

KeStackAttachProcess+ZwTerminateProcess结束进程的分析

某些ARK会用以下代码来结束进程,对于很多有进程保护的程序都很有效:  PsLookupProcessByProcessId(); KeStackAttachProcess(); ZwTerminateProcess(0,0); 注意ZwTerminateProcess函数的第一个参数,这是要结束进程的句柄。对于进程句柄来说,-1表示当前进程,而在这里为什么用0呢?我们来分析下

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 6839
上一篇: Win32Asm教程
下一篇: C# 中运用函数指针
ttzyanswer
博客等级 码龄19年 71粉丝 18原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值