禁止终止进程
篇首图,让人心脏骤停的窗口。使用任务管理器结束极域时几乎是必然出现的。原理嘛,可以看破解极域电子教室,老师再也控制不了我了!极域电子教室防控制。
通过检查,极域使用 TDProcHook.sys 来 HOOK 住 NtTerminateProcess ,如果要结束的是 StudentMain.exe ,则返回 STATUS_ACCESS_DENIED 拒绝访问。
但是这个驱动比较老,仅仅能在32位的Win7/XP上运行,64位Win7及Win8/10都会失效,这说明,64位系统或Win8/10系统都可以用任务管理器结束。
以上这段话,基本上没有问题。可是,越来越多机房使用64位系统,也没见有人说可以直接结束。毕竟极域用来控制学生,肯定不会这么容易就被结束。
有一次,我用火绒剑研究进程加载的模块,意外发现了一个文件LibTDProcHook64.dll,路径指向极域目录。顾名思义,是64位进程hook。我们的进程无法终止极域,都是它惹的祸。
经测试,我们在程序中手动卸载它,再调用TerminateProcess()
,即可成功结束极域。
//卸载极域64位进程终止hook
HMODULE hook=GetModuleHandle("LibTDProcHook64.dll");
FreeModule(hook);
//终止极域
HANDLE handle = OpenProcess(PROCESS_TERMINATE, FALSE, 6789/*极域PID*/);
TerminateProcess(handle, 0);
后来发现,极域有个ProcHelper64.exe,也是拒绝结束的,顾名思义,就是进程助手64位。
键盘锁
这个就不介绍了,懂的都懂。
上面文章中提到:
然后,设置一些钩子,屏蔽键盘按键:
最后,调用驱动HOOK住底层键盘,防止你按 Ctrl+Alt+Del (真恶心)
键盘锁定,极域采用双重锁。极域的WH_KEYBOARD_LL
钩子负责屏蔽大多数按键。我们可以采用新线程循环挂钩,使自己的钩子位于极域钩子上,然后在自己钩子函数里分发事件(直接返回FALSE是个比较好的解决办法),实现解键盘锁。
HHOOK kbdHook;
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam){
return FALSE;
}
DWORD WINAPI KeyHookThreadProc(LPVOID lpParameter) {
while (true) {
kbdHook = (HHOOK)SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)HookProc, GetModuleHandle(NULL), 0);
Sleep(25);
UnhookWindowsHookEx(kbdHook);
}
return 0;
}
其实除JiyuTrainer(直接不让极域锁)之外的所有能解极域键盘锁的软件,都用了这个方法。例如,F**kTeacher挂了四个钩子(其中两个没有用),再见极域循环挂钩还不解锁(几秒钟就有成百上千个钩子,太暴力了)。实际上,1个就够了。
但是这个钩子没法屏蔽Alt+Ctrl+Delete,极域就弄了个底层的驱动。这个驱动无法通过sc
命令停止和卸载:
C:\windows\system32>sc stop TDKeybd
[SC] ControlService 失败 1052:
请求的控件对此服务无效。
就连PCHunter都干不掉它(恶心到我了)。因此使用以上解键盘锁方法,无法解锁Alt+Ctrl+Delete。
另外,极域的WH_KEYBOARD_LL
钩子并未屏蔽Ctrl、Shift、Alt、B、C,Win按键存疑。应该是有意为之。