找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 13373|回复: 11

由EProcess从最底层获取进程路径

 火.. [复制链接]

2

主题

11

回帖

0

精华

铜牌会员

积分
127
发表于 2010-6-28 01:20:57 | 显示全部楼层 |阅读模式
获取进程路径的方法很多,如读命令行、GetModuleFileNameEx,PsSetLoadImageNotify等,不管Ring0还是3,这些都不是从根本上得到,周日闲暇蛋疼时研究了下,若该方法已经被广泛使用而只有我小菜鸟自作多情请高手谅解。…主要参考了Win2K的PspCreateProcess等代码。方法:ObQueryNameString EProcess.SectionObject-〉Segment-〉ControlArea-〉FilePointer,可以自己实ObQuery...

280

主题

203

回帖

0

精华

版主

积分
1808
发表于 2010-6-28 01:33:13 | 显示全部楼层
http://www.kanxue.com/showthread.php?t=111060

  1. extern POBJECT_TYPE *PsProcessType;

  2. NTKERNELAPI
  3. UCHAR *
  4. PsGetProcessImageFileName(
  5.               PEPROCESS Process);

  6. NTKERNELAPI
  7. NTSTATUS
  8. ObQueryNameString(
  9.           IN  PVOID Object,
  10.           OUT POBJECT_NAME_INFORMATION ObjectNameInfo,
  11.           IN  ULONG Length,
  12.           OUT PULONG ReturnLength);

  13. //路径解析出子进程名
  14. VOID  GetSonName( char *ProcessPath, char *ProcessName )
  15. {
  16.   ULONG n = strlen( ProcessPath) - 1;
  17.   ULONG i = n;
  18.   //KdPrint(("%d",n));
  19.   while( ProcessPath[i] != '\\')
  20.   {
  21.     i = i-1;
  22.   }
  23.   strncpy( ProcessName,ProcessPath+i+1,n-i);
  24. }

  25. //依据EPROCESS得到进程全路径
  26. VOID GetFullPathByEprocess( ULONG eprocess,PCHAR ProcessImageName )
  27. {
  28.   //原理Eprocess->sectionobject(0x138)->Segment(0x014)->ControlAera(0x000)->FilePointer(0x024)->(FileObject->FileName,FileObject->DeviceObject)
  29.   ULONG object;
  30.   PFILE_OBJECT FileObject;
  31.   UNICODE_STRING FilePath;
  32.   UNICODE_STRING DosName;
  33.   STRING AnsiString;

  34.   FileObject = NULL;
  35.   FilePath.Buffer = NULL;
  36.   FilePath.Length = 0;
  37.   *ProcessImageName = 0;  
  38.   
  39.   if(MmIsAddressValid((PULONG)(eprocess+0x138)))//Eprocess->sectionobject(0x138)
  40.   {
  41.     object=(*(PULONG)(eprocess+0x138));
  42.         //KdPrint(("[GetProcessFileName] sectionobject :0x%x\n",object));
  43.     if(MmIsAddressValid((PULONG)((ULONG)object+0x014)))
  44.     {
  45.       object=*(PULONG)((ULONG)object+0x014);
  46.       //KdPrint(("[GetProcessFileName] Segment :0x%x\n",object));
  47.       if(MmIsAddressValid((PULONG)((ULONG)object+0x0)))
  48.       {
  49.         object=*(PULONG)((ULONG_PTR)object+0x0);
  50.         //KdPrint(("[GetProcessFileName] ControlAera :0x%x\n",object));
  51.         if(MmIsAddressValid((PULONG)((ULONG)object+0x024)))
  52.         {
  53.           object=*(PULONG)((ULONG)object+0x024);
  54.           //KdPrint(("[GetProcessFileName] FilePointer :0x%x\n",object));
  55.         }
  56.         else
  57.           return ;
  58.       }
  59.       else
  60.         return ;
  61.     }
  62.     else
  63.       return ;
  64.   }
  65.   else
  66.     return ;
  67.     FileObject=(PFILE_OBJECT)object;

  68.   FilePath.Buffer = ExAllocatePool(PagedPool,0x200);
  69.   FilePath.MaximumLength = 0x200;
  70.     //KdPrint(("[GetProcessFileName] FilePointer :%wZ\n",&FilePointer->FileName));
  71.   ObReferenceObjectByPointer((PVOID)FileObject,0,NULL,KernelMode);//引用计数+1,操作对象
  72.   
  73.   RtlVolumeDeviceToDosName(FileObject-> DeviceObject, &DosName);
  74.   RtlCopyUnicodeString(&FilePath, &DosName);
  75.   RtlAppendUnicodeStringToString(&FilePath, &FileObject->FileName);
  76.   ObDereferenceObject(FileObject);
  77.    
  78.   RtlUnicodeStringToAnsiString(&AnsiString, &FilePath, TRUE);
  79.   if ( AnsiString.Length >= 216 )
  80.   {
  81.     memcpy(ProcessImageName, AnsiString.Buffer, 0x100u);
  82.     *(ProcessImageName + 215) = 0;
  83.   }
  84.   else
  85.   {
  86.     memcpy(ProcessImageName, AnsiString.Buffer, AnsiString.Length);
  87.     ProcessImageName[AnsiString.Length] = 0;
  88.   }
  89.   RtlFreeAnsiString(&AnsiString);
  90.   ExFreePool(DosName.Buffer);
  91.   ExFreePool(FilePath.Buffer);
  92. }
  93. //
  94. VOID GetCurrentProcess(PULONG pid, PCHAR name, PCHAR path)
  95. {
  96.   PEPROCESS Cprocess;
  97.   Cprocess = PsGetCurrentProcess();
  98.   *pid = *(PULONG)((ULONG)Cprocess+0x84);
  99.   strcpy(name ,PsGetProcessImageFileName(Cprocess));
  100.   GetFullPathByEprocess((ULONG)Cprocess,path);
  101. }

  102. //根据SectionHandle得到进程全路径
  103. VOID GetFullPathBySectionHandle( HANDLE SectionHandle, PCHAR ProcessImageName )
  104. {
  105.   PVOID SectionObject;
  106.   PFILE_OBJECT FileObject;
  107.   UNICODE_STRING FilePath;
  108.   UNICODE_STRING DosName;
  109.   NTSTATUS Status;
  110.   STRING AnsiString;
  111.   
  112.   SectionObject = NULL;
  113.   FileObject = NULL;
  114.   FilePath.Buffer = NULL;
  115.   FilePath.Length = 0;
  116.   *ProcessImageName = 0;
  117.   Status = ObReferenceObjectByHandle(SectionHandle, 0, NULL, KernelMode, &SectionObject, NULL);
  118.   
  119.   if ( NT_SUCCESS(Status) )
  120.   {
  121.     FilePath.Buffer = ExAllocatePool(PagedPool,0x200);
  122.     FilePath.MaximumLength = 0x200;
  123.     FileObject = (PFILE_OBJECT)(*((ULONG *)SectionObject + 5)); // PSEGMENT
  124.     FileObject = *(PFILE_OBJECT *)FileObject; // CONTROL_AREA
  125.     FileObject = *(PFILE_OBJECT *)((ULONG)FileObject + 36); // FILE_OBJECT
  126.     ObReferenceObjectByPointer((PVOID)FileObject, 0, NULL, KernelMode);
  127.     RtlVolumeDeviceToDosName(FileObject-> DeviceObject, &DosName);
  128.     RtlCopyUnicodeString(&FilePath, &DosName);
  129.     RtlAppendUnicodeStringToString(&FilePath, &FileObject->FileName);
  130.     ObDereferenceObject(FileObject);
  131.     ObDereferenceObject(SectionObject);
  132.     RtlUnicodeStringToAnsiString(&AnsiString, &FilePath, TRUE);
  133.     if ( AnsiString.Length >= 216 )
  134.     {
  135.       memcpy(ProcessImageName, AnsiString.Buffer, 0x100u);
  136.       *(ProcessImageName + 215) = 0;
  137.     }
  138.     else
  139.     {
  140.       memcpy(ProcessImageName, AnsiString.Buffer, AnsiString.Length);
  141.       ProcessImageName[AnsiString.Length] = 0;
  142.     }
  143.     RtlFreeAnsiString(&AnsiString);
  144.     ExFreePool(DosName.Buffer);
  145.     ExFreePool(FilePath.Buffer);
  146.   }
  147. }
  148. //根据ProcessHandle得到EPROCESS  然后得到进程全路径
  149. VOID GetFullPathByProcessHandle( HANDLE ProcessHandle, PCHAR ProcessImageName , PULONG pid )
  150. {
  151.   NTSTATUS status;
  152.   PVOID ProcessObject;
  153.   ULONG eprocess;
  154.   /*__asm
  155.   {
  156.     int 3
  157.   }*/
  158.   status = ObReferenceObjectByHandle( ProcessHandle ,0,*PsProcessType,KernelMode, &ProcessObject, NULL);
  159.   if(!NT_SUCCESS(status))   //失败
  160.   {
  161.     DbgPrint("Object Error");
  162.     KdPrint(("[GetFullPathByProcessHandle] error status:0x%x\n",status));
  163.     return;
  164.   }
  165.   //KdPrint(("[GetTerminateProcessPath] Eprocess :0x%x\n",(ULONG)ProcessObject));
  166.   //Object转换成EPROCESS: object低二位清零
  167.   eprocess = ((ULONG)ProcessObject) & 0xFFFFFFFC;
  168.   *pid = *(PULONG)((ULONG)eprocess+0x84);
  169.   ObDereferenceObject(ProcessObject);
  170.   GetFullPathByEprocess( eprocess ,ProcessImageName);
  171. }
  172. //根据FileObject得到全路径
  173. VOID GetFullPathByFileObject( PFILE_OBJECT FileObject, PCHAR ProcessImageName)
  174. {

  175.   UNICODE_STRING FilePath;
  176.   UNICODE_STRING DosName;
  177.   STRING AnsiString;

  178.   FilePath.Buffer = NULL;
  179.   FilePath.Length = 0;
  180.   *ProcessImageName = 0;  

  181.   FilePath.Buffer = ExAllocatePool(PagedPool,0x200);
  182.   FilePath.MaximumLength = 0x200;
  183.     //KdPrint(("[GetProcessFileName] FilePointer :%wZ\n",&FilePointer->FileName));
  184.   ObReferenceObjectByPointer((PVOID)FileObject,0,NULL,KernelMode);//引用计数+1,操作对象
  185.   
  186.   RtlVolumeDeviceToDosName(FileObject-> DeviceObject, &DosName);
  187.   RtlCopyUnicodeString(&FilePath, &DosName);
  188.   RtlAppendUnicodeStringToString(&FilePath, &FileObject->FileName);
  189.   ObDereferenceObject(FileObject);
  190.    
  191.   RtlUnicodeStringToAnsiString(&AnsiString, &FilePath, TRUE);
  192.   if ( AnsiString.Length >= 216 )
  193.   {
  194.     memcpy(ProcessImageName, AnsiString.Buffer, 0x100u);
  195.     *(ProcessImageName + 215) = 0;
  196.   }
  197.   else
  198.   {
  199.     memcpy(ProcessImageName, AnsiString.Buffer, AnsiString.Length);
  200.     ProcessImageName[AnsiString.Length] = 0;
  201.   }
  202.   RtlFreeAnsiString(&AnsiString);
  203.   ExFreePool(DosName.Buffer);
  204.   ExFreePool(FilePath.Buffer);
  205. }
  206. //解析
  207. BOOLEAN StandardPrintHkey(char * path,char *realpath)
  208. {

  209.   int judgeTop;
  210.   int judgeSecond;
  211.   int judgeThird;
  212.   int  i;
  213.   int j;
  214.   int t;
  215.   int k;
  216.   int lencur;
  217.   char realname[255]={0};
  218.   j=0;
  219.   k=0;
  220.   t=0;
  221.   judgeTop=strncmp("\\REGISTRY\\USER",path,14);

  222.   if(judgeTop==0)
  223.   {
  224.   
  225.         lencur=strlen(path);
  226.         for(i=0;i<lencur;i++)
  227.         {
  228.           if(path[i]=='-')
  229.           {  
  230.           if(path[i+1]=='5')
  231.           {  
  232.             if(path[i+2]=='0')
  233.             {  
  234.               if(path[i+3]=='0')
  235.               {  if(path[i+4]=='_')
  236.                 {
  237.                 k=i+12;
  238.                 t=1;
  239.                 }  
  240.                 else
  241.                 {  
  242.                 j=i+4;
  243.                 t=1;
  244.                 }  
  245.               }
  246.             }
  247.           }
  248.           }
  249.         }

  250.         DbgPrint("[j]%d\n",j);
  251.         DbgPrint("[k]%d\n",k);
  252.         if((k==0)&&(t==1))
  253.         {
  254.         strcpy(realname,"HKEY_CURRENT_USER");
  255.         strncat(realname,&path[j],sizeof(path)-j);
  256.         DbgPrint("[HKEY_CURRENT_USER]%s",path);
  257.         }
  258.         if((j==0)&&(t==1))
  259.         {
  260.         strcpy(realname,"HKEY_CLASSES_ROOT");
  261.         strncat(realname,&path[k],sizeof(path)-k);
  262.         DbgPrint("[HKEY_CLASSES_ROOT]%s",path);
  263.         }
  264.         if(t==0)
  265.         {
  266.         strcpy(realname,"HKEY_USERS");
  267.         strncat(realname,&path[14],sizeof(path)-14);
  268.         DbgPrint("[HKEY_USER]%s",path);
  269.         }
  270.   }
  271.   else
  272.   {
  273.     judgeThird=strncmp("\\REGISTRY\\MACHINE\\SYSTEM\\ControlSet001\\Hardware Profiles\\0001",path,61);
  274.     if(judgeThird==0)
  275.     {
  276.       strcpy(realname,"HKEY_CURRENT_CONFIG");
  277.       strncat(realname,&path[61],sizeof(path)-61);
  278.       DbgPrint("[HKEY_CURRENT_CONFIG]%s",path);
  279.     }
  280.     else
  281.     {
  282.   
  283.    
  284.       strcpy(realname,"HKEY_LOCAL_MACHINE");
  285.       strncat(realname,&path[17],sizeof(path)-17);
  286.       DbgPrint("[HKEY_LOCAL_MACHINE]%s",path);

  287.   
  288.     }
  289.   }
  290. strcpy(realpath,realname);
  291. return TRUE;
  292. }
  293. //注册表根据KeyHandle得到键
  294. BOOLEAN GetRegKeyNameByHandle(HANDLE handle, char *realpath)  
  295. {

  296.   ULONG uactLength;
  297.   POBJECT_NAME_INFORMATION  pustr;
  298.   ANSI_STRING astr;
  299.   PVOID pObj;
  300.   NTSTATUS ns;
  301.   char pch[256]={0};
  302.   ns = ObReferenceObjectByHandle( handle, 0, NULL, KernelMode, &pObj, NULL );
  303.   if (!NT_SUCCESS(ns))
  304.   {
  305.     KdPrint(("111!\n"));
  306.     KdPrint(("0x%x\n",ns));
  307.     return FALSE;
  308.   }
  309.   pustr = ExAllocatePool(NonPagedPool,1024+4);

  310.   if (pObj==NULL||pch==NULL)
  311.     return FALSE;

  312.   ns = ObQueryNameString(pObj,pustr,512,&uactLength);

  313.   if (NT_SUCCESS(ns))
  314.   {
  315.     RtlUnicodeStringToAnsiString(&astr,(PUNICODE_STRING)pustr,TRUE);
  316.     strncpy(pch,astr.Buffer,256);
  317.   }
  318.   ExFreePool(pustr);
  319.   RtlFreeAnsiString( &astr );
  320.   if (pObj)
  321.   {
  322.     ObDereferenceObject(pObj);
  323.   }
  324.   StandardPrintHkey(pch,realpath);
  325.   return TRUE;
  326. }
  327. //UnicodeTochar
  328. VOID UnicodeTochar(PUNICODE_STRING dst , char *src)
  329. {
  330.   ANSI_STRING string;
  331.   RtlUnicodeStringToAnsiString(&string,dst, TRUE);
  332.   strcpy(src,string.Buffer);
  333.   RtlFreeAnsiString(&string);
  334. }
  335. //wcharTochar
  336. VOID WcharToChar(PWCHAR src,PCHAR dst)
  337. {
  338.   UNICODE_STRING uString;
  339.   ANSI_STRING aString;
  340.   RtlInitUnicodeString(&uString,src);
  341.   RtlUnicodeStringToAnsiString(&aString,&uString,TRUE);
  342.   strcpy(dst,aString.Buffer);
  343.   RtlFreeAnsiString(&aString);
  344. }
复制代码

2

主题

11

回帖

0

精华

铜牌会员

积分
127
 楼主| 发表于 2010-6-28 01:44:13 | 显示全部楼层
呵呵,有种被ls嘲讽的感觉…ls' qq i wonna... 今天第一天手机上,以后常来学习哈

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2010-6-28 12:50:58 | 显示全部楼层
;P支持技术火拼
我就是嗷嗷叫的老马了......

23

主题

117

回帖

1

精华

银牌会员

积分
400
发表于 2010-6-28 14:19:45 | 显示全部楼层
回复 2# 乔丹二世


    这个功能的话。。。。。PsLookProcessByProcessId活的EPROCESS,然后EPROCESS的结构体里有相应的字段。。。你这么做太麻烦了

280

主题

203

回帖

0

精华

版主

积分
1808
发表于 2010-6-28 16:50:40 | 显示全部楼层
呵呵,有种被ls嘲讽的感觉…ls' qq i wonna... 今天第一天手机上,以后常来学习哈
HeavenSea 发表于 2010-6-28 01:44



我可没有嘲讽你的意思。

280

主题

203

回帖

0

精华

版主

积分
1808
发表于 2010-6-28 16:51:07 | 显示全部楼层
回复  乔丹二世


    这个功能的话。。。。。PsLookProcessByProcessId活的EPROCESS,然后EPROCESS的结 ...
364589886 发表于 2010-6-28 14:19


那您的意思是?
直接使用ZwQueryInformationProcess获得?

2

主题

11

回帖

0

精华

铜牌会员

积分
127
 楼主| 发表于 2010-6-28 22:59:04 | 显示全部楼层
Re:364589886 是指EProcess.ImageName。这里可不是要那个哦。

2

主题

11

回帖

0

精华

铜牌会员

积分
127
 楼主| 发表于 2010-6-28 23:01:30 | 显示全部楼层
不知换调FilePointer能否骗过ARKs,没空弄了,纸上谈并中…

280

主题

203

回帖

0

精华

版主

积分
1808
发表于 2010-6-29 00:10:07 | 显示全部楼层
不知换调FilePointer能否骗过ARKs,没空弄了,纸上谈并中…
HeavenSea 发表于 2010-6-28 23:01



可以,不过要小心,很有可能蓝屏。
如果要骗过ARKs,听TA说,可以使用“进程注入”的方式创建进程。

2

主题

11

回帖

0

精华

铜牌会员

积分
127
 楼主| 发表于 2010-6-29 00:47:11 | 显示全部楼层
所谓“进程注入” ?大牛说下

280

主题

203

回帖

0

精华

版主

积分
1808
发表于 2010-6-29 01:08:29 | 显示全部楼层
所谓“进程注入” ?大牛说下
HeavenSea 发表于 2010-6-29 00:47


你自己网上搜索一下呗。
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表