首页
社区
课程
招聘
[求助]在DeviceIoControl中调用一个函数就无法启动该驱动
发表于: 2009-9-1 20:46 11436

[求助]在DeviceIoControl中调用一个函数就无法启动该驱动

2009-9-1 20:46
11436
如题,在DeviceIoControl中的一个CTL中调用一个我自定义的函数后,用InsDrv加载驱动后可以安装,但是点启动就提示启动失败,我有点不明白啊,这个函数根本不会被调用啊,因为没有DeviceIoControl传入相关的CTL啊,我把该函数调用注释掉就能成功启动,而且就算我把函数体全注释掉也不能调用,请问这个问题是什么原因,该从哪个方面着手去调试更正?
       我在DriverEntry入口加了int 3中断,本来指望点启动后跟踪看看,但是点启动发现没效果,还是直接显示启动失败,也不触发这个断点。。。。

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (31)
雪    币: 231
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
没调用的函数?应该不会啊?你试试在非调试模式安装运行下驱动。
2009-9-1 21:26
0
雪    币: 146
活跃值: (33)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
我在非调试状态和调试状态都不行,所以说太莫名其妙了
2009-9-2 12:43
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
4
你的意思是说在IoCtrl的派遣历程里调用了某一个你自己定义的函数,驱动就无法加载了?
果然莫名其妙……方便的话放出部分相关代码吧。
2009-9-2 13:11
0
雪    币: 146
活跃值: (33)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
哪部分的代码?是自定义函数的还是DeviceIoControl的处理代码?
2009-9-2 13:52
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
6
CTL的定义
DriverEntry中设置DeviceIoControl函数的代码
DeviceIoControl函数中调用自定义函数的地方附近的代码
2009-9-2 13:55
0
雪    币: 146
活跃值: (33)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
代码:

       
case MY_PROTECTPROCESS_CODE:
		{
			g_ProcessId = *(ULONG*)in_buffer;
			UNICODE_STRING ServiceName_OpenProcess = RTL_CONSTANT_STRING(L"ZwOpenProcess");
			LONG ServiceId_OpenProcess = GetServiceId(&ServiceName_OpenProcess);
			if(ServiceId_OpenProcess < 0)
			{
				ntStatus = -1;
				break;
			}
			MySSDTHook(ServiceId_OpenProcess, (ULONG)KrNtOpenProcess, TRUE);
			MyHideProcess(*(ULONG*)in_buffer);
			ULONG OrgAdress = GetPspTerminateThreadByPointer();
			InlineHook(OrgAdress, (ULONG)KrPspTerminateThreadByPointer, 0);         //就是这句代码有问题
			Irp->IoStatus.Information = 0;
			ntStatus = STATUS_SUCCESS;
			break;
		}

我将MySSDTHook(ServiceId_OpenProcess, (ULONG)KrNtOpenProcess, TRUE);
这句没问题的代码第2个参数改成(ULONG)KrPspTerminateThreadByPointer后也是无法启动,我将InlineHook(OrgAdress, (ULONG)KrPspTerminateThreadByPointer, 0);第2个参数改成(ULONG)KrNtOpenProcess也无法启动,所以都不知道到底是InlineHook函数的问题还是KrTerminateThreadByPointer的问题,但是就算有问题应该也能启动吧??
然后InlineHook的代码:
void NTAPI InlineHook(ULONG OrgAddress, ULONG NewAddress, ULONG HookOffset)      //HookOffset是Hook点距离函数头的偏移
{
	
	KIRQL irql;
	KeAcquireSpinLock(&g_MyHookListLock, &irql);
	if(!g_pInlineHookList)
	{
		g_pInlineHookList = (PINLINE_HOOK_LIST)::ExAllocatePool(PagedPool, sizeof(INLINE_HOOK_LIST));
		::RtlZeroMemory((PVOID)g_pInlineHookList, sizeof(INLINE_HOOK_LIST));
		g_pInlineHookList->next = g_pInlineHookList;
	}
	PINLINE_HOOK_LIST pHookInfo = (PINLINE_HOOK_LIST)::ExAllocatePool(PagedPool, sizeof(INLINE_HOOK_LIST));
	::RtlCopyMemory((PVOID)pHookInfo->OrgCode, (PVOID)(OrgAddress + HookOffset), CODE_LENGTH);
	pHookInfo->OrgAddress = OrgAddress;
	pHookInfo->NewAddress = NewAddress;
	pHookInfo->InlineOffset = HookOffset;
	//链表为空,即头节点指向自己
	if(g_pInlineHookList->next == g_pInlineHookList)
	{
		pHookInfo->next = NULL;
	}
	else
	{
		pHookInfo->next = g_pInlineHookList->next;
	}
	g_pInlineHookList->next = pHookInfo;
	UCHAR bJmpCode[CODE_LENGTH]={ 0xE9, 0, 0, 0, 0 };
	PULONG pJmpArg = (PULONG)(bJmpCode+1);
	ULONG dwCurrentEIP = ULONG(OrgAddress) + 5;
	*pJmpArg = (ULONG)NewAddress - dwCurrentEIP;
	__asm
	{//去掉内存保护 
		cli 
			mov   eax,cr0 
			and   eax,not 10000h 
			mov   cr0,eax 
	} 

	::RtlCopyMemory((PVOID)(OrgAddress + HookOffset), bJmpCode, CODE_LENGTH);

	__asm
	{   //恢复内存保护
		mov   eax,cr0 
			or   eax,10000h 
			mov   cr0,eax 
			sti 
	} 

	KeReleaseSpinLock(&g_MyHookListLock, irql);
}

而且就算我把该函数体全部注释掉也没用,也是启动失败,而且只要那个调用存在,生成的sys会大1k左右

     出了这样的问题实在很无奈。。。。。
2009-9-2 13:59
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
8
我也无奈了……等待楼下高人吧……
加载失败的错误代码是什么?
2009-9-2 14:14
0
雪    币: 146
活跃值: (33)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
我用的InsDrv,没有错误代码提示,就是启动失败。。。不过还是要谢谢你
2009-9-2 14:28
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
10
对ZwLoadDriver下断,看看返回值是什么
2009-9-2 16:49
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
11
再看看你编译好的驱动的导入表导入了哪几个文件
2009-9-2 16:52
0
雪    币: 146
活跃值: (33)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
12
我下的ntdll的断,eax为c000007a,不知道这个返回值是什么意思,也没这个函数的解释
2009-9-2 17:57
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
13
很明显是你的驱动写的有问题

C000007A:STATUS_PROCEDURE_NOT_FOUND

LINK了一些不该LINK的DLL就会这样

发驱动文件上来吧
2009-9-2 18:33
0
雪    币: 146
活跃值: (33)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
14
原来还有这样的错误啊。。。汗,初学驱动不懂这些,已经上传了,谢谢各位啊,帮忙分析下
上传的附件:
2009-9-2 18:47
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
15
一看即知,问题是你LINK了KERNEL32.dll
2009-9-2 18:57
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
16
引入KERNEL32.dll的原因是由于在gs cookie处理时用了这个函数

具体原因可能是你使用::RtlCopyMemory的缘故~可以试试RtlCopyMemory
2009-9-2 19:02
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
17
MJ果然强大……
2009-9-2 19:05
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
18
帮MJ补充,调用了这5个不该调用的函数:
TerminateProcess,GetCurrentProcess,UnhandledExceptionFilter,SetUnhandledExceptionFilter,IsDebuggerPresent
2009-9-2 19:07
0
雪    币: 146
活跃值: (33)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
19
谢谢大哥,但是我驱动中没用到导入表里的几个函数啊。。。怎么会导入的
2009-9-2 19:10
0
雪    币: 146
活跃值: (33)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
20
改了,发现kernel32还是被引入了,不知道咋的
2009-9-2 19:32
0
雪    币: 146
活跃值: (33)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
21
最后没有办法,只能关了“缓冲区安全检查”,但是不知道这样好不好
2009-9-2 20:11
0
雪    币: 146
活跃值: (33)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
22
再次谢谢各位大大的关注
2009-9-2 20:11
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
23
用ddk build应该就没这个问题了,不知道你是用什么东西来编译的,不过看来不好使~
2009-9-2 20:59
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
24
看到你用C++写驱动我就怀疑你的link了不改link的东西,所以让你检查导入表,果然如我所料~~看来主要还是编译环境的问题
2009-9-2 21:27
0
雪    币: 146
活跃值: (33)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
25
额,我用的VS2005编译链接的,不过改了很多东西啊,但是不知道 缓冲区安全检查 要关闭。。。谢谢MJ了
2009-9-2 21:40
0
游客
登录 | 注册 方可回帖
返回
//