fancylf
驱动牛犊
驱动牛犊
  • 注册日期2007-07-29
  • 最后登录2016-06-21
  • 粉丝1
  • 关注0
  • 积分61分
  • 威望501点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:3245回复:1

测试发现重大bug,通过sectionhandle获得全路径不正确,icesword也存在同样的错误!

楼主#
更多 发布于:2010-10-23 10:42
测试发现重大bug,通过sectionhandle获得全路径不正确,icesword也存在同样的错误!
我在做hook ZwCreateProcess的时候,通过传入的Sectionhandle来获得文件全路径,在绝对大多数情况下是正确的,当时当以下情况发生时,错误。
比如:将文件 C:\test.exe 改成 C:\aaaaaaaaaaaa.exe后,发现获得的全路径同样是C:\test.exe 而不是改后的全路径名
也就是说当改成文件名很长的时候,获得的进程名就改后的名称了。
如果用IS的监视进程创建的功能查看,也出现同样的问题,
就是不知道改名后,怎么获得正确的文件全路径,
该问题困扰我几天,一直没有答案,请大牛指点,谢过!
我的代码如下:
思路: sectionhandle --》fileboject--》filename

ZwCreateProcess原型如下:

NTSYSAPI
NTSTATUS
NTAPI
ZwCreateProcess(
    OUT PHANDLE ProcessHandle,
    IN ACCESS_MASK DesiredAccess,
    IN POBJECT_ATTRIBUTES ObjectAttributes,
    IN HANDLE InheritFromProcessHandle,
    IN BOOLEAN InheritHandles,
    IN HANDLE SectionHandle OPTIONAL,
    IN HANDLE DebugPort OPTIONAL,
    IN HANDLE ExceptionPort OPTIONAL,
    IN HANDLE Unknown
);

NTSTATUS  GetFullName(HANDLE    KeyHandle,char  *fullname)  
{  
  NTSTATUS  ns;  
  PVOID  pKey=NULL,pFile=NULL;  
  UNICODE_STRING                  fullUniName;  
  ANSI_STRING                          akeyname;  
  ULONG  actualLen;  
  UNICODE_STRING  dosName;  
    
  fullUniName.Buffer=NULL;  
  fullUniName.Length=0;  
  fullname[0]=0x00;  
  ns=  ObReferenceObjectByHandle(  KeyHandle,  0,  NULL,  KernelMode,  &pKey,  NULL  )  ;  
  if(  !NT_SUCCESS(ns))  return  ns;  
  
  fullUniName.Buffer  =  ExAllocatePool(  PagedPool,  MAXPATHLEN*2);//1024*2  
  fullUniName.MaximumLength  =  MAXPATHLEN*2;  
    
  __try  
  {  
    
    pFile=(PVOID)*(ULONG  *)((char  *)pKey+20);  
    pFile=(PVOID)*(ULONG  *)((char  *)pFile);  
    pFile=(PVOID)*(ULONG  *)((char  *)pFile+36);  
    
    
    ObReferenceObjectByPointer(pFile,  0,  NULL,  KernelMode);  
    RtlVolumeDeviceToDosName(((PFILE_OBJECT)pFile)->DeviceObject,&dosName);  
    //ns=ObQueryNameString(  pFile,  fullUniName,  MAXPATHLEN,  &actualLen  );  
    RtlCopyUnicodeString(&fullUniName,  &dosName);  
    RtlAppendUnicodeStringToString(&fullUniName,&((PFILE_OBJECT)pFile)->FileName);  
    
    ObDereferenceObject(pFile);  
    ObDereferenceObject(pKey  );  
    
    RtlUnicodeStringToAnsiString(  &akeyname,  &fullUniName,  TRUE  );  
    if(akeyname.Length<MAXPATHLEN)    
    {  
      memcpy(fullname,akeyname.Buffer,akeyname.Length);  
      fullname[akeyname.Length]=0x00;  
    }  
    else  
    {  
      memcpy(fullname,akeyname.Buffer,MAXPATHLEN);  
      fullname[MAXPATHLEN-1]=0x00;  
    }  
    
    RtlFreeAnsiString(  &akeyname  );  
    ExFreePool(dosName.Buffer);  
    ExFreePool(  fullUniName.Buffer  );  
    
    return  STATUS_SUCCESS;  
    
  }  
    
  __except(1)  
  {  
    if(fullUniName.Buffer)  ExFreePool(  fullUniName.Buffer    );  
    if(pKey)  ObDereferenceObject(pKey  );  
    return  STATUS_SUCCESS;  
    
  }  
    
}



最新喜欢:

sunseasunsea
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
沙发#
发布于:2010-12-07 08:55
感谢分享。
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
游客

返回顶部