WINDOWS NT下的禁止关机

WINDOWS NT下的禁止关机


WINDOWS将核心代码封装,而仅仅提供接口API,也就是说,你只需要根据说明书来操作遥控板,而不需要自己去研究遥控板是怎么

实现的。

同样的,如果你想关机,那么流程如下:

    调用系统关机API--送入该API必要的参数--转由系统执行关机


一、用OD载入c:/windows/system32/shutdown.exe后,可以看到它调用的相关API:

 

需要注意的说,WIN 2K下需要得到SHUTDOWN许可:
(1)首先得到当前程序的进程句柄;
(2)使用这个进程句柄得到当前程序的访问标记;
(3)生成TOKEN_PRIVILEGES结构;
(4)有了TOKEN_PRIVILEGES结构后再获得SHUTDOWN权限;
(5)最后使用ExitWindowEx函数进行相关操作。


二、目前流行的快速关机方法,是采用了下面两个Native Api来实现的:

 

NT native API 是可由用户模式和核心模式程序调用的NT系统服务集接口,它们直
接由NT操作系统实现.例如,当应用程序调用CreateFile()时,最终会转换为对
native API NtCreateFile()的调用.微软对被设备驱动程序调用的Zwxxx系列函数
给过一些说明.但是,这些公开的函数只不过是全部native API的一小部份,仅有
10%的native api在DDK中被公开其调用!。

 

三、如何禁止关机

当我们HOOK掉相应的API,在系统接管前先自行处理,就可以实现禁止关机。

网上流行的全局Hook 程序一般采用 SetWindowsHookEx,此函数原型:

 

使用这个这个API 时候有问题的,只能挂接系统中的所有GUI线程,对Windows console 类的程序就无能为力了。

还有一种通过插入注册表来实现:

 

 

这种方法简单,但是还是只能挂钩GUI程序,并且这个键值已经被HIPS和部分杀软所关注。

 

 

以上两种效果不好,Ring3下的HOOK只对当前进程有效,其他进程的API还是正常的。这就是说我们必须枚举进程,然后对每个Ring3

进程执行一遍HOOK操作。但是,系统中总有新进程产生,对于这些新进程我们怎么处理呢?最容易想到的就是设置一个TIMER,每隔

一段时间就枚举一遍进程然后把新的挂钩。但仔细一想就知道不行,TEMER过快严重影响系统效率,慢了又起不到作用,况且

windows不是一个实时操作系统,没人能保证到时间TEMER就被激活。如果我们能监控进程创建,并在他们真正运行之前就执行挂钩

操作,就可以完美的解决问题。
但是如何做到这一点呢?我们知道Ring3的进程都有一个“父进程”也就是说新进程都是由老进程创建的(驱动很少创建进程)。知

道这一点就好办了,我们要做的只是截获进程创建。你肯定会说“这么简单,HOOK NtCreateProcess就可以了!”但是这不是最简

单的做法。为什么这么说呢,首先在NtCreateProcess函数被调用时进程并没有真正被创建,我们无法执行HOOK操作,而当

NtCreateProcess返回时,进程又已经开始运行,HOOK时存在线程同步的问题(我用OD在NtCreateProcess设下INT3断点,却拦不到

,不只是为什么?)。
所以选择NtResumeThread。我们知道,当新进程被创建时,OS会为其创建一个住线程,而在这之后会调用NtResumeThread时期开始

运行,这时初始化完毕,DLL都已经被载入,但进程却没有开始运行这时我们最好的机会。

 

 

 

(HOOK部分资料来源于网络,收集整理而成。)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值