首页
社区
课程
招聘
枚举系统内核,很简单的问题,进来看下。。。。
发表于: 2012-3-2 15:11 6553

枚举系统内核,很简单的问题,进来看下。。。。

2012-3-2 15:11
6553
话说,我想多开,然后就研究了一下怎么多开,在看雪看到了这份代码,不全,左搜搜,右搜搜,终于弄全了,编译没问题。于是写了个例子程序,来多开的。结果找不到对应的系统内核对象,话不多说了,上代码,代码之下无秘密。求高人指点出的问题在哪。
一:例 子程序(对话框。)
	HANDLE   h; 
	if   (!(h=CreateMutex(NULL,TRUE, "Design"))) 
	{ 
		MessageBox(NULL, "创建Mutex失败! ", "Design1 ",MB_OK|MB_SYSTEMMODAL); 
		return   FALSE; 
	} 
	if   (GetLastError()==ERROR_ALREADY_EXISTS) 
	{ 
		MessageBox(NULL, "已有design的一个实例在运行,   当前实例将被终止! ", 
			"design ",MB_OK|MB_SYSTEMMODAL); 
		return   FALSE; 
	}else   ReleaseMutex(h);


二:枚举内核对象并关闭
bool CloseObjectByName(char  *pObjectName, DWORD porcessid)
{
  int i;
  ULONG pid;
  ULONG ulSize;
  ULONG* pHandleInfor;
  CHAR pName[200];
  NTSTATUS ntStatus;
  HMODULE hHanlde;
  POBJECT_NAME_INFORMATION ObjName;
  PSYSTEM_HANDLE_INFORMATION_EX Handles;
  ZWQUERYOBJECT ZwQueryObject;
  ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation;
  
  
  //初始化变量
  ulSize = 0x4000;
  pHandleInfor = NULL;
  ZwQueryObject = NULL;
  ZwQuerySystemInformation =NULL;


  //由于ZwQueryObject和ZwQuerySystemInformation是未导出的函数,需要动态加载Ntdll,dll,然后通过函数GetProcAddress
  //得到它们的函数地址,由于这个dll一般的进程都会在创建的时候加载,所以省略加载,直接获取其模块地址
  hHanlde = GetModuleHandle("ntdll.dll");
  if(NULL == hHanlde)
  {
    //加载Ntdll.dll失败
    return false;
  }

  //获取ZwQuerySystemInformation函数地址  
  ZwQuerySystemInformation = (ZWQUERYSYSTEMINFORMATION)GetProcAddress(hHanlde, "ZwQuerySystemInformation");
  if(NULL == ZwQuerySystemInformation)
  {
    //获取ZwQuerySystemInformation函数地址失败
    return false;
  }
  
  //获取ZwQueryObject函数地址
  ZwQueryObject = (ZWQUERYOBJECT)GetProcAddress(hHanlde, "ZwQueryObject");
  if(NULL == ZwQueryObject)
  {
    //获取ZwQueryObject函数地址失败
    return false;
  }

  //获取系统所有句柄信息
  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();
  pid = porcessid;

  //申请空间,用于存储对象的名字信息
     ObjName =  (POBJECT_NAME_INFORMATION)malloc(0x2000 );
     
  //开始搜索获取的句柄信息,并对句柄对应的对象名进行比较,如果与要求关闭的名字相同,则关闭此句柄
  for(i = 0; i < Handles->NumberOfHandles; i++)
  {  
    
    //对于不是本进程的句柄对象,直接pass掉,如果要实现关闭其它进程的对象,则可以首先根据PID打开这个句柄所在的进程,
    //然后复制此对象,然后进行名字比较,如果相同,则可以通过创建远程线程的方式,关闭掉。
    if(pid != Handles->Information[i].ProcessId)
    {      
      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, "Design"))
	{
		CloseHandle((HANDLE)Handles->Information[i].Handle);
	}
    if( 0 == strcmp(pName, pObjectName))
    {
      //找到对应名字的对象,将其关闭
      CloseHandle((HANDLE)Handles->Information[i].Handle);
    }
  }
  
  //释放申请的空间
  free(Handles);
  free(ObjName);

  return true;
}


结果:悲具呀,不管咋样,都找不到名为 Design 的对象,也就关闭不了,打开不了多份那个对话框程序了。求指点。

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

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 90
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
忘 了贴调用的代码,这里贴上。

	DWORD hProcId;
        //获取窗口句柄
	HWND gWnd = ::FindWindow(NULL, "CTestDlg");
	if(gWnd)
	{
		GetWindowThreadProcessId(gWnd,&hProcId);  //获取进程ID
		CloseObjectByName("CTestDlg", hProcId);
	}
2012-3-2 15:13
0
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
关不掉 就HOOK呗
2012-3-2 16:36
0
雪    币: 90
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
怎么hook,我主要是想弄明白上面的代码怎么就不行呢?
2012-3-2 16:51
0
雪    币: 111
活跃值: (57)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
使用DuplicateHandle或者ZwDuplicateObject复制一个句柄,
最后一个参数设置成DUPLICATE_CLOSE_SOURCE
#define DUPLICATE_CLOSE_SOURCE      0x00000001  
这样就有权限关闭了,如果有其他保护程序,那就得另外想办法了,可以先试试看这个方法
2012-3-7 19:51
0
雪    币: 139
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
也来学习学习,
2012-3-10 00:12
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
新手总是在等待“必要的时候有人一句提醒会让自己有豁然开朗的感觉。。。。”
2012-3-30 22:45
0
游客
登录 | 注册 方可回帖
返回
//