终止进程的内幕

金融科技数据源 数字金融开放研究平台 阅读详情

pjf(jfpan20000@sina.com)

    有来信询问进程结束的有关问题,下面就这个问题简单讨论一下(下面的讨论基于2000,其他NT系统也类似)。
    首先看看一个应用程序想要强制结束另一个进程所要做的事:首先获得目标的进程ID,接着利用OpenProcess获取进程句柄(确保足够权限),最后将句柄传给TerminateProcess了结那个进程。
    1、OpenProcess通过本机系统服务接口进入核心态,随后调用ntoskrnl的NtOpenProcess。在服务函数里,系统使用SeSinglePrivilegeCheck检查调用者是否有DEBUG权限(SeDebugPrivilege),若有,则修改AccessState使得在后面的操作中获取允许任意进程访问操作的句柄。最后通过ObOpenObjectByName或PsLookupProcess*** + ObOpenObjectByPointer来打开进程(创建并返回进程句柄)。
    2、TerminateProcess通过本机系统服务接口进入核心态,随后调用ntoskrnl的NtTerminateProcess。系统首先调用ObReferenceObjectByHandle获取进程执行体块,执行体块的DebugPort指出进程是否处于调试状态,若处于调试状态且传入的ExitStatus为DBG_TERMINATE_PROCESS则返回失败禁止结束进程。随后服务函数转入正题:
    系统利用ThreadListHead枚举进程的每一个线程,使用PspTerminateThreadByPointer来结束它们。注意并不是对每个线程系统都会忠实地执行你的命令:若枚举到的线程是系统线程则不会继续执行而是返回STATUS_INVALID_PARAMETER。判断的方法是线程的Teb为零或者Teb的值在内核地址空间。有人问2000下为何csrss.exe进程杀不死,很简单,打开IceSword,在进程栏利用右键菜单的“线程信息”看一下,看到那几个Teb为零的线程没有?(注意是针对windows2000,XP下不同。另外一点就是csrss中其它非系统线程的线程是很容易被杀死的,试图结束csrss时也可以看到在Teb为零的线程前面的线程已被杀掉,只是操作停在了Teb为零的线程这里) 再看看system进程,呵呵。IceSword也并未提供杀除这种进程的功能,因为觉得没有需求。在最后一个线程结束时,进程的生命也结束了,随着PspExitProcess/ObKillProcess灰飞烟灭。
    另一方面,线程是怎样结束的呢。PspTerminateThreadByPointer并不是直接“杀掉”指定线程,实质上线程是“自杀”的,呵呵。系统简单的使用KeInitializeApc/KeInsertQueueApc插入了一个核心态的APC调用,若是用户线程,会再插入用户态的APC调用,最终线程在自己的执行环境中使用PspExitThread(...=>KeTerminateThread=>KiSwapThread)悲壮的自行了断。
    有人问起为什么IceSword有时杀不死除那三个有系统线程的进程(两个是csrss、system,而idle是个非常奇特的存在,与众不同,这里不多废话了)外的其它进程。从上面的讨论可以找到答案。这种情况往往是目标进程的某用户态线程进入核心态后,系统出了某些问题挂死在核心态,无法返回执行Apc例程的缘故。IceSword未强制除去它们是考虑此刻系统可能已经有某些问题,强制删除操作更有可能使系统崩溃,不过有了不少用户要求有这项功能,所以以后有空可能会加上(已经有一大堆杂七杂八的要求了,很难有时间升级一下版本,~_~)。
    一般来说,要干掉一个进程,有了Debug权限就可以了,若别人有了保护,那就要发挥你的能力了。

ARM双核锁步DCLS Lockstep技术研究(FPGA实现) 基于《Applying Dual-Core Lockstep in Embedded Processors to Mitigate Radiation-induced Soft Errors》文章总结 RISC-V双核锁步DCLS Lockstep技术参考之前文章: RISC-V双核锁步DCLS Lockstep技术总结_远古架构师alanwu的博客-优快云博客https://blog.youkuaiyun.com/heyuming20062007/article/details/123329537ARM+RIS 阅读详情

相关推荐

lighttools用透镜旋转手动创建菲尼尔透镜

学过很多软件,都没有留下痕迹,很多年之后只记得学过的软件常用的一些功能,稍微难一些的再次用起需要重新学,但如果留下点痕迹,重新再用就会很快。lighttools无意之中接触了,记一点点笔记吧。...

kingsai2012的博客 4334

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

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

微软技术分享 1万+

httprunner V4.3.5 安装与使用--快速上手(超详细-超长篇)

HttpRunner是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份 YAML/JSON 脚本,即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求。继承 Requests 的全部特性,轻松实现 HTTP(S) 的各种测试需求测试用例与代码分离,采用YAML/JSON的形式描述测试场景,保障测试用例具备可维护性测试用例支持分层机制,充分实现测试用例的复用测试用例支持参数化和数据驱动机制使用 skip 机制实现对测试用例的分组执行控制。

Dreams°的博客 3893

使用 PspTerminateThreadByPointer 强制结束进程

实现过程 我们知道,线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。 也就是说,当一个进程中的所有线程都被结束的时候,这个进程也就没有了存在的意义,也随之结束了。这,便是我们本文介绍的这种强制杀进程的实现原理,即把进程中的线程都杀掉,从而让进程消亡,实现间接杀进程的效果。 Windows

LYSM 2468

矩形口径喇叭天线设计——参数设置

我们建立好矩形口径喇叭天线的模型后(模型建立可参考B站相关视频或者李明洋的《HFSS天线设计》),如何修改参数达到我们的指标呢?

m0_57263863的博客 1万+

RK3588多路MIPI摄像头采集与WiFi低延迟传输实战指南

本文详细介绍了基于RK3588平台实现多路MIPI摄像头同步采集并通过WiFi进行低延迟传输的完整实战方案。文章深入剖析了从V4L2驱动配置、多线程采集、环形缓冲区设计到UDP网络传输优化的核心技术,旨在帮助开发者在工业检测、智能安防等场景下构建高并发、高实时性的视频流系统,实现端到端延迟控制在100毫秒以内的目标。

tensor9flow的博客 788

Out of memory: Kill process 解决

Linux有一个特性:OOM Killer,一个保护机制,用于避免在内存不足的时候不至于出现严重问题,把一些无关的进程优先杀掉,即在内存严重不足时,系统为了继续运转,内核会挑选一个进程,将其杀掉,以释放内存,缓解内存不足情况,不过这种保护是有限的,不能完全的保护进程的运行。 在很多情况下,经常会看到还有剩余内存时,oom-killer依旧把进程杀死了,现象是在/var/log/messages日...

pansaky的博客 3万+

实战!在 AMD RX 9070 XT (16G) 上使用原生 Windows ROCm 7.1 部署 ComfyUI + Z-Image-Turbo

本文详细介绍了如何在Windows系统下为AMD Radeon RX 9070 XT显卡配置Z-Image-Turbo AI绘图环境。主要内容包括:安装VS Build Tools和最新显卡驱动,配置Conda Python 3.12环境,安装ROCm 7.1.1 SDK及PyTorch适配版本,部署ComfyUI可视化界面。重点解决了AMD显卡在AI绘图中的适配问题,通过--use-split-cross-attention参数优化显存使用,最终成功搭建了可在消费级16G显存设备上运行的AI绘图环境

qq_33614778的博客 4701

使用PsTerminateThreadByPointer强制结束进程

该函数会在内部检查是否是系统线程,如果是系统线程不会结束它. #include<ntifs.h> #include <ntddk.h> //根据进程结构获得进程名指针 需要自己申明一下。 ULONG64 g_kernelModuleBase = 0; typedef struct _LDR_DATA_TABLE_ENTRY { LIST_ENTRY InLoadOrderLinks; LIST_ENTRY InMemoryOrderLinks; LIST_ENTRY I

qq_41490873的博客 659

基于深度学习DNN LSTM网络的光伏发电量预测 完整代码数据 可直接运行

基于深度学习DNN LSTM网络的光伏发电量预测 完整代码数据 可直接运行

2079

反光柱定位算法中的移动机器人姿态计算原理-经典三边定位最小二乘法计算定位-直接法计算定位

(二)计算姿态方式是我们已经通过最小二乘得到了小车在地图中的位置或者是雷达在地图中的位置,又因为我们知道雷达与小车的安装坐标,所以可以求解出一其中一个坐标的知量,通过小车在地图中坐标与雷达在地图中坐标可以得到一条向量,通过计算向量在地图中的角度就能得到姿态了。与最小二乘三边测量法相比,新算法在动态调整、优化过程和鲁棒性方面优势明显,尤其适合动态环境下的机器人定位,而最小二乘三边测量法在动态复杂环境中精度相对较低。(一)与(二)的区别主要是在计算姿态上的算法不同。经典三边定位最小二乘法 (法一)

苏凯的博客 1141

【进程内幕】进程终止:进程退出和信号的响应机制

本文探讨了进程终止的三种场景:正常完成、错误完成和异常终止。重点介绍了退出码机制(通过main函数返回值判断进程状态)、errno变量(记录库函数调用失败信息)以及异常信号的产生方式。文章对比了exit()和_exit()系统调用的区别,指出exit()会在调用_exit()前刷新缓冲区,而_exit()直接终止进程。最后强调了异常终止时退出码无意义,以及父进程通过进程等待获取子进程状态的重要性。

2401_87944878的博客 1299

常用元器件使用方法13:物理层接口芯片DP83848的使用方法

介绍: DP83848是以太网物理层接口芯片,具有多种型号,从便于焊接角度考虑LQFP-48封装较为合适,采用LQFP-48封装的芯片,有2种型号,分别为DP83848I和DP83848C,如下图所示。 其主要区别是使用温度不同,如下图所示。 这2种芯片芯片网上均有销售,按理说DP83848C价格应该更加便宜,实际不然,DP83848I的价格低于DP83848C,考虑或与芯片的出货量...

snmplink的博客 1万+

进程终止内幕

<br />有来信询问进程结束的有关问题,下面就这个问题简单讨论一下(下面的讨论基于2000,其他NT系统也类似)。<br />首先看看一个应用程序想要强制结束另一个进程所要做的事:首先获得目标的进程ID,接着利用OpenProcess获取进程句柄(确保足够权限),最后将句柄传给TerminateProcess了结那个进程。<br />1、OpenProcess通过本机系统服务接口进入核心态,随后调用ntoskrnl的NtOpenProcess。在服务函数里,系统使用SeSinglePrivilegeChe

Sunny_wwc的专栏 889

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

终止进程的内幕<转载>

pjf(jfpan20000@sina.com)  有来信询问进程结束的有关问题,下面就这个问题简单讨论一下(下面的讨论基于2000,其他NT系统也类似)。  首先看看一个应用程序想要强制结束另一个进程所要做的事:首先获得目标的进程ID,接着利用OpenProcess获取进程句柄(确保足够权限),最后将句柄传给TerminateProcess了结那个进程。  1、OpenProcess通过本...

weixin_34327761的博客 369

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

多线程 -- 线程基础

进程与线程 理解线程是至关重要的,每个进程至少有一个线程,进程是线程的容器,线程才是真正的执行体,线程必然在某个进程的上下文中运行。进程拥有惰性,如果进程中所有的线程都已结束,那么进程也就没有存在的必要了。 一个进程由如下两部分组成:1、一个进程地址空间;2、一个进程内核对象 一个线程由如下两部分组成:1、一个线程栈;2、一个线程内核对象 线程的开销要比进程少很多,所以在解

tkp2014的专栏 488

【windows核心编程】 第六章 线程基础

Windows核心编程 第六章 线程基础 欢迎转载 转载请注明出处:http://www.cnblogs.com/cuish/p/3145214.html 1、 线程的组成 ① 一个是线程的内核对象,操作系统用它管理线程。系统还用内核对象来存储线程统计信息 ② 一个线程栈,用于维护线程执行时所需的所有函数参数和局部变量。 线程 == 内核对象 + 线程栈;...

weixin_30912051的博客 184

【note】进程结束内幕

下午抽空看了PspTerminateProcess NTerminateProcess的实现。。。也更加理解了进程是个容器。。。线程是执行体的概念。。。。 note下流程: 在内部的调用流程 : psPTerninateProcess 1. 通过Eprocess得到 Ethread的列表 。。 2. 通过循环依次结束每个线程。。。调用PspTerminateThreadByPoin...

weixin_33742618的博客 145

【进程内幕】进程的状态:从创建到消亡的“生命百态”

本文介绍了操作系统中的进程状态管理。主要内容包括:运行状态进程在运行队列中排队执行,通过时间片轮转保证公平;阻塞状态进程因I/O等操作暂停,存放于外设等待队列;挂起状态是内存不足时将阻塞进程数据置换到磁盘。Linux系统详细定义了7种进程状态:R运行、S浅度睡眠、D深度睡眠、T/t暂停、X终止、Z僵尸状态,其中D状态确保磁盘操作安全,Z状态需父进程回收避免内存泄漏。文章还解析了孤儿进程的处理机制和僵尸进程的危害。

2401_87944878的博客 2178

一个如何终止系统进程的问题

<!--google_ad_client = "pub-7325395580237867";

sanshao27的专栏 1671

PostgreSQL内幕探索—进程与内存结构

本篇介绍PostgreSQL(以下简称PG)的主要进程和内存结构

t384061961的博客 1080

【进程内幕】进程等待:必要性剖析与wait、waitpid等多种方式实操指南

本文介绍了Linux系统中的进程等待机制,重点分析了wait()和waitpid()系统调用的使用与原理。进程等待的主要作用包括:回收僵尸进程防止内存泄漏、获取子进程的退出状态信息、确保父进程正确释放资源。文章详细解析了status参数的底层实现方式,通过32位整型的不同比特位存储进程退出状态和异常信息。waitpid()相比wait()增加了指定子进程PID和非阻塞轮询功能,使父进程可以灵活处理等待过程。通过代码演示和原理分析,阐明了进程等待在Linux进程管理中的重要性及其实现机制。

2401_87944878的博客 1328
上一篇: 在ring0调用Ring3的代码
下一篇: 对抗packer-AntiMida 1.0
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值