首页
社区
课程
招聘
[求助]学习HOOK IOFCALLDRIVER出现问题
发表于: 2011-6-22 17:30 7383

[求助]学习HOOK IOFCALLDRIVER出现问题

2011-6-22 17:30
7383
我学习天书夜读上面的HOOK一章  然后自己写了个DEMO  蓝了  用WINDBG调试 执行HookRoutine中InterlockedExchange((PLONG)(address+2),(LONG)ChangeIoCallDriver); 前用  u  iofdriver 看 是这样:

nt!IofCallDriver:
804e47c5 ff2580445580    jmp     dword ptr [nt!pIofCallDriver (80554480)]
804e47cb 90              nop
804e47cc 90              nop
804e47cd 90              nop
804e47ce 90              nop
804e47cf 90              nop

执行完替换函数后变成
nt!IofCallDriver:
804e47c5 ff2590f403fa    jmp     dword ptr [HookIoCallDriver!NewIoCallDriver (fa03f490)]
804e47cb 90              nop
804e47cc 90              nop
804e47cd 90              nop
804e47ce 90              nop
804e47cf 90              nop

说明替换成功了 但是接下来就蓝了  我用 bp NewIoCallDriver  命令查看发现竟然是如下的汇编代码
Breakpoint 3 hit
nt!IofCallDriver:
804e47c5 ff2590f403fa    jmp     dword ptr [HookIoCallDriver!NewIoCallDriver (fa03f490)]
kd> t
8b55ff8b ??              ???

执行到无效命令那边了 所以蓝了  我的所有代码如下

typedef NTSTATUS (FASTCALL *PMYIOCALLDRIVER)(IN PDEVICE_OBJECT,IN PIRP);

PMYIOCALLDRIVER g_Old_IoCallDriver=NULL;

NTSTATUS FASTCALL NewIoCallDriver(IN PDEVICE_OBJECT device,IN PIRP Irp)
{
	NTSTATUS status=STATUS_SUCCESS;
	
	
	if(!g_Old_IoCallDriver)
			return status;
	
	__asm
	{
		 jmp g_Old_IoCallDriver
	}
	
	return status;	
}

PMYIOCALLDRIVER HookRoutine(PMYIOCALLDRIVER ChangeIoCallDriver,BOOLEAN HookOrNot)
{
		PMYIOCALLDRIVER Old_Io_CallDriver=NULL;
		UNICODE_STRING FunName;
		PCHAR address;
		
		RtlInitUnicodeString(&FunName,L"IofCallDriver");
		
		address=MmGetSystemRoutineAddress(&FunName);
		
		if(address==NULL)
				return NULL;
				
		if(HookOrNot)
		{
			 Old_Io_CallDriver=(PMYIOCALLDRIVER)(address+2);
			 g_Old_IoCallDriver=Old_Io_CallDriver;
			 InterlockedExchange((PLONG)(address+2),(LONG)ChangeIoCallDriver);
			 return Old_Io_CallDriver;
		}
		else
		{
			 g_Old_IoCallDriver=NULL;
			 InterlockedExchange((PLONG)(address+2),(LONG)ChangeIoCallDriver);
		}	
		
		return Old_Io_CallDriver; 
}

void HookIoCallUnload(IN  PDRIVER_OBJECT  DriverObject)
{
	 if(g_Old_IoCallDriver)
	 {
	 		HookRoutine(g_Old_IoCallDriver,FALSE);	
   }
}

NTSTATUS DriverEntry(
    IN  PDRIVER_OBJECT  DriverObject,
    IN  PUNICODE_STRING RegistryPath
    )
{
		
		DriverObject->DriverUnload = HookIoCallUnload;
		
		g_Old_IoCallDriver=HookRoutine(NewIoCallDriver,TRUE);
		
    return STATUS_SUCCESS;
}



求高手解答 我哪里写错了?  

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 601
活跃值: (256)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
2
好像是:
InterlockedExchange((PULONG)*(PULONG)(address+2),(LONG)ChangeIoCallDriver);
2011-6-22 18:55
0
雪    币: 34
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
兄弟 感觉不像是这这个吧  用了你这个 代码 执行完用 u ifocalldriver 发现没替换成功 继续执行下去也就蓝了
2011-6-23 10:04
0
雪    币: 601
活跃值: (256)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
4
错误的地方不仅仅是这一处哦....

其实把IopfCallDriver Hook了,所以那个地址Old_Io_CallDriver应该是(PMYIOCALLDRIVER)*(PULONG)*(PULONG)(address+2);然后:InterlockedExchange((PULONG)*(PLONG)(address+2),(ULONG)ChangeIoCallDriver);卸载时候也是这样交换
在NewIoCallDriver直接jmp也不行的,status = g_Old_IoCallDriver(device,Irp);大致就这几处吧,LZ试试
2011-6-23 11:33
0
雪    币: 34
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
太感谢你了 握爪  果然是这几个问题  我顺便问一下
用我的这个
InterlockedExchange((PLONG)(address+2),(LONG)ChangeIoCallDriver);
替换后 用u iofcalldriver  显示

nt!IofCallDriver:
804e47c5 ff2590f403fa    jmp     dword ptr [HookIoCallDriver!NewIoCallDriver (fa03f490)]
804e47cb 90              nop
804e47cc 90              nop
804e47cd 90              nop
804e47ce 90              nop
804e47cf 90              nop

我以为这个就是替换成功了  这里面有什么区别吗 jmp 后面的那四个字节 有什么含义吗?
2011-6-23 12:02
0
雪    币: 601
活跃值: (256)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
6
kd> u IofCallDriver
nt!IofCallDriver:
804ef130 ff2580d25480    jmp     dword ptr [nt!pIofCallDriver (8054d280)]
804ef136 cc              int     3
804ef137 cc              int     3
804ef138 cc              int     3
804ef139 cc              int     3
804ef13a cc              int     3
804ef13b cc              int     3
nt!IoCheckQuerySetFileInformation:
804ef13c 8bff            mov     edi,edi
kd> dd 8054d280
8054d280  804ef0f8 804f160c 804f0d4c 804ef416
8054d290  00000000 00000000 00000000 00000000
8054d2a0  00000000 00000000 00000000 00000000
8054d2b0  00000000 00000000 00000000 00000000
8054d2c0  00000000 00000000 00000000 00000000
8054d2d0  00000000 00000000 00000000 00000000
8054d2e0  00000000 00000000 00000000 00000000
8054d2f0  00000000 00000000 00000000 00000000
kd> u 804ef0f8
nt!IopfCallDriver:
804ef0f8 fe4a23          dec     byte ptr [edx+23h]
804ef0fb 8a4223          mov     al,byte ptr [edx+23h]
804ef0fe 84c0            test    al,al
804ef100 7f0e            jg      nt!IopfCallDriver+0x18 (804ef110)
804ef102 6a00            push    0
804ef104 6a00            push    0
804ef106 6a00            push    0
804ef108 52              push    edx

要HOOK的是IopfCallDriver
2011-6-23 12:55
0
雪    币: 34
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
谢谢 我搞错了  JMP 后面那个是要跳转的位置的指针  我把这个指针本身值给改了 难怪。。。
2011-6-23 14:51
0
游客
登录 | 注册 方可回帖
返回
//