阅读:3414回复:1
测试发现重大bug,通过sectionhandle获得全路径不正确,icesword也存在同样的错误!
测试发现重大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; } } |
|
最新喜欢:sunsea |
沙发#
发布于:2010-12-07 08:55
感谢分享。
|
|
|