ghost_pig
驱动牛犊
驱动牛犊
  • 注册日期2004-06-11
  • 最后登录2004-06-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1285回复:8

不用ddk环境,可否获得所有程序的Handle的属性?

楼主#
更多 发布于:2004-06-11 16:22
不用ddk环境(.sys),而是通过调用未归档函数和ntoskrnl.exe中的函数,可否获得所有程序的Handle的所有属性(比如文件名...)。谢谢
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2004-06-11 19:35
理论上可以,嘿嘿......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-06-12 19:39
不用ddk环境(.sys),而是通过调用未归档函数和ntoskrnl.exe中的函数,可否获得所有程序的Handle的所有属性(比如文件名...)。谢谢

HANDLE实际上是一个DWORD值,系统使用他来作为索引指向一个内核数据结构,不同的HANDLE有不同数据结构,比如:文件、光标、窗口、位图、DC等等。
这些数据结构在普通文档中没有说明,其实我也不确却的知道这些结构,不知道老兄对这些结构是否都知道?
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
duqiang2050
驱动牛犊
驱动牛犊
  • 注册日期2003-08-08
  • 最后登录2004-06-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-06-13 12:50
内核里有个函数叫GetObjectFormHandle能通过handle找到指向对象的结构指针,不过这个函数没有符号导出,调用麻烦
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-06-13 13:57
内核里有个函数叫GetObjectFormHandle能通过handle找到指向对象的结构指针,不过这个函数没有符号导出,调用麻烦

那兄弟是怎样得知有GetObjectFormHandle这个函数的?
其参数是什么?
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
ghost_pig
驱动牛犊
驱动牛犊
  • 注册日期2004-06-11
  • 最后登录2004-06-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-06-14 09:27
我也觉得可以,但是我直接用,调用结果不是很好,我看到原作者用的Handle并没有sys扶植也可以做到。那位做过这样的尝试?
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-06-15 14:17
其实有个函数叫ZwQuerySystemInformation(我记不太清楚了,因为实在太久了)什么的可以列出所有Handle。等有时间查下资料告诉具体函数
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
stanleyhe
驱动牛犊
驱动牛犊
  • 注册日期2003-06-15
  • 最后登录2006-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-06-15 23:54
请参考<<Windows 核心编程>>第三章 (内核对象).
ghost_pig
驱动牛犊
驱动牛犊
  • 注册日期2004-06-11
  • 最后登录2004-06-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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]
游客

返回顶部