能力值:
( LV9,RANK:380 )
2 楼
突然想起来,跟张无忌的“乾坤大挪移”很像。。。
能力值:
( LV2,RANK:10 )
3 楼
没看出任何地方的另类. ***********?
虚拟机上栈溢出了吧, 主机上你需要设置kernelDump
能力值:
( LV2,RANK:10 )
4 楼
我只找到了3个问题
#define IOCTL_CODE(index) (ULONG)CTL_CODE( FILE_DRIVER_MYUNKNOW, index, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA ) inBuf = Irp->AssociatedIrp.SystemBuffer;
1.应该用METHOD_BUFFERED,奇怪的是你用METHOD_NEITHER居然能正常
2.Hook时,EPROCESS还没有初始化
3.没有为EPROCESS保留引用计数
能力值:
( LV5,RANK:60 )
5 楼
有源码,自己拿windbg调试下呀
能力值:
( LV9,RANK:380 )
6 楼
我是刚入行的,请原谅我对这行的无知,虽然是几百万年前,但是对我来说,还是很新鲜。。。。
能力值:
( LV4,RANK:50 )
7 楼
替换操作对象 的确很早了
代码的流程有严重的问题 实机你没看见蓝屏 是因为你设置了自动重启 在你的电脑属性里取消就可以看见蓝屏了。
能力值:
( LV9,RANK:380 )
8 楼
阁下可能没有认真看代码吧?
ReferencedObject = (PVOID)AvpEPROCESS; //AvpEPROCESS是要替换的其他进程的PEPROCESS
上面那句是蓝,换成下面这句是正常:
ReferencedObject = (PVOID)MyEPROCESS;
所以我认为代码的流程不存在问题,原因可能因为替换成其他进程的EPROCESS结构体之后,会产生另外莫名其妙的后遗症,那才是问题的所在吧 - -!
能力值:
( LV9,RANK:380 )
9 楼
EPROCESS已经初始化了的,从应用层传递进来的pid,然后: AvpPID = 0;
AvpPID =(HANDLE)atoi(inBuf); //得到要转移到的傀儡进程pid
DbgPrint("AvpPID :%d",AvpPID);
//memset(&AvpEPROCESS,0,sizeof(PEPROCESS));
PsLookupProcessByProcessId(AvpPID,&AvpEPROCESS);
ObDereferenceObject(AvpEPROCESS);
能力值:
( LV12,RANK:760 )
10 楼
蓝屏的原因其实很简单~
提示一下:ObReferenceObjectByHandle会增加引用计数
能力值:
( LV2,RANK:10 )
11 楼
我记得你把安装Hook放在了DriverEntry里
能力值:
( LV9,RANK:380 )
12 楼
我一直以为现在我在ObReferenceObjectByHandle的函数里不需要调用ObDereferenceObject来减少引数,等函数返回之后,引数的减少是由调用ObReferenceObjectByHandle的这个进程来完成的。。。。
能力值:
( LV9,RANK:380 )
13 楼
弱弱的问下,把hook放在DriverEntry里,会出现什么后果呢?
能力值:
( LV2,RANK:10 )
14 楼
再想了想,问题不是特别严重,静态变量初始值是0,所以开始时不替换。
但是还是有点问题,如果在IOCTL_HELLOWORD之后 IOCTL_SETHOOKOPENPROCESS之前调用被HOOK的函数呢
多了引用计数不是特别大问题,关键是另一边少了,
估计会导致某个EPROCESS被提前删除
能力值:
( LV9,RANK:380 )
15 楼
“如果在IOCTL_HELLOWORD之后 IOCTL_SETHOOKOPENPROCESS之前调用被HOOK的函数”
总的来说,在IOCTL_SETHOOKOPENPROCESS之前,那么ReferencedObject一定不等于(PVOID)MyEPROCESS,代码执行就会正常,蓝的关键在于替换EPROCESS结构体之后: *Object = (PVOID)AvpEPROCESS; 并且它不是马上就蓝,而是正常运行几十秒钟之后才蓝的。。这就是我不解的地方了
能力值:
( LV9,RANK:380 )
16 楼
另外按照老V的提示,调用ObDereferenceObject(ReferencedObject); 减小计数,马上就蓝了。。。。。
能力值:
( LV2,RANK:10 )
17 楼
额,没看仔细
问题是该加引用计数的你没加上,别人关闭Handle的时候就会提前删除进程对象了
应该加上ObReferenceObject(AvpEPROCESS);
能力值:
( LV9,RANK:380 )
18 楼
加上ObReferenceObject(AvpEPROCESS); 之后,不蓝屏,直接卡死在那里了 - -#
能力值:
( LV4,RANK:50 )
19 楼
你这样做的后果
不是引用记数不释放的问题
而是 系统实际上增加了ReferenceObject的引用记数
因为你的修改 系统却认为是增加了Avpeprocess的引用
时间一长 肯定要出问题
能力值:
( LV9,RANK:380 )
20 楼
看了dump,错误的PROCESS_NAME 是System 汗。。。。
能力值:
( LV2,RANK:10 )
21 楼
大概是进程对象被删除了,所以系统访问的时候出错了
导致蓝屏虽然是系统进程,但是罪魁祸首其实是你