|
作者:Tesla.Angela
进程保护在技术上是非常简单的,不过要做到商用级别的,比较难。
接下来总结一下我的技术方案,总用户数超过了10万级别,基本没有蓝屏,也没有太多异常。
首先说说32位的XP和2003。
XP和2003没有标准的进程保护接口,我用的方法是Hook PspTerminateThreadByPointer。
定位PspTerminateThreadByPointer可以通过PsTerminateSystemThread,这个网上有很多代码。
不过需要注意的是,PspTerminateThreadByPointer在XP和2003上的函数原型并不相同。
XP上的原型是:PspTerminateThreadByPointer(PETHREAD Thread, NTSTATUS ExitStatus)
2003上的原型是:PspTerminateThreadByPointer(PETHREAD Thread, NTSTATUS ExitStatus, BOOLEAN DirectTerminate)
至于HOOK的安全性,实在不必太纠结,关闭内存写保护+提升IRQL+自旋锁的方法,基本上就没有蓝屏的了。
如果非要担心,可以使用两字节二段跳的方法:
先用个2字节的短跳,跳到PspTerminateThreadByPointer-2的位置,再来个5字节的长跳,跳到ProxyPspTerminateThreadByPointer。
修改函数的2个字节,可以用InterlockedExchange16,这是个原子操作,就不用担心修改的时候正好有个线程执行到指令的一半。
再说说64位的XP和2003。
64位的XP和2003,从内核的角度看其实是一个操作系统。因为他们的内核文件版本号都是3790。
貌似从WIN2003X64SP1开始,就有PATCHGUARD了,所以HOOK内核API肯定是行不通的。
我个人建议的方法是修改ETHREAD的CrossThreadFlags,把这个标识的bit 4(SystemThread)设置为1即可。
最后说WIN7、WIN8/8.1(不考虑VISTA)
这两个系统系统都可以通过使用ObRegisterCallbacks标准方法实现,代码教程里有,具体就不多说了。不过我要说说注意的地方。
1.去掉以下权限:PROCESS_TERMINATE、PROCESS_VM_WRITE、PROCESS_VM_OPERATION、PROCESS_SET_QUOTA、PROCESS_SET_INFORMATION、PROCESS_SUSPEND_RESUME。
2.放过audiodg.exe和dwm.exe对目标进程的操作。否则目标进程可能会异常,比如无法播放声音,失去AERO效果。
|
|