zwCreateProcess获得目标进程名
来源:互联网 发布:oracle启动数据库主页 编辑:程序博客网 时间:2024/06/18 00:04
参数KeyHandle 为SectionHandle。
解决了文件名因为缓冲机制导致的修改文件名,但获得的文件名是老名的问题。
有两种文件对象控制区域,DataSection 和 ImageSection
ImageSection :文件映像,进程退出时没被释放,而被放到空闲内存区域,以被重用
DataSection : 数据副本, 进程退出,被释放
在获得文件对象方法中,添加了
pFile = ((PFILE_OBJECT)pFile)->SectionObjectPointer->DataSectionObject;
pFile =(PVOID)*(ULONG *)((char *)pFile+36);
在2003上测试过,vista以上版本还没测试。
但还有一点疑问,在打开文件时,记录了文件FileObject,这里得到的FileObject还是和打开时不同,还有映像的FileObject也和打开对象不同,比较奇怪。
NTSTATUS GetFullName(HANDLE KeyHandle,char *fullname)
{NTSTATUS ns;
PVOID pKey=NULL,pFile=NULL;
UNICODE_STRING fullUniName;
ANSI_STRING akeyname;
ULONG actualLen;
UNICODE_STRING dosName;
//char name_c[260] = {0};
// PVOID datafile;
UNREFERENCED_PARAMETER(actualLen);
fullUniName.Buffer=NULL;
fullUniName.Length=0;
fullname[0]=0x00;
ns= ObReferenceObjectByHandle( KeyHandle, 0, NULL, KernelMode, &pKey, NULL ) ;
if( !NT_SUCCESS(ns))
{
return ns;
}
fullUniName.Buffer = ExAllocatePool( PagedPool, MAX_PATH_LEN*2);//1024*2
fullUniName.MaximumLength = MAX_PATH_LEN*2;
__try
{
// KdPrint(("GetFullName 0\r\n"));
pFile=(PVOID)*(ULONG *)((char *)pKey+20);
pFile=(PVOID)*(ULONG *)((char *)pFile);
pFile=(PVOID)*(ULONG *)((char *)pFile+36);
//add------ not test for vista
//因为有缓存机制,需要重datasection中获得文件名
pFile = ((PFILE_OBJECT)pFile)->SectionObjectPointer->DataSectionObject;
pFile =(PVOID)*(ULONG *)((char *)pFile+36);
//added-------
ObReferenceObjectByPointer(pFile, 0, NULL, KernelMode);
//RtlVolumeDeviceToDosName(((PFILE_OBJECT)pFile)->DeviceObject,&dosName);
IoVolumeDeviceToDosName(((PFILE_OBJECT)pFile)->DeviceObject,&dosName);
//ns=ObQueryNameString( pFile, fullUniName, MAX_PATH_LEN, &actualLen );
RtlCopyUnicodeString(&fullUniName, &dosName);
RtlAppendUnicodeStringToString(&fullUniName,&((PFILE_OBJECT)pFile)->FileName);
ObDereferenceObject(pFile);
ObDereferenceObject(pKey );
RtlUnicodeStringToAnsiString( &akeyname, &fullUniName, TRUE );
if(akeyname.Length<MAX_PATH_LEN)
{
memcpy(fullname,akeyname.Buffer,akeyname.Length);
fullname[akeyname.Length]=0x00;
}
else
{
memcpy(fullname,akeyname.Buffer,MAX_PATH_LEN);
fullname[MAX_PATH_LEN-1]=0x00;
}
RtlFreeAnsiString( &akeyname );
ExFreePool(dosName.Buffer);
ExFreePool( fullUniName.Buffer );
return STATUS_SUCCESS;
}
__except(1)
{
KdPrint(("GetFullName except\r\n"));
if(fullUniName.Buffer) ExFreePool( fullUniName.Buffer );
if(pKey) ObDereferenceObject(pKey );
return STATUS_SUCCESS;
}
}
- zwCreateProcess获得目标进程名
- 获得当前进程名
- 获得剪贴板来源进程名
- 获得目标进程PEB,并获得进程各种信息
- 如何从进程名获得进程ID
- 获得当前运行进程的进程名
- 函数-从进程名获得进程ID、从进程ID获得进程路径
- 获得指定进程名的进程ID列表
- Linux下通过进程名获得进程号
- Linux下通过进程名获得进程号
- 在linux中通过进程名获得进程id
- [C/C++]获得进程号PID、进程名
- 【转】ZwCreateProcess
- 根据进程名获得进程ID(不区分进程名大小写)
- 驱动层怎样获得当前进程全路径名(1)
- WINDOWS下获得端口对应的进程名1
- 用批处理获得指定进程名的pid值
- 通过调用命令行实现根据进程名获得其PID
- Linux虚拟文件系统之文件读取(sys_read())
- 谈谈struts2的工作原理
- ubuntu忘记密码,忘记root密码的解决方法
- 斐波那契数列
- spring mvc 分页
- zwCreateProcess获得目标进程名
- CSMA/CA(多路访问/冲突避免)
- funshioncharts中Xml配置参数说明
- upplemental Logging
- asp.net中viewState的应用
- C语言常见错误
- cygwin+linux+GNU工具命令
- Java调用C/C++编写的第三方dll动态链接库(非native API)--- JNI
- 软件测试停止标准