利用 ZwQueryInformationProcess 获取映像全名

ZOthello 2008-07-22 01:23:23
在驱动中定义了这样一个结构,想要通过任意的HANDLE获得进程映像的路径:
typedef NTSTATUS (*QUERY_INFO_PROCESS) (
__in HANDLE ProcessHandle,
__in PROCESSINFOCLASS ProcessInformationClass,
__out_bcount(ProcessInformationLength) PVOID ProcessInformation,
__in ULONG ProcessInformationLength,
__out_opt PULONG ReturnLength
);

QUERY_INFO_PROCESS ZwQueryInformationProcess;


#define ProcessImageFileName 27

结果出错了,就是说这个函数结构定义的不对,__in ,__out都不认识,这是什么错误,难道是内核未导出这个函数,还是这样定义不对?
...全文
3036 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2008-07-23
  • 打赏
  • 举报
回复
用IoGetDeviceObjectPointer获得,用完后要用ObDereferenceObject释放。
ZOthello 2008-07-23
  • 打赏
  • 举报
回复
IoQueryFileDosDeviceName函数需要一个FileObject,我现在在函数里就得不到这个进程的FileObject,如何查找,所以不行.
cnzdgs 2008-07-23
  • 打赏
  • 举报
回复
只要WDK中有的函数就都是公开的。
ZOthello 2008-07-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 cnzdgs 的回复:]
刚看了一下WDK,这是一个未公开的函数,建议尽量先考虑用公开的方法,如果公开的方法无法达到目的再考虑未公开的。我上次提到的函数你试过了吗?
[/Quote]

怎么判断是未公开的函数?在用一个函数之前我怎么知道是公开的还是为公开的?是不是只要ntoskrnl。exe导出的函数都是公开的?

我觉得这些基本的问题我还是搞清楚比较好~~~

麻烦cnzdgs解答下,呵呵~~
ZOthello 2008-07-22
  • 打赏
  • 举报
回复
ok
感谢楼上二位,我试试
cnzdgs 2008-07-22
  • 打赏
  • 举报
回复
多年以前写的代码,早已经删除了。你先试IoQueryFileDosDeviceName吧,这个比较简单,我当时试这个函数的时候运行情况比较复杂,可能是其它限制导致我不能用这个函数,你试试或许可以用。
yjgx007 2008-07-22
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 skysolo 的回复:]
恩,貌似比较麻烦,但也只能这么做了~~~。
能不能把打开\\DosDevices\\A: ~ \\DosDevices\\Z:\\的函数贴几个
谢谢啦!!
[/Quote]
CreateFile, 判断文件是否存在(from A:\ to Z:\)
ZOthello 2008-07-22
  • 打赏
  • 举报
回复
恩,貌似比较麻烦,但也只能这么做了~~~。
能不能把打开\\DosDevices\\A: ~ \\DosDevices\\Z:\\的函数贴几个
谢谢啦!!
cnzdgs 2008-07-22
  • 打赏
  • 举报
回复
WDK中有一个函数IoQueryFileDosDeviceName,我以前试过但没有成功,具体原因记不清了。后来我用的方法是循环逐个打开\\DosDevices\\A: ~ \\DosDevices\\Z:\\,取其设备名来比较。
ZOthello 2008-07-22
  • 打赏
  • 举报
回复
怎么才能转化为正常的显示方式哩?
cnzdgs 2008-07-22
  • 打赏
  • 举报
回复
\Device\HanddiskVolume1是设备名,从系统中获得的路径都是这样表示的。
ZOthello 2008-07-22
  • 打赏
  • 举报
回复
呵呵,如何把驱动表示物理路径转化为正常的形式?
难道要要建一个表,一个个查表比较?
yjgx007 2008-07-22
  • 打赏
  • 举报
回复
#define __in // input
#define __out // return value - out

\Device\HanddiskVolume1\
这是驱动表示物理路径的方式,HanddiskVolume1表示是硬盘的第一个volume
ZOthello 2008-07-22
  • 打赏
  • 举报
回复
得到了,但是形式有点奇怪,\Device\HanddiskVolume1\WINDOWS\SYSTEM32\Wbem\wmiprvse.exe
这是个什么东西,为什么是这么显示的
怎么把形式转化为正常的形式啊?
ZOthello 2008-07-22
  • 打赏
  • 举报
回复
可以生成.SYS文件,不过貌似工作有点问题,我再看看~~
ZOthello 2008-07-22
  • 打赏
  • 举报
回复
就是那篇文章,但是我按你们说的把IN OUT 什么的都去掉后又给我出来个 warning as error 然后出错的地方以前都没有错,真是郁闷。
我觉得可以工作,再试试
多谢大家关注~~
ouyh12345 2008-07-22
  • 打赏
  • 举报
回复
在上层驱动中,利用 ZwQueryInformationProcess 获取映像全名

貌似很象啊,链接中的例子能工作吗?
ZOthello 2008-07-22
  • 打赏
  • 举报
回复
哦,你说的都是细节的问题,那这样做在整体思路上没什么问题吗?
cnzdgs 2008-07-22
  • 打赏
  • 举报
回复
ObReferenceObjectByHandle的第2参数不能给0;ObQueryNameString的第3参数不能给sizeof(Buffer),这地方我记不清了,你先试试给OBJECT_NAME_INFORMATION,如果不行,就分配一个足够大的缓冲区,再不行就初始化结构中的UNICODE_STRING成员。
ZOthello 2008-07-22
  • 打赏
  • 举报
回复
我试过了,貌似不行,我把源码给你发上来,你看看~~

ZwWriteVirtualMemory(
IN HANDLE ProcessHandle,
IN PVOID BaseAddress,
IN PVOID Buffer,
IN ULONG BufferLength,
OUT PULONG ReturnLength OPTIONAL)

hook了这个函数,想要从第一个参数得到目的进程的路径,我是这么做的:
void GetMemFullName(HANDLE hProcess,char *pname)
{
POBJECT pMemObj;
ULONG ReturnLength;
NTSTATUS ns;
ANSI_STRING procname;
WCHAR Buffer[sizeof(OBJECT_NAME_INFORMATION)+(MAXPROCNAME*sizeof(WCHAR))];

POBJECT_NAME_INFORMATION ObjectNameInfo = (POBJECT_NAME_INFORMATION)Buffer;
ObReferenceObjectByHandle( hProcess, 0, NULL, KernelMode, &pMemObj, NULL );
if(pMemObj==NULL)
{
DbgPrint("no object\n");
return;
}

ns=ObQueryNameString(pMemObj, ObjectNameInfo, sizeof(Buffer), &ReturnLength);
if (!NT_SUCCESS(ns))
{
DbgPrint("get the name error");
return;
}
ReleasePointer( POBJECT pMemObj );
RtlUnicodeStringToAnsiString( &procname, ObjectNameInfo, TRUE );//
strncpy(pname,procname->Buffer,MAXPROCNAME-1);//
strcat(pname,"\0");
RtlFreeAnsiString( &procname );

}

代码差不多就这样了,但是这样貌似得不到目的进程的路径,不知道为什么。
加载更多回复(4)

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧