驱动 -- 强制结束进程 -- 整理
有一阵子没 写博客,正好这几天 写了个 内核级强制结束进程 的小例子。写这个例子之前都没去查什么资料,主要是想试试自己能不能写出来吧。写完后才发现 看雪论坛 曾经发表过一篇很相似的文章,实现的细节可能有点不一样,不过原理基本是相同的了。
都是通过 这个 PspTerminateThreadByPointer 函数,我是通过查 ReactOs 来理解的 NtTeriminateProcess 的内部实现过程,
然后 通过 在 SI 里面查找引用,找到的一个 导出函数中调用了 PspTerminateThreadByPointer . 这个函数就是 PsTerminateSystemThread,然后通过 windbg 确认,发现 在Win7 和Xp 下 这个函数 均调用了 PspTerminateThreadByPointer,之后 查到调用的地方,具体的可以去windbg里面看一下,这个函数里面很短,具体我没看,因为这里我只需要用到这个 PspTerminateThreadByPointer 函数。
PspTerminateThreadByPointer() 这个函数的内部我只简单的看了一下,通过向线程插入APC让线程自己结束的办法。
在Win7 和 XP 的32位下这个函数的 参数又一点点 区别,可以看到 在 Win7 下 他有 3个 参数 ,一个是指向线程对象的指针,一个是退出码,还有一个 始终为 1 的参数,XP 下没有 第三个, (当然 由于我并没有完成 Win7 下的代码,这里的分析可能有问题),需要说明的一点是以下代码仅仅兼容 XP 32位版本。
typedef
NTSTATUS
(*PSPTERMINATETHREADBYPOINTER)(
IN PETHREAD Thread,
IN NTSTATUS ExitStatus
);
NTSTATUS PsLookupProcessByProcessId(
_In_ HANDLE ProcessId,
_Out_ PEPROCESS *Process
);
/*
特征码
winxp e8 28fcffffwin7 e8 d9570400
*/
BOOLEAN PspTerminateProcessById(ULONG uPid)
{
UNICODE_STRING usNtTerminateProcess;
ULONG uNtTerminateProcessAddr;
ULONG uConditionCode;
ULONG uError;
BOOLEAN bFind = FALSE;
PEPROCESS KillProcess;
PSPTERMINATETHREADBYPOINTER PspTerminateThreadByPointer;
RtlInitUnicodeString(&usNtTerminateProcess, L"PsTerminateSystemThread");uNtTerminateProcessAddr = (ULONG)MmGetSystemRoutineAddress(&usNtTerminateProcess);if (0 == uNtTerminateProcessAddr)
{
KdPrint(("Error Not Fined A"));
return FALSE;
}
uConditionCode = 0xfffffc28;
uError = 0;
KdPrint(("Addr Is :0x%X", uNtTerminateProcessAddr));//搜索特征码,不知道我这种写法是不是有点笨
do
{
if (uError > 100)
{
bFind = FALSE;
KdPrint(("Error Not Fined B"));
break;
}
bFind = TRUE;
uNtTerminateProcessAddr++;
uError++;
} while (uConditionCode != *((ULONG*)uNtTerminateProcessAddr));if (bFind)
{
KdPrint(("Addr Is :0x%X", uNtTerminateProcessAddr));
}
PspTerminateThreadByPointer = (PSPTERMINATETHREADBYPOINTER)(*((ULONG*)uNtTerminateProcessAddr) + (ULONG)(uNtTerminateProcessAddr + 4));NTSTATUS Status = PsLookupProcessByProcessId((HANDLE)uPid, &KillProcess);
if (!NT_SUCCESS(Status))
{
KdPrint(("Error Coide is 0x%X", Status));
return FALSE;
}
//KdPrint(("EPROCESS Is :0x%X", ));
// ==> 取出 ThreadListHead 找出一个线程的头
//-0x22c 就是 PETHREAD 的地址
//KdBreakPoint();
LIST_ENTRY* pList;
pList = (LIST_ENTRY*)(ULONG)*(ULONG*)((ULONG)KillProcess + 0x190);
LIST_ENTRY* pListNext;
pListNext = pList->Flink;
if (pListNext->Flink != pList)//如果只有一条线程就直接结束 否则 BSOD
{
LIST_ENTRY* pListCurNext;
do
{
LIST_ENTRY* pList_Cur = pListNext;
pListNext = pListNext->Flink;
pListCurNext = pListNext->Flink;
PspTerminateThreadByPointer((PETHREAD)((ULONG)(pList_Cur)-0x22C), 0);} while (pListCurNext != pList);
}
PspTerminateThreadByPointer((PETHREAD)((ULONG)(pList)-0x22C), 0);//到这里就清理成功了
//ObDereferenceObject(KillProcess);//解引用,不过貌似这个对象都没有了,不确定需不需要解除引用
return bFind;
}
2018/5/10 修改
注,这里的代码太凌乱,风格太差,整体来说并没有什么意义,留下来也仅仅是做个纪念。
驱动 -- 强制结束进程 -- 整理相关推荐
- Win64 驱动内核编程-26.强制结束进程
强制结束进程 依然已经走到驱动这一层了,那么通常结束掉一个进程不是什么难的事情.同时因为win64 位的各种保护,导致大家慢慢的已经不敢HOOK了,当然这指的是产品.作为学习和破解的话当然可以尝试各种 ...
- 浅谈驱动中强制结束进程的3种方法
一个应用程序想要结束另一个进程所要做的事:首先获得目标的进程ID,接着利用OpenProcess获取进程句柄(确保足够权限),最后将句柄传给TerminateProcess了结那个进程. OpenPr ...
- 强制结束进程的命令和软件
有时,我们在进程中发现可疑进程时,用Windows的任务管理器并不一定能结束它,这时,我们需要更多更强大的强制结束进程的命令或软件来对付它,下面介绍两个Windows强制结束进程的命令和一个我常用的进 ...
- win10taskkill强行结束进程_Win10程序卡死怎么办? Win10强制结束进程的两种方法
Windows 10系统中,经常遇到某一进程卡死.停止运行的现象,处理此问题的方法可以有:注销一次系统:结束此系统进程. 结束系统进程的方法可以在任务管理器中进行,也可以在管理员命令提示符窗口中使用T ...
- linux kill强制结束进程参数,Linux结束进程之kill、killall、pkill命令
1. 前言 我们经常在Linux里使用kill命令来结束某后台进程.但kill命令实际上是向进程发送信号,并且有多种信号.终止运行一个程序只是其中一个信号而已.kill是根据进程号发送信号的,而另一个 ...
- win10taskkill强行结束进程_技术员细说win10系统强制结束进程命令的教程
win10系统是很多电脑用户首选的装机系统,然而有不少用户在使用过程中可能会碰到win10系统强制结束进程命令的情况.大部分用户电脑技术都是菜鸟水平,面对win10系统强制结束进程命令的问题,无法自行 ...
- mysql强行结束程_如何强制结束进程?
展开全部 1.ntsd强制结束命令 其实只需32313133353236313431303231363533e4b893e5b19e31333337616633要通过两个命令来强制性的结束这些进程,第 ...
- 使用 PspTerminateThreadByPointer 强制结束进程
实现过程 我们知道,线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进 ...
- 【LInux】后台执行命令 nohup 以及强制结束进程命令 kill
通过终端远程操作服务器时,难免要使特定进程处于持续运行状态,例如深度学习训练网络参数,但又不可能长时间不间断操作终端,我们希望将进程保持后台持续运行,这里提供两个思路:(1)docker 内运行,退出 ...
最新文章
- telnet给服务器发消息,[摘抄]使用telnet命令直接发送
- arch Failed to load module intel
- 栈的链式存储及常用操作
- python函数和模块有什么特性_python-函数包和模块
- 存储过程 锁定并发_Java并发教程–锁定:显式锁定
- java基础—TreeSet集合中储存自定义对象(java集合二)
- xml.dom.minidom 利用hbm.xml批量生成db2注释
- “我要彻底放弃 Debian 操作系统!”
- handbook/CentOS/使用免费SSL证书让网站支持HTTPS访问.md
- java学生管理系统代码
- LCD1602单片机(STC51/STM32)驱动程序详解
- android游戏存档在哪里,网易安卓模拟器游戏存档在哪个文件夹的详细解析
- 最具潜力的人工智能机器人玩具(2019年更新)
- sgu244:Height, Bisector and Median(几何)
- 你知道哪六种传统早餐不能吃吗?
- docker生态-mysql客户端phpAdmin
- 前端工程化-husky+commitizen+ 自定义cz-customizable适配器 git 提交代码规范化
- 操作系统概念_第六章_进程同步
- Android可更换布局的换肤方案
- 听力学习——伊甸园美剧字幕组长论如何练听力
热门文章
- 最新Zblog博客微信小程序源码全开源完整版+带教程
- python分析微博数据中心_数据挖掘与数据分析
- 北京科技大学计算机专业 考研真题,北京科技大学计算机科学与技术考研真题及答案.pdf...
- Odoo与浪潮合资研发PS Cloud之从定购单到发票和接待费
- igrt与imrt放疗哪个好_精确放疗为什么要选择影像引导放疗(IGRT)?
- 网络日志采集_企业网络日志对网络安全有哪些帮助作用?
- 动易SiteFactory CMS自动采集器 V2.5.1
- 依赖注入神器:Dagger2详解系列
- 05 H264基础-03 I帧 P帧 B帧及手写H264编码器
- chatgpt把脉知识星球