阅读:2954回复:15
转载网上一篇“如何获取用户进程全路径名”的文章
进程监视器基本上写规矩了,但有点不爽的就是监视进程的名字中不能获得完整的路径,这对监视恶意进程很不好:知道它启动了,但是却不晓得它的执行文件在哪儿.于是在网上看了看关于这个内核获得用户进程的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. |
|
最新喜欢:wingma...
|
沙发#
发布于:2007-08-13 12:09
ObQueryNameString()感觉不好用
|
|
|
板凳#
发布于:2007-08-13 16:40
我前几天也作了个进程监控的程序,在这里得到了不少帮助
最后用pscreateprocessnotifyroutine的方法 实现的,这个函数的callback里面的参数是进程id, 取出imagename 有两个问题,第一个是不同的版本eprocess的偏移量不一样,2000 上面的无论我怎么试都没成功,还有一个是imagename如果是中文的话 取出来是乱码,这两个问题实在解决不了了,就把id返回应用程序,从上面 用createsnapshot API来查找imagename, 这也有个问题,进程退出发出 notification的时候createsnapshot已经找不到相应的进程了,所以我就在 create的时候保存id和imagename...,反正就是不怎么完美,不知道 你是怎样做的,不介意的话交流交流吧。 |
|
地板#
发布于:2007-08-14 09:46
汗,偶没做监控,偶只需要得到进程全路径就可以了。不过createsnapshot API好象在2000中没有这个函数吧。。。
|
|
|
地下室#
发布于: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 其实取路径才是最郁闷的~~ |
|
5楼#
发布于:2007-08-14 17:56
引用第1楼bizhan123于2007-08-13 12:09发表的 : 直接看FileObject里的的FileName |
|
6楼#
发布于:2007-08-14 17:58
引用第2楼mikeyredmoon于2007-08-13 16:40发表的 : 你说的中文乱码是不是dbgprint出来的?你得把unicode转成ansi。ms的宽字符函数处理中文时有问题 |
|
7楼#
发布于:2007-08-15 10:38
引用第6楼vale于2007-08-14 17:58发表的 : 不是阿,那个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的 |
|
8楼#
发布于:2007-08-15 13:08
引用第7楼mikeyredmoon于2007-08-15 10:38发表的 : 没错,是这样的。一般这项也没法用,即使不是中文,文件名大于16字节就不行了。 |
|
9楼#
发布于:2007-08-23 13:14
呵呵,我的方法也是跟lz一样。但貌似要硬编码,比较郁闷。。。另外,我没有ObQueryNameString(),直接硬编,反正已经郁闷了!
|
|
10楼#
发布于:2007-11-11 05:33
这里有个关于获取进程全路径的代码
http://csdog.blog.sohu.com/55578516.html |
|
11楼#
发布于:2007-11-11 14:10
楼上说的那个2000下不支持。
|
|
|
12楼#
发布于:2007-11-11 14:10
这个方法不好~
|
|
|
13楼#
发布于:2007-11-11 14:44
MJ,除了搜索内核对象,还有什么好方法,请提示。
另外,2000下如何获得全路径?好象EPROCESS里面没有SECTION_OBJECT了 |
|
|
14楼#
发布于:2007-12-06 22:55
3.从SectionObject中获取SegmentObject.
4.从SegmentObject中获取ControlArea. 5.从ControlArea中获取FilePointer (这是一个FileObject指针). 第3步如何做呢?SegmentObject. 是什么?好像找不到 SegmentObject 这个东东啊? |
|
|
15楼#
发布于:2007-12-07 16:10
hehe
|
|
|