首页
社区
课程
招聘
[求助]驱动中使用全局变量! 出错了!
发表于: 2009-9-13 20:56 5890

[求助]驱动中使用全局变量! 出错了!

2009-9-13 20:56
5890
第一次 DbgPrint("%s",jinchengming);打印正确的传入进程名 “a.exe”
运行一个程序 激活回调,   DbgPrint("%s",jinchengming);打印出一片乱码,
请问这是为何?
char * jinchengming=0;
NTSTATUS 
DispatchIoctl(
	PDEVICE_OBJECT pDevObj, 
	PIRP pIrp
	)
{
	NTSTATUS status = STATUS_INVALID_DEVICE_REQUEST;
	PIO_STACK_LOCATION pIrpStack;
	ULONG uIoControlCode;
	PVOID pIoBuffer;
	ULONG uInSize;
	ULONG uOutSize;
                int i = 0;
 
char * pucBuffs=0;
	
	pIrpStack = IoGetCurrentIrpStackLocation(pIrp);
	uIoControlCode = pIrpStack->Parameters.DeviceIoControl.IoControlCode;
	pIoBuffer = pIrp->AssociatedIrp.SystemBuffer;
	uInSize = pIrpStack->Parameters.DeviceIoControl.InputBufferLength;
	uOutSize = pIrpStack->Parameters.DeviceIoControl.OutputBufferLength;
       
	switch(uIoControlCode) {

		case IOCTL_HELLO1: 
		{
			pucBuffs  =  pIoBuffer;
			jinchengming = pucBuffs;
			dprintf("[madaxian] Hello\n");
          PsSetCreateProcessNotifyRoutine(ProcessCallback, FALSE);
              DbgPrint("%s",jinchengming);

          

			status = STATUS_SUCCESS;
		}
		break;

		//
		// 添加执行代码
		//

	}

	if(status == STATUS_SUCCESS)
		pIrp->IoStatus.Information = uOutSize;
	else
		pIrp->IoStatus.Information = 0;
	
	/////////////////////////////////////
	pIrp->IoStatus.Status = status;
	IoCompleteRequest(pIrp, IO_NO_INCREMENT);

	return status;
}

VOID
ProcessCallback(
    IN HANDLE                ParentId,         
    IN HANDLE                ProcessId,        
    IN BOOLEAN               Create          
)
{


   DbgPrint("%s",jinchengming);
   

}

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
2
pIoBuffer = pIrp->AssociatedIrp.SystemBuffer;
pucBuffs  =  pIoBuffer;
jinchengming = pucBuffs;

这使得jinchengming =pIrp->AssociatedIrp.SystemBuffer
注意,这个SystemBuffer,只在这一次IRP_MJ_DEVICE_CONTROL运行期间有效,当调用IoCompleteRequest之后这段作为缓冲区的内核内存就被释放了,因此这个地址不再有效了。

在这里楼主使用了PsSetCreateProcessNotifyRoutine注册了一个创建进程的回调,注意,这个函数只是把回调函数挂上去就返回了,而并没有等待回调函数被触发。这样这个函数返回之后,驱动DbgPrint了一下之后就调用IoCompleteRequest返回了。
当驱动调用IoCompleteRequest返回时,新进程尚未创建,当新进程创建触发回调函数时,原来驱动调用早已返回,jinchengming保存的这个原来的pIrp->AssociatedIrp.SystemBuffer地址早已失效,DbgPrint出来的当然是一团乱码。

关键是:jinchengming保存的是一个指针,jinchengming变量虽然是全局变量,但是它的值对应的缓冲区并不一直有效。
2009-9-13 21:19
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
楼主打好基础再来吧,太混乱了…
2009-9-13 22:09
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
看的头晕 呵呵  继续努力
2009-9-14 09:06
0
游客
登录 | 注册 方可回帖
返回
//