首页
社区
课程
招聘
[求助]用eprocess遍历进程的一个问题
发表于: 2009-10-7 23:12 6320

[求助]用eprocess遍历进程的一个问题

2009-10-7 23:12
6320
由于在
+0x174 ImageFileName    : [16] UChar这个位置保存的字符窜只是最大15字节长..当文件名过长时就会不完整
所以我在
+0x1f4 SeAuditProcessCreationInfo : _SE_AUDIT_PROCESS_CREATION_INFO
处取值...而打印出来的结果觉有些问题
PUNICODE_STRING buf=NULL;
       
        __try
        {
                buf=*(PUNICODE_STRING*)((PCHAR)peprocess+0x1f4);
                KdPrint(("%ws",buf->Buffer));
        }
        __except(EXCEPTION_EXECUTE_HANDLER)
        {
                KdPrint(("error"));
        }
代码是这样的
结果如下图:

为什么会有"error"和4,5行的不显示文件名?

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
2
Chinese language

unicode->ANSI
2009-10-8 00:17
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
3
1.seaduitinfo不一定填充,当第一次调用NtQueryInformationProcess(ProcessImageFileName)后才会填充,你这个机器上可能对某些进程没调用,而且在WIN2000上无此域
2.后面的文件名截断是因为你直接dbgprint中文的原因,可以先转为ANSI再打印
3.seaduitinfo是在ring0 buffer中,无需try except,但是需要判断这个域是否为空。若未空则没有(你第二个那个情况),若不考虑win2000,直接ObOpenObjectByPointer后ZwQueryInformationProcess即可获得全路径
2009-10-8 00:22
0
雪    币: 15
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
明白了,感谢ls两位大牛...非常膜拜360大牛...
2009-10-8 10:07
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
5
嘿嘿,都是360的~
2009-10-8 10:30
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
6
//取进程全路径====================================================================
//原理Eprocess->sectionobject(0x138)->Segment(0x014)->ControlAera(0x000)->FilePointer(0x024)->(FileObject->FileName,FileObject->DeviceObject)
void GetProcessPath(ULONG eprocess,CHAR ProcessPath[256])
{
	ULONG object;
	PFILE_OBJECT FilePointer;
	UNICODE_STRING path;  //路径
	UNICODE_STRING name;  //盘符
	ANSI_STRING  string;
	path.Length=0;
    path.MaximumLength=256;
	path.Buffer=(PWCHAR)ExAllocatePoolWithTag(NonPagedPool,256,MEM_TAG);     //必须释放
	if(MmIsAddressValid((PULONG)(eprocess+0x138)))//Eprocess->sectionobject(0x138)
	{
		object=(*(PULONG)(eprocess+0x138));
        KdPrint(("[GetProcessFileName] sectionobject :0x%x\n",object));
		if(MmIsAddressValid((PULONG)((ULONG)object+0x014)))
		{
			object=*(PULONG)((ULONG)object+0x014);
			KdPrint(("[GetProcessFileName] Segment :0x%x\n",object));
			if(MmIsAddressValid((PULONG)((ULONG)object+0x0)))
			{
				object=*(PULONG)((ULONG_PTR)object+0x0);
				KdPrint(("[GetProcessFileName] ControlAera :0x%x\n",object));
				if(MmIsAddressValid((PULONG)((ULONG)object+0x024)))
				{
					object=*(PULONG)((ULONG)object+0x024);
					KdPrint(("[GetProcessFileName] FilePointer :0x%x\n",object));
				}
				else
					return ;
			}
			else
				return ;
		}
		else
			return ;
	}
	else
		return ;
    FilePointer=(PFILE_OBJECT)object;
    //KdPrint(("[GetProcessFileName] FilePointer :%wZ\n",&FilePointer->FileName));
	ObReferenceObjectByPointer((PVOID)FilePointer,0,NULL,KernelMode);//引用计数+1,操作对象
	RtlVolumeDeviceToDosName(FilePointer->DeviceObject,&name); //获取盘符名
	//KdPrint(("[GetProcessFileName] FilePointer :%wZ\n",&name));
    RtlCopyUnicodeString(&path,&name);//盘符连接
	RtlAppendUnicodeStringToString(&path,&FilePointer->FileName);//路径连接
	//KdPrint(("[GetProcessFileName] FilePointer :%wZ\n",&path));
	ObDereferenceObject(FilePointer);         //关闭对象引用
	//需要转换成ANSI_STRING,然后在转换成char输出给ring3
	RtlUnicodeStringToAnsiString(&string,&path,TRUE);    //释放内存
	if(string.Length >= 256 ) //保证以\0结尾
	{ 
		memcpy(ProcessPath, string.Buffer, 256); 
		*(ProcessPath + 255) = 0; 
	} 
	else 
	{ 
		memcpy(ProcessPath, string.Buffer, string.Length); 
		ProcessPath[string.Length] = 0; 
	}
	ExFreePool(path.Buffer); //释放
	RtlFreeAnsiString(&string);//释放
}
2009-10-8 13:45
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
7
等我毕业也去360
2009-10-8 13:47
0
游客
登录 | 注册 方可回帖
返回
//