bizhan123
驱动小牛
驱动小牛
  • 注册日期2006-12-26
  • 最后登录2012-03-19
  • 粉丝0
  • 关注0
  • 积分1002分
  • 威望166点
  • 贡献值0点
  • 好评度125点
  • 原创分0分
  • 专家分0分
阅读:2954回复:15

转载网上一篇“如何获取用户进程全路径名”的文章

楼主#
更多 发布于:2007-08-13 12:06
进程监视器基本上写规矩了,但有点不爽的就是监视进程的名字中不能获得完整的路径,这对监视恶意进程很不好:知道它启动了,但是却不晓得它的执行文件在哪儿.于是在网上看了看关于这个内核获得用户进程的FullPath的讨论,确实有点另类,总结为6个步骤:
1.IoGetCurrentProcess()取得当前进程的EPROCESS指针.
2.在NT4.0和WIN2K中,首先取得EPROCESS中的SectionHandle,然后用ObReferenceObjectByHandle () 得到SectionObject的指针;在WinXp以上系统中可以直接在EPROCESS的结构中找到SectionObject指针.
3.从SectionObject中获取SegmentObject.
4.从SegmentObject中获取ControlArea.
5.从ControlArea中获取FilePointer (这是一个FileObject指针).
6.把FileObject作为第一个参数,调用ObQueryNameString(),返回填充OBJECT_NAME_INFORMATION结构:

typedef struct _OBJECT_NAME_INFORMATION {
UNICODE_STRING Name;
} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;

里面的UNICODE_STRING Name就是获得的进程执行文件完整路径.

经验教训:所有代码都必须执行在该进程上下文(CONTEXT)中,IRQL为PASSIVE_LEVEL.

最新喜欢:

wingmanwingma...
实用信息:www.infozobo.com
bizhan123
驱动小牛
驱动小牛
  • 注册日期2006-12-26
  • 最后登录2012-03-19
  • 粉丝0
  • 关注0
  • 积分1002分
  • 威望166点
  • 贡献值0点
  • 好评度125点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-08-13 12:09
ObQueryNameString()感觉不好用
实用信息:www.infozobo.com
mikeyredmoon
驱动牛犊
驱动牛犊
  • 注册日期2007-07-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分271分
  • 威望55点
  • 贡献值0点
  • 好评度53点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-08-13 16:40
我前几天也作了个进程监控的程序,在这里得到了不少帮助
最后用pscreateprocessnotifyroutine的方法
实现的,这个函数的callback里面的参数是进程id, 取出imagename
有两个问题,第一个是不同的版本eprocess的偏移量不一样,2000
上面的无论我怎么试都没成功,还有一个是imagename如果是中文的话
取出来是乱码,这两个问题实在解决不了了,就把id返回应用程序,从上面
用createsnapshot API来查找imagename, 这也有个问题,进程退出发出
notification的时候createsnapshot已经找不到相应的进程了,所以我就在
create的时候保存id和imagename...,反正就是不怎么完美,不知道
你是怎样做的,不介意的话交流交流吧。
bizhan123
驱动小牛
驱动小牛
  • 注册日期2006-12-26
  • 最后登录2012-03-19
  • 粉丝0
  • 关注0
  • 积分1002分
  • 威望166点
  • 贡献值0点
  • 好评度125点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-08-14 09:46
汗,偶没做监控,偶只需要得到进程全路径就可以了。不过createsnapshot API好象在2000中没有这个函数吧。。。
实用信息:www.infozobo.com
jackiefzj
驱动牛犊
驱动牛犊
  • 注册日期2004-10-28
  • 最后登录2024-03-01
  • 粉丝0
  • 关注0
  • 积分495分
  • 威望135点
  • 贡献值0点
  • 好评度58点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2007-08-14 13:13
/*----------------------------------------------------------------*/
//  NAME Offset

// windows 2000
#define    W2000_PROCESS_NAME_OFFSET        0x01FC
// windows XP
#define    XP_PROCESS_NAME_OFFSET            0x0174
// windows 2003
#define    W2003_PROCESS_NAME_OFFSET        0x0154
// windows 2003 sp1
#define    W2003_SP1_PROCESS_NAME_OFFSET        0x0164
// windows 2003 sp2
#define    W2003_SP2_PROCESS_NAME_OFFSET        0x0164

其实取路径才是最郁闷的~~  
vale
驱动牛犊
驱动牛犊
  • 注册日期2005-12-24
  • 最后登录2010-04-22
  • 粉丝0
  • 关注0
  • 积分440分
  • 威望45点
  • 贡献值0点
  • 好评度44点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-08-14 17:56
引用第1楼bizhan123于2007-08-13 12:09发表的  :
ObQueryNameString()感觉不好用

直接看FileObject里的的FileName
vale
驱动牛犊
驱动牛犊
  • 注册日期2005-12-24
  • 最后登录2010-04-22
  • 粉丝0
  • 关注0
  • 积分440分
  • 威望45点
  • 贡献值0点
  • 好评度44点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-08-14 17:58
引用第2楼mikeyredmoon于2007-08-13 16:40发表的  :
我前几天也作了个进程监控的程序,在这里得到了不少帮助
最后用pscreateprocessnotifyroutine的方法
实现的,这个函数的callback里面的参数是进程id, 取出imagename
有两个问题,第一个是不同的版本eprocess的偏移量不一样,2000
上面的无论我怎么试都没成功,还有一个是imagename如果是中文的话
.......

你说的中文乱码是不是dbgprint出来的?你得把unicode转成ansi。ms的宽字符函数处理中文时有问题
mikeyredmoon
驱动牛犊
驱动牛犊
  • 注册日期2007-07-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分271分
  • 威望55点
  • 贡献值0点
  • 好评度53点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-08-15 10:38
引用第6楼vale于2007-08-14 17:58发表的  :

你说的中文乱码是不是dbgprint出来的?你得把unicode转成ansi。ms的宽字符函数处理中文时有问题


不是阿,那个imagename定义是char[16],我一个一个字符的看就是这样的

比如说 "程序.exe"

char buffer[17];
memmove(buffer,eprocess->imagepathname);

然后看buffer的值
buffer[0]  ’程’的前一个字符
buffer[1]  ’序’的前一个字符
buffer[2]  ’.’
buffer[3]  ’e’
buffer[4]  ’x’
buffer[5]  ’e’
...

这怎么转也转不到正常的汉字阿

你得到过这个汉字的名称吗。我觉得这个玩意似乎就是得不到的,ms的任务管理器也不是在这个字段中取到的imagepathname的
vale
驱动牛犊
驱动牛犊
  • 注册日期2005-12-24
  • 最后登录2010-04-22
  • 粉丝0
  • 关注0
  • 积分440分
  • 威望45点
  • 贡献值0点
  • 好评度44点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-08-15 13:08
引用第7楼mikeyredmoon于2007-08-15 10:38发表的  :


不是阿,那个imagename定义是char[16],我一个一个字符的看就是这样的

比如说 "程序.exe"
.......

没错,是这样的。一般这项也没法用,即使不是中文,文件名大于16字节就不行了。
troylees
驱动牛犊
驱动牛犊
  • 注册日期2006-05-10
  • 最后登录2009-05-01
  • 粉丝0
  • 关注0
  • 积分678分
  • 威望128点
  • 贡献值0点
  • 好评度67点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-08-23 13:14
呵呵,我的方法也是跟lz一样。但貌似要硬编码,比较郁闷。。。另外,我没有ObQueryNameString(),直接硬编,反正已经郁闷了!
JenyCheng
驱动小牛
驱动小牛
  • 注册日期2005-07-26
  • 最后登录2021-01-24
  • 粉丝2
  • 关注0
  • 积分57分
  • 威望646点
  • 贡献值0点
  • 好评度119点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2007-11-11 05:33
这里有个关于获取进程全路径的代码
http://csdog.blog.sohu.com/55578516.html
zzzevazzz
驱动小牛
驱动小牛
  • 注册日期2002-12-27
  • 最后登录2020-06-29
  • 粉丝0
  • 关注0
  • 积分1008分
  • 威望242点
  • 贡献值0点
  • 好评度170点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2007-11-11 14:10
楼上说的那个2000下不支持。
[b][url]http://hi.baidu.com/zzzevazzz[/url][/b]
WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
12楼#
发布于:2007-11-11 14:10
这个方法不好~
驱动开发者 呵呵
bizhan123
驱动小牛
驱动小牛
  • 注册日期2006-12-26
  • 最后登录2012-03-19
  • 粉丝0
  • 关注0
  • 积分1002分
  • 威望166点
  • 贡献值0点
  • 好评度125点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2007-11-11 14:44
MJ,除了搜索内核对象,还有什么好方法,请提示。

另外,2000下如何获得全路径?好象EPROCESS里面没有SECTION_OBJECT了
实用信息:www.infozobo.com
linfeng1216
驱动小牛
驱动小牛
  • 注册日期2004-03-10
  • 最后登录2008-12-31
  • 粉丝0
  • 关注0
  • 积分818分
  • 威望89点
  • 贡献值0点
  • 好评度74点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2007-12-06 22:55
3.从SectionObject中获取SegmentObject.
4.从SegmentObject中获取ControlArea.
5.从ControlArea中获取FilePointer (这是一个FileObject指针).


第3步如何做呢?SegmentObject. 是什么?好像找不到 SegmentObject 这个东东啊?
这件事很难
paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2007-12-07 16:10
hehe
Ideas for life!
游客

返回顶部