前段时间包同学到一家公司去面试,面试官问他如果不用TerminateProcess如何实现关闭进程。
现在问题摆在面前,如何解决这个问题,想了想最好的方法就是直接看操作系统怎么实现
TerminateProcess
的自己实现个就好了,在一定程度上就可以阻止别人通过hook技术来拦截.
这段代码很早就写好了,但是帖子什么的一直没什么时间写(薛老师今天讲的壳还没有脱),写完这篇帖子去脱壳了
另外:
本人小菜,大神们轻点喷
开始吧!下面截图的代码都是win2000的代码,在看源码的同时有时候需要用ida打开win7的ntoskrnl.exe对比着看,所幸的是虽然经过很多版本更迭,但是这块的基本原理没啥变化,所以就尽量不贴ida反汇编的图了(可读性差)
这个函数主要干的事情就是遍历进程的线程,然后对每个线程执行PspTerminateThreadByPointer
这个函数是分两种情况的:
PspExitThread这个函数太庞杂简单说下它的作用:
1. 执行了一大堆清理代码,主要清理当前线程Ethread的资源
2. 从调度链表和等待链表中去掉它
3. 如果是进程的最后一个线程,直接清理进程空间
4. 执行KiSwapThread切换到一个新线程去
1. 所谓杀死进程,其实只要把每个线程杀死就好了,最后一个线程会负责收尸的
2. 线程不能被杀死,只能自杀.所以如果想杀掉线程最好让它自己执行自杀代码,内核apc(后面会简单讲下内核apc,没法深入再讲就错题了)是个不错的选择
1. 中断和异常返回,下面是ReatOs的代码(贴代码为证,避免别人说我瞎哔哔O(∩_∩)O哈哈~)
2. 高irql转到第irql,这块直接看win732逆向的代码:KfLowerIrql
主要关注: HalpCheckForSoftwareInterrrupt
执行apc的地方就是KiDeliverApc
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2019-5-10 10:48
被又出bug了编辑
,原因: