首页
社区
课程
招聘
[旧帖] [求助]-------------一个API---ZwQueryObject-----------------delphi高手进来看下---------源码以贴,谢谢啦 0.00雪花
发表于: 2012-6-30 23:41 1632

[旧帖] [求助]-------------一个API---ZwQueryObject-----------------delphi高手进来看下---------源码以贴,谢谢啦 0.00雪花

2012-6-30 23:41
1632
if  pid=GetCurrentProcessId() then
      begin

       ObjName.Name.Buffer:=GetMemory(500);
     Status:=ZwQueryObject(Info^.Handles[i].Handle,ObjectNameInformation,ObjName.Name.Buffer,500,@a);{这里的问题,参数错误奶奶的}       ObjName2 :=WideCharToString(ObjName.Name.Buffer);

            Memo1.Lines.add(IntToHex(Dword(Info^.Handles[i].Handle), 8) + '------' + IntToStr(Info^.Handles[i].ObjectTypeNumber) + '---------' + ObjName2);
              end ;
  end;

鸟哥谢谢你的指点,虽然没起多大作用^-^
跟着问题就来了
ObjName.Name.Buffer 里有乱码
怎样才能屏蔽掉那些乱码呢

句柄名字前都有些乱码 为什么呢

000007A8------9---------
000007AC------28---------*,鞴1\Device\WMIDataDevice
000007B0------28---------*,騔1\Device\WMIDataDevice
000007B4------17--------->@鱴1\Windows\WindowStations\WinSta0
000007B8------18---------鼔1\Default
000007BC------9---------
000007C0------17--------->@?1\Windows\WindowStations\WinSta0
000007C4------9---------
000007C8------20---------""?1\REGISTRY\MACHINE
000007CC------13---------
000007D0------13---------
000007D4------13---------
000007D8------20---------DD?1\REGISTRY\MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\DllNXOptions
000007DC------13---------
000007E0------21---------
000007E4------28---------bd?1\Device\HarddiskVolume4\高级实验源码-----内核DLL进程\nt内核句柄
000007E8------13---------
000007EC------13---------
000007F0------2---------?1\KnownDlls
000007F4------9---------
000007F8------16---------LN?1\KernelObjects\CritSecOutOfMemoryEvent
000007FC------20---------???1\REGISTRY\MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 622
活跃值: (294)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
2
msdn:请检查ZwQueryObject的返回值,若为STATUS_INFO_LENGTH_MISMATCH,则表示ObjName的缓冲区不够大(The info length is not sufficient to hold the data)。另外这个函数的输出是对象的信息,不清楚是不是里面只有一个名字。
另外看看返回值是不是STATUS_ACCESS_DENIED拒绝访问之类的。
2012-7-1 10:32
0
雪    币: 8
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
C++是这样弄的,这个是别人的资料,其中一个地很不懂,红字标注的

//获取系统所有句柄信息
  do
  {
    //申请内存
    pHandleInfor = (ULONG*)malloc(ulSize);
    if(NULL == pHandleInfor)
    {
      //申请内存失败
      return false;
    }

    ntStatus = ZwQuerySystemInformation( SystemHandleInformation, pHandleInfor, ulSize, NULL);   
    if(!NT_SUCCESS(ntStatus))
    {
      //空间不足继续申请。
      free(pHandleInfor);
      ulSize = ulSize * 2;  
      
      //为防止ZwQuerySystemInformation一直失败,程序陷入死循环,当申请的空间超过64M时则返回失败
      if(ulSize > 0x4000000)
      {
        return false;
      }
    }
  }while(!NT_SUCCESS(ntStatus));
   
  //转换数据结构类型
     Handles = (PSYSTEM_HANDLE_INFORMATION_EX)pHandleInfor;
  if(NULL == Handles)
  {
    return false;
  }

  //获取当前进程pid
  pid = GetCurrentProcessId();

  //申请空间,用于存储对象的名字信息
     ObjName =  (POBJECT_NAME_INFORMATION)malloc(0x2000 );

     {这里申请的内存是给结构体的,我申请的是结构里的Buffer的,是不是这里的问题 delphi不让给结构体分配内存,类型不匹配 结构:=指针不行,要怎么给以声明好的结构体分配内存呢}
  //开始搜索获取的句柄信息,并对句柄对应的对象名进行比较,如果与要求关闭的名字相同,则关闭此句柄
  for(i = 0; i < Handles->NumberOfHandles; i++)
  {      
    //对于不是本进程的句柄对象,直接pass掉,如果要实现关闭其它进程的对象,则可以首先根据PID打开这个句柄所在的进程,
    //然后复制此对象,然后进行名字比较,如果相同,则可以通过创建远程线程的方式,关闭掉。
    if(pid != Handles->Information[i].ProcessId)
    {      
      continue;
    }
    //获取这个对象的类型
     if (Handles->Information[i].ObjectTypeNumber != 0x0b)
    {
        //非互斥内核对象类型
         continue;
     }
    //获取这个对象的名字信息
    ntStatus = ZwQueryObject((HANDLE)Handles->Information[i].Handle, ObjectNameInformation, ObjName, 0x2000, NULL);
    if(!NT_SUCCESS(ntStatus))
    {
      //查询对象失败,进行下一个
      continue;
    }

    //将unicode 字串转换为 ansi字串
    WideCharToMultiByte(CP_ACP, 0, ObjName->Name.Buffer, -1, pName, 200, NULL, NULL);   
    if( 0 == strcmp(pName, pObjectName))
    {
      //找到对应名字的对象,将其关闭
      CloseHandle((HANDLE)Handles->Information[i].Handle);
      //释放申请的空间
      free(Handles);
      free(ObjName);
      
      return true;
    }
  }
  
  //释放申请的空间
  free(Handles);
  free(ObjName);

  return false;
}
2012-7-1 14:18
0
游客
登录 | 注册 方可回帖
返回
//