首页
社区
课程
招聘
[求助]获取进程的全路径遇到困难
发表于: 2009-9-18 16:10 6561

[求助]获取进程的全路径遇到困难

2009-9-18 16:10
6561
在驱动中注册进程回调函数PsSetCreateProcessNotifyRoutine后,如果进程创建或退出的时候都应该进入相应的回调函数,我在回调函数中通过PsGetCurrentProcess()获取进程的信息结构体指针PEPROCESS,然后通过偏移找到PEB结构,最后直接从ImagePathName取进程的全路径,代码如下:void        GetProcessInfo(
         IN HANDLE              ParentId,
         IN HANDLE          ProcessId,
         IN PWCHAR        pro_imageName_buf,
         IN PWCHAR        pro_full_path_buf )
{
                ULONG                                addr = 0;
                PEPROCESS                         EProcess;
                PWCHAR                                p = NULL;
                KAPC_STATE                         apc_state;
                NTSTATUS                        status = STATUS_SUCCESS;

                EProcess = PsGetCurrentProcess();
        //status = PsLookupProcessByProcessId( ProcessId, &EProcess );
        //if ( !NT_SUCCESS(status) )
        //{
                //return;
        //}
                addr = (ULONG ) EProcess;
                if(addr == 0 || addr == 0xFFFFFFFF)
                {
                        return;
                }
                //附加到该进程
                //KeStackAttachProcess( EProcess, &apc_state );
                //addr是EPROCESS中PEB*成员的地址
                addr += 0x1B0;
                //addr是PEB*

                if((addr = *(ULONG*)addr) == 0)
                {
                        //KeUnstackDetachProcess( &apc_state );
                        return;
                }
                //addr是PEB中的ProcessParameters
                addr += 0x10;
                if((addr = *(ULONG*)addr) == 0)
                {
                        //KeUnstackDetachProcess( &apc_state );
                        return;
                }
                addr += 0x3C;
                //addr是ImagePathName(UNICODE_STRING)
                if((addr = *(ULONG*)addr) == 0)
                {
                        //KeUnstackDetachProcess( &apc_state );
                        return ;
                }
                wcscpy(pro_full_path_buf,(PWCHAR)addr);
                if( (p = wcsrchr(pro_full_path_buf,L'\\')) != NULL)
                {
                        p++;
                        wcscpy(pro_imageName_buf,p);
                }
                //KeUnstackDetachProcess( &apc_state );
}
起初的时候,没有用到KeStackAttachProcess,最后发现打开记事本的时候,应该创建的是notepad.exe,但是通过上面程序得到的全路径却是C:\WINDOWS\Explorer.EXE,但是退出记事本的时候,通过上面程序获取的是C:\WINDOWS\system32\notepad.exe。这个应该是线程上下文导致,要用KeStackAttachProcess类似的函数附加到进程,但是附加后还是没作用。
  
后来,继续实验的时候,发现PsSetCreateProcessNotifyRoutine和PsGetCurrentProcess针对同一次进程回调,结果返回的EPROCESS指针的数值是不一样的。

为什么会出现这样的情况呢?如何才可以获取到真正的进程名呢?希望有人可以指点下。

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 522
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
创建的时候 PsGetCurrentProcess  取到的是父进程  
难道你认为进程会自己创建自己嘛

结束时  PsGetCurrentProcess  才是当前进程

帖的代码里已经有了  被你注释掉了
难道你认为前辈们不知道PsGetCurrentProcess  更简单?
2009-9-18 17:09
0
雪    币: 284
活跃值: (387)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
进程创建子进程的主线程的时候,运行的上下文确实是在父进程中,如果在父进程上下文中调用PsLookupProcessByProcessId获取子进程的EPROCESS,结果得到的怎么都是???值,
难道说是因为这个时候,子进程的主线程以及别的线程没跑起来,所以这个结构体才没赋值的吗?
如果我要得到,必须要配合别的函数了吗?
谢谢楼上的指点,希望继续开下偶的窍
2009-9-18 17:35
0
雪    币: 284
活跃值: (387)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
确实通过PsLookupProcessByProcessId获取到的子进程的结构体EPROCESS中,取得的ImageFileName确实是运行的子进程的名字,但是找到PEB结构后,然后获取PRTL_USER_PROCESS_PARAMETERS信息,结果发现PRTL_USER_PROCESS_PARAMETERS结构体中的ImagePathName为???

能告诉我为什么吗?
2009-9-18 17:49
0
雪    币: 522
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
进程还没有初始化完成 Peb当然取不到路径了
2009-9-19 04:38
0
雪    币: 9035
活跃值: (3686)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
我有点好奇..

楼主为什么有着现成的结构不用呢?

typedef struct _PS_CREATE_NOTIFY_INFO {
  __in SIZE_T  Size;
  union {
      __in ULONG  Flags;
      struct {
          __in ULONG  FileOpenNameAvailable : 1;
          __in ULONG  Reserved : 31;
      };
  };
  __in HANDLE  ParentProcessId;
  __in CLIENT_ID  CreatingThreadId;
  __inout struct _FILE_OBJECT  *FileObject;  //可执行映像的文件对象.有了这个拿路径还不容易么?
  __in PCUNICODE_STRING  ImageFileName; //这里就是名字.
  __in_opt PCUNICODE_STRING  CommandLine;
  __inout NTSTATUS  CreationStatus;
} PS_CREATE_NOTIFY_INFO, *PPS_CREATE_NOTIFY_INFO;
2009-9-19 05:54
0
雪    币: 284
活跃值: (387)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
PsSetCreateProcessNotifyRoutine与PsSetCreateProcessNotifyRoutineEx的参数不同,因为我是用的PsSetCreateProcessNotifyRoutine注册的回调,所以不能使用你说的这个结构体。实际上同过eprocess也可以获取到进程的句柄,然后获取进程全路径。
你的这个回调我有时间我会继续测试!

很感谢你的回复,只可惜分都送完了,很抱歉
2009-9-19 13:50
0
游客
登录 | 注册 方可回帖
返回