阅读:1285回复:8
不用ddk环境,可否获得所有程序的Handle的属性?
不用ddk环境(.sys),而是通过调用未归档函数和ntoskrnl.exe中的函数,可否获得所有程序的Handle的所有属性(比如文件名...)。谢谢
|
|
沙发#
发布于:2004-06-11 19:35
理论上可以,嘿嘿......
|
|
|
板凳#
发布于:2004-06-12 19:39
不用ddk环境(.sys),而是通过调用未归档函数和ntoskrnl.exe中的函数,可否获得所有程序的Handle的所有属性(比如文件名...)。谢谢 HANDLE实际上是一个DWORD值,系统使用他来作为索引指向一个内核数据结构,不同的HANDLE有不同数据结构,比如:文件、光标、窗口、位图、DC等等。 这些数据结构在普通文档中没有说明,其实我也不确却的知道这些结构,不知道老兄对这些结构是否都知道? |
|
|
地板#
发布于:2004-06-13 12:50
内核里有个函数叫GetObjectFormHandle能通过handle找到指向对象的结构指针,不过这个函数没有符号导出,调用麻烦
|
|
地下室#
发布于:2004-06-13 13:57
内核里有个函数叫GetObjectFormHandle能通过handle找到指向对象的结构指针,不过这个函数没有符号导出,调用麻烦 那兄弟是怎样得知有GetObjectFormHandle这个函数的? 其参数是什么? |
|
|
5楼#
发布于:2004-06-14 09:27
我也觉得可以,但是我直接用,调用结果不是很好,我看到原作者用的Handle并没有sys扶植也可以做到。那位做过这样的尝试?
|
|
6楼#
发布于:2004-06-15 14:17
其实有个函数叫ZwQuerySystemInformation(我记不太清楚了,因为实在太久了)什么的可以列出所有Handle。等有时间查下资料告诉具体函数
|
|
|
7楼#
发布于:2004-06-15 23:54
请参考<<Windows 核心编程>>第三章 (内核对象).
|
|
8楼#
发布于:2004-06-17 14:18
贴一下我的代码吧,看那个不管用。
1)前面调用NtQuerySystemInformation获得了所有的HandleInfo for(int i = 0 ; i < dwMax ; i++) { if(2236 == pHandleInfo->dwPid) { DWORD dwControlCode = 0x83350000; DWORD dwObject = pHandleInfo->dwKeObject; DWORD length = 4; DWORD bufLen = 1024*2; MYOBJECTINFO aa; PIO_STATUS_BLOCK x = new IO_STATUS_BLOCK; x->Status = 0; x->Information = 1; paddr1=(PVOID)((DWORD)pd+(i*16)); aa.pid=(*(WORD *)((DWORD)paddr1+4)); aa.objaddr=*(DWORD *)((DWORD)paddr1+12); aa.objhandle = (*(WORD *)((DWORD)paddr1+10)); gethandleinfo(&aa, &length, szRetBuff, &bufLen, dwControlCode, x); } pHandleInfo++; } 2)gethandleifno函数 //具体处理的例程DWORD dwControlCode = 0x83350000 unsigned long gethandleinfo(PVOID p3,unsigned long * p4,PVOID p5,unsigned long * p6,unsigned long p7/*dwControlCode*/,PIO_STATUS_BLOCK p8) { //p3就是DEVICEIOCONTROL传入的输入BUFFER unsigned long ret; p8->Status = 0; p8->Information = 0; if(p7==0x83350000) { //83350000就是我们查句柄信息的操作请求 //p6就是输出长度字段的地址 p8->Information = *p6; ret = getinfo(p3,p5,(unsigned long)(&(p8->Information))); p8->Status = ret; return p8->Status; } else if(p7==0x83350008) { if(*(unsigned long *)p3==0xc8) { *(unsigned long *)p3=0xc8; p8->Information=0x4; return p8->Status; } else { p8->Status=0xC0000059; return p8->Status; } } else if(p7==0x8335000c) { //8335000c可以用来实现对0,8进程查找运行用户 身份的请求,直接返回内核模式下打开的句柄令牌的信息,避免用户模式下打开失败 p8->Status = ((ZwOpenProcessToken)(PROC)pZwOpenProcessToken)(*(HANDLE *)p3,8,(PHANDLE)p5); p8->Information = 4; } else { return p8->Status; } return 0; } 3)getinfo函数 unsigned long getinfo(PVOID p1,PVOID p2,unsigned long p3) { //具体的查询句柄信息的程序 HANDLE oph = (HANDLE)malloc(sizeof(HANDLE));; HANDLE dh; CLIENT_ID a2; OBJECT_ATTRIBUTES a1; long ret; unsigned long pid; unsigned long handaddr; unsigned long handleid; PVOID Object; PVOID o2; unsigned long a4; unsigned long a5; ANSI_STRING aObjName; a4 = 0; *(unsigned long *)p3=0; pid = ((PMYOBJECTINFO)p1)->pid; handleid = ((PMYOBJECTINFO)p1)->objhandle; handaddr = ((PMYOBJECTINFO)p1)->objaddr; if(pid<8 && pid >0) { //处理小于8的系统进程 } else { //大于等于8的进程在此处理 a2.UniqueProcess = (HANDLE)pid; // 这里传递的有问题 a2.UniqueThread = 0; a1.Length = 0x18; a1.RootDirectory = 0; a1.Attributes = 0; a1.ObjectName = 0; a1.SecurityDescriptor = 0; a1.SecurityQualityOfService = 0; ret = ((ZwOpenProcess)(PROC)pZwOpenProcess)(&oph,0x40,&a1,&a2); DWORD Hwd = GetLastError(); if(ret<0 || ret > 0x80000000) { free(oph); return 0xc0000022; } else { // 复制HANDLE ((ZwDuplicateObject)(PROC)pZwDuplicateObject)(oph,(HANDLE)handleid,(HANDLE)0xFFFFFFFF,&dh,0,0,2); // 关闭源HANDLE ((ZwClose)(PROC)pZwClose)(oph); // 如果dh不为0,则代表DuplicateObject成功 if(dh!=0) { // 通过HANDLE取Object ret = ((ObReferenceObjectByHandle)(PROC)pObReferenceObjectByHandle)(dh,0x80000000,0,0,&Object,0); //到这里就死悄悄了,帮我看看 ((ZwClose)(PROC)pZwClose)(dh); if(ret<0 || ret>0x80000000) return 0xc0000022; if((unsigned long)Object!=handaddr) { ((ObDereferenceObject)(PROC)pObDereferenceObject)(Object); return 0xc0000022; } } else return 0xc0000022; } } [编辑 - 6/17/04 by ghost_pig] [编辑 - 6/17/04 by ghost_pig] |
|