|
|
发表于 2013-7-4 00:16:16
|
显示全部楼层
如果是zw打头的,要写驱动ssdt hook
ZwSetInformationThread (
__in HANDLE ThreadHandle,
__in THREADINFOCLASS ThreadInformationClass,
__in_bcount(ThreadInformationLength) PVOID ThreadInformation,
__in ULONG ThreadInformationLength
);
其中第二个参数 __in THREADINFOCLASS中ThreadInformationClass的定义有很多,有一条是ThreadHideFromDebugger。即$11,作用就是隐藏线程,让调试器接收不到信息
假设我想让自己的程序反调试,那么应该这样写:
ZwSetInformationThread(GetCurrentThread, ThreadHideFromDebugger, nil, 0);
而你需要做的就是ssdt hook ZwSetinfomationThread
注:要在游戏启动之前hook
跟平常hook是一样的 区别就是一个是r3层 一个是r0层
具体代码由于所用语言环境不同就不写了,大概意思是:
function myZwSetInformationThread..............................:NTSTATUS;stdcall;
var
fanhui:NTSTATUS;
begin
fanhui:=myZwSetInformationThread..............................:;
if ThreadInformationClass=$11(或者ThreadHideFromDebugger也可以) then
begin
fanhui:=STATUS_SUCCESS;
end;
result:=fanhui;
end;
ps:如果觉得以上方法较复杂,也可以尝试用od打开游戏,在启动的时候暂停,跳到ZwSetInformationThread,然后看第二个参数是$11的话,在自己修改处理也可。
|
|