有一阵子没 写博客,正好这几天 写了个 内核级强制结束进程 的小例子。写这个例子之前都没去查什么资料,主要是想试试自己能不能写出来吧。写完后才发现 看雪论坛 曾经发表过一篇很相似的文章,实现的细节可能有点不一样,不过原理基本是相同的了。

都是通过 这个  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 修改

注,这里的代码太凌乱,风格太差,整体来说并没有什么意义,留下来也仅仅是做个纪念。

驱动 -- 强制结束进程 -- 整理相关推荐

  1. Win64 驱动内核编程-26.强制结束进程

    强制结束进程 依然已经走到驱动这一层了,那么通常结束掉一个进程不是什么难的事情.同时因为win64 位的各种保护,导致大家慢慢的已经不敢HOOK了,当然这指的是产品.作为学习和破解的话当然可以尝试各种 ...

  2. 浅谈驱动中强制结束进程的3种方法

    一个应用程序想要结束另一个进程所要做的事:首先获得目标的进程ID,接着利用OpenProcess获取进程句柄(确保足够权限),最后将句柄传给TerminateProcess了结那个进程. OpenPr ...

  3. 强制结束进程的命令和软件

    有时,我们在进程中发现可疑进程时,用Windows的任务管理器并不一定能结束它,这时,我们需要更多更强大的强制结束进程的命令或软件来对付它,下面介绍两个Windows强制结束进程的命令和一个我常用的进 ...

  4. win10taskkill强行结束进程_Win10程序卡死怎么办? Win10强制结束进程的两种方法

    Windows 10系统中,经常遇到某一进程卡死.停止运行的现象,处理此问题的方法可以有:注销一次系统:结束此系统进程. 结束系统进程的方法可以在任务管理器中进行,也可以在管理员命令提示符窗口中使用T ...

  5. linux kill强制结束进程参数,Linux结束进程之kill、killall、pkill命令

    1. 前言 我们经常在Linux里使用kill命令来结束某后台进程.但kill命令实际上是向进程发送信号,并且有多种信号.终止运行一个程序只是其中一个信号而已.kill是根据进程号发送信号的,而另一个 ...

  6. win10taskkill强行结束进程_技术员细说win10系统强制结束进程命令的教程

    win10系统是很多电脑用户首选的装机系统,然而有不少用户在使用过程中可能会碰到win10系统强制结束进程命令的情况.大部分用户电脑技术都是菜鸟水平,面对win10系统强制结束进程命令的问题,无法自行 ...

  7. mysql强行结束程_如何强制结束进程?

    展开全部 1.ntsd强制结束命令 其实只需32313133353236313431303231363533e4b893e5b19e31333337616633要通过两个命令来强制性的结束这些进程,第 ...

  8. 使用 PspTerminateThreadByPointer 强制结束进程

    实现过程 我们知道,线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进 ...

  9. 【LInux】后台执行命令 nohup 以及强制结束进程命令 kill

    通过终端远程操作服务器时,难免要使特定进程处于持续运行状态,例如深度学习训练网络参数,但又不可能长时间不间断操作终端,我们希望将进程保持后台持续运行,这里提供两个思路:(1)docker 内运行,退出 ...

最新文章

  1. telnet给服务器发消息,[摘抄]使用telnet命令直接发送
  2. arch Failed to load module intel
  3. 栈的链式存储及常用操作
  4. python函数和模块有什么特性_python-函数包和模块
  5. 存储过程 锁定并发_Java并发教程–锁定:显式锁定
  6. java基础—TreeSet集合中储存自定义对象(java集合二)
  7. xml.dom.minidom 利用hbm.xml批量生成db2注释
  8. “我要彻底放弃 Debian 操作系统!”
  9. handbook/CentOS/使用免费SSL证书让网站支持HTTPS访问.md
  10. java学生管理系统代码
  11. LCD1602单片机(STC51/STM32)驱动程序详解
  12. android游戏存档在哪里,网易安卓模拟器游戏存档在哪个文件夹的详细解析
  13. 最具潜力的人工智能机器人玩具(2019年更新)
  14. sgu244:Height, Bisector and Median(几何)
  15. 你知道哪六种传统早餐不能吃吗?
  16. docker生态-mysql客户端phpAdmin
  17. 前端工程化-husky+commitizen+ 自定义cz-customizable适配器 git 提交代码规范化
  18. 操作系统概念_第六章_进程同步
  19. Android可更换布局的换肤方案
  20. 听力学习——伊甸园美剧字幕组长论如何练听力

热门文章

  1. 最新Zblog博客微信小程序源码全开源完整版+带教程
  2. python分析微博数据中心_数据挖掘与数据分析
  3. 北京科技大学计算机专业 考研真题,北京科技大学计算机科学与技术考研真题及答案.pdf...
  4. Odoo与浪潮合资研发PS Cloud之从定购单到发票和接待费
  5. igrt与imrt放疗哪个好_精确放疗为什么要选择影像引导放疗(IGRT)?
  6. 网络日志采集_企业网络日志对网络安全有哪些帮助作用?
  7. 动易SiteFactory CMS自动采集器 V2.5.1
  8. 依赖注入神器:Dagger2详解系列
  9. 05 H264基础-03 I帧 P帧 B帧及手写H264编码器
  10. chatgpt把脉知识星球