首页
社区
课程
招聘
[求助]inline hook NtQueryDirectoryFile遇到的问题
发表于: 2010-10-11 16:44 3004

[求助]inline hook NtQueryDirectoryFile遇到的问题

2010-10-11 16:44
3004
NTSTATUS MyNtQueryDirectoryFile(
  IN  HANDLE FileHandle,
  IN  HANDLE Event OPTIONAL,
  IN  PIO_APC_ROUTINE ApcRoutine OPTIONAL,
  IN  PVOID ApcContext OPTIONAL,
  OUT PIO_STATUS_BLOCK IoStatusBlock,
  OUT PVOID FileInformation,
  IN  ULONG Length,
  IN  FILE_INFORMATION_CLASS FileInformationClass,
  IN  BOOLEAN ReturnSingleEntry,
  IN  PUNICODE_STRING FileName OPTIONAL,
  IN  BOOLEAN RestartScan
  )
{
         
       

        //调用原函数
        RtlInitAnsiString(&HideDirFile,"abc");
        rc=OriginalNtQueryDirectoryFile(FileHandle,Event,ApcRoutine,ApcContext,IoStatusBlock,FileInformation,Length,FileInformationClass,ReturnSingleEntry,FileName,RestartScan);
        
         if(NT_SUCCESS(rc)&&FileInformationClass==FileBothDirectoryInformation)
         {
        
         newLenth = Length;
         
        currentDirInfo = (PFILE_BOTH_DIR_INFORMATION)FileInformation;

          do
    {
      offset = currentDirInfo->NextEntryOffset;
      RtlInitUnicodeString(&uniFileName,currentDirInfo->FileName);
      RtlUnicodeStringToAnsiString(&ansiFileName,&uniFileName,TRUE);
      RtlUnicodeStringToAnsiString(&ansiDirName,&uniFileName,TRUE);
      //DbgPrint("文件1%s",ansiFileName.Buffer);
      
      
      if( RtlCompareMemory(ansiFileName.Buffer,HideDirFile.Buffer,HideDirFile.Length ) == HideDirFile.Length)
      {
       DbgPrint("9");
        if (0 == offset)
        {
        DbgPrint("8");
          if (lastDirInfo)
          {
            DbgPrint("1");
            lastDirInfo->NextEntryOffset = 0;
            newLenth -= Length - position;
          }
          else
          {
            currentDirInfo->NextEntryOffset = 0;
            Length = 0;
            DbgPrint("2");
             return rc;
            //__asm
            //{
              //popad
              //mov esp,ebp
              //pop eax
              //mov ebp,eax
              //mov eax,rc
              //ret 0x2C
            //}
          }
           
        }
        else
        {
         DbgPrint("3");
          RtlCopyMemory(currentDirInfo, (PUCHAR)currentDirInfo + offset, Length - position - offset);
          newLenth -= offset;
          position += offset;
        }
      }
      else
      {
      
        position += offset;
        lastDirInfo = currentDirInfo;
        currentDirInfo = (PFILE_BOTH_DIR_INFORMATION)((PUCHAR)currentDirInfo + offset);
      }
    } while (0 != offset);
   //RtlFreeAnsiString(&ansiDirName);
    //RtlFreeAnsiString(&ansiFileName);

    Length = newLenth;
  }
  return rc;
  //__asm
  //{
    //popad
    //mov esp,ebp
    //pop ebp
    //mov eax,rc
    //ret 0x2C
  //}
}

Dbgview.exe中已经看到输出9,8,1了,但是打开磁盘还看得到abc目录或文件。
lastDirInfo->NextEntryOffset = 0;
好象没什么作用。
RtlCopyMemory(currentDirInfo, (PUCHAR)currentDirInfo + offset, Length - position - offset);
改成:
RtlMoveMemory(currentDirInfo, (PUCHAR)currentDirInfo + offset, Length - position - offset);
有什么区别吗?

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//