wcyht234
驱动牛犊
驱动牛犊
  • 注册日期2003-10-28
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分69分
  • 威望20点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
阅读:2380回复:14

PsSetCreateProcessNotifyRoutine 却得到了父进程

楼主#
更多 发布于:2005-07-04 18:54
  当进程建立的时候,我想利用 PsSetCreateProcessNotifyRoutine ,然后 使用PsLookupProcessByProcessId 得到 PEPROCESS ,从而得到进程所对应的全路径(ImagePathName),但是这个时候为什么得到的时父进程的信息呢?
wywwwl
驱动大牛
驱动大牛
  • 注册日期2002-08-16
  • 最后登录2018-04-07
  • 粉丝1
  • 关注0
  • 积分-10分
  • 威望135点
  • 贡献值6点
  • 好评度76点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2005-07-15 11:03
下面是引用zhaock于2005-07-15 10:19发表的:
peb 没有内容,我的全路径是从哪里来的?中文的我再专门测试一下看。你最初的想法是不对的!!
>>这个时候访问地址空间中的内容和新进程运行后(执行一个指令后)访问内容应该是不同得。
当然不完全相同,这个时候,新线程还没有进行apc的调度,没有完成隐含动态库的加载等工作,但对于我们
取全路径名已经没有问题了,这和中文,英文的没有什么关系。
以前只能靠反汇编,现在有源代码了,看看不就都明白了。我的实现已经作为商业软件跑了很久了,中文也肯定没有问题。


再回调中,不含中文路进是可以得。含中文得缺不能或者只能获取部分。这个是我实际测试得结果。
为啥,我也不知道。不要怀疑unicode没处理好。
不知道你用的啥方法?我用的是回调中,和用户态交互,获取路径。这个方法就是这样。
琢磨悟真知
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2005-07-15 10:19
peb 没有内容,我的全路径是从哪里来的?中文的我再专门测试一下看。你最初的想法是不对的!!
>>这个时候访问地址空间中的内容和新进程运行后(执行一个指令后)访问内容应该是不同得。
当然不完全相同,这个时候,新线程还没有进行apc的调度,没有完成隐含动态库的加载等工作,但对于我们
取全路径名已经没有问题了,这和中文,英文的没有什么关系。
以前只能靠反汇编,现在有源代码了,看看不就都明白了。我的实现已经作为商业软件跑了很久了,中文也肯定没有问题。
wywwwl
驱动大牛
驱动大牛
  • 注册日期2002-08-16
  • 最后登录2018-04-07
  • 粉丝1
  • 关注0
  • 积分-10分
  • 威望135点
  • 贡献值6点
  • 好评度76点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2005-07-15 09:14
下面是引用zhaock于2005-07-13 17:31发表的:
我试过所有的系统,(中文名没有特别留意过),没有问题,至少证明了这个时候,peb都已经建立好了,至少证明了这个时候,peb都已经建立好了,实际上此时子进程的地址空间完全建立好
了,第一个主线程也已经建立,看看PspCreateThread这个函数就都明了了


那你就测试一下中文路径。
peb建立好了不行,得有内容才可以。
这个时候访问地址空间中得内容和新进程运行后(执行一个指令后)访问内容应该是不同得。
琢磨悟真知
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2005-07-13 17:31
我试过所有的系统,(中文名没有特别留意过),没有问题,至少证明了这个时候,peb都已经建立好了,至少证明了这个时候,peb都已经建立好了,实际上此时子进程的地址空间完全建立好
了,第一个主线程也已经建立,看看PspCreateThread这个函数就都明了了
wywwwl
驱动大牛
驱动大牛
  • 注册日期2002-08-16
  • 最后登录2018-04-07
  • 粉丝1
  • 关注0
  • 积分-10分
  • 威望135点
  • 贡献值6点
  • 好评度76点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2005-07-13 16:11
下面是引用zhaock于2005-07-13 13:05发表的:
你的理解有问题,PsSetCreateProcessNotifyRoutine的时候,peb都已经建立好了.建议去看看windows源代码,我已经实现了,没有问题.看完以后,如果还有问题,我再和你讨论
当机是另外的原因,这个时候,peb中取全路径名字的时候,和正常情况下,是有差别,只要实际设个断点,跟踪一下就知道了


你换个系统试试,或者在路径中包含一些中文路径名字看看!估计你是2k的系统吧
琢磨悟真知
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2005-07-13 13:05
你的理解有问题,PsSetCreateProcessNotifyRoutine的时候,peb都已经建立好了.建议去看看windows源代码,我已经实现了,没有问题.看完以后,如果还有问题,我再和你讨论
当机是另外的原因,这个时候,peb中取全路径名字的时候,和正常情况下,是有差别,只要实际设个断点,跟踪一下就知道了
wywwwl
驱动大牛
驱动大牛
  • 注册日期2002-08-16
  • 最后登录2018-04-07
  • 粉丝1
  • 关注0
  • 积分-10分
  • 威望135点
  • 贡献值6点
  • 好评度76点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2005-07-13 09:56
下面是引用wcyht234于2005-07-12 13:27发表的:
我使用KeAttachProcess/KeDetachProcess切换进程地址空间后,使用原来的方法从PEPROCESS 得到ImagePathName, 就荡机了。

如果说进程建立的时候是在父进程的地址空间,那为什么得到的进程名是对的,而ImagePathName是父进程的 。按理说这个时候因为在父进程的地址空间,进程名也应该是父进程的。


荡机就对了。你keattachprocess的目的进程根本就不存在!因为创建新进程的进程,只是创建了一个内核对象,并不表示新的进程的存在。

“进程建立的时候是在父进程的地址空间”这个说法完全错误!
因为创建新进程的进程,只是创建了一个内核对象,你所以获得了新进程的名字,是因为对这个内核对象进行了赋值罢了。

在用户空间中要获得进程的全路径,如果通过PEB获取,必须让这个新进程执行一条指令。否则是不可能的。
在内核中,完全可以在创建进程对象后获得。
琢磨悟真知
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2005-07-12 16:36
1。EPROCESS中有个ImageFileName,16字节长,只是进程名,没有路径。因为在内核空间,无论在那个地址空间,都可以访问。只是用户空间,才存在不同进程的地址空间的问题。
2。另外对于全路径名,存在于Peb中,在用户地址空间,如果想访问,就要在此进程的地址空间里。
wcyht234
驱动牛犊
驱动牛犊
  • 注册日期2003-10-28
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分69分
  • 威望20点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-07-12 13:27
我使用KeAttachProcess/KeDetachProcess切换进程地址空间后,使用原来的方法从PEPROCESS 得到ImagePathName, 就荡机了。

如果说进程建立的时候是在父进程的地址空间,那为什么得到的进程名是对的,而ImagePathName是父进程的 。按理说这个时候因为在父进程的地址空间,进程名也应该是父进程的。
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2005-07-10 21:25
你的理解不对.就是进程地址空间的问题,我都实现过,没有什么问题.你在进程退出的时候,能够得到全路径名,就是因为这个时候就是在当前退出进程的地址空间里
wcyht234
驱动牛犊
驱动牛犊
  • 注册日期2003-10-28
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分69分
  • 威望20点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-07-10 21:21
时机不对
wcyht234
驱动牛犊
驱动牛犊
  • 注册日期2003-10-28
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分69分
  • 威望20点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-07-10 21:19
但是当进程消失的时候就能得到ImagePathName,为什么? 我认为因为当进程建立通知的时候, 是父进程根据PE的格式来装载子进程的,这个时候的子进程的ImagePathName不一定能知道的,因为子进程自身是被父进程建立的(通常是系统进程或者EXPLORER.EXE),所以是自己是不能知道自己的ImagePathName的。而只有父进程知道子进程的ImagePathName,所以这个时候根据子进程的PID向得到ImagePathName是有困难的,而父进程是能知道子进程的ImagePathName的,所以我认为应该从父进程上下工夫,就能知道CREATE的时候的NEW进程的ImagePathName的。 所以在进程建立的时候,子进程的PEPROCESS 中的ImagePathName填充的不是子进程的映像名,是父进程的。在不同的时刻使用PsLookupProcessByProcessId 得到 PEPROCESS得到ImagePathName是不一样的。我感到是WINDOWS的建立进程调用机制的问题,而不是进程空间的问题。 我的观点不一定正确,请指教。
wywwwl
驱动大牛
驱动大牛
  • 注册日期2002-08-16
  • 最后登录2018-04-07
  • 粉丝1
  • 关注0
  • 积分-10分
  • 威望135点
  • 贡献值6点
  • 好评度76点
  • 原创分0分
  • 专家分0分
  • 社区居民
13楼#
发布于:2005-07-05 16:57
下面是引用wcyht234于2005-07-04 18:54发表的PsSetCreateProcessNotifyRoutine  却得到了父进程:
  当进程建立的时候,我想利用 PsSetCreateProcessNotifyRoutine ,然后 使用PsLookupProcessByProcessId 得到 PEPROCESS ,从而得到进程所对应的全路径(ImagePathName),但是这个时候为什么得到的时父进程的信息呢?


这个时候拿不到,即使你attach到了子进程得空间
琢磨悟真知
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
14楼#
发布于:2005-07-05 14:54
如果这个时候,你想通过peb 来获得全路径,要注意此时是在父进程的地址空间里,要想察看子进程的peb,先要KeAttachProcess切换到子进程的地址空间
游客

返回顶部