cicada
驱动小牛
驱动小牛
  • 注册日期2003-12-09
  • 最后登录2008-07-11
  • 粉丝1
  • 关注0
  • 积分74分
  • 威望15点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
阅读:1498回复:5

如何在Windows2000下查看进程的句柄表的信息?

楼主#
更多 发布于:2004-05-11 16:25
如何在Windows2000下查看进程的句柄表的信息?Windows2000进程句柄表的数据结构是什么?如何得到句柄表的地址?帮帮我啊!
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2004-05-11 17:34
INSDIE WIN2000
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
cicada
驱动小牛
驱动小牛
  • 注册日期2003-12-09
  • 最后登录2008-07-11
  • 粉丝1
  • 关注0
  • 积分74分
  • 威望15点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-05-12 08:10
有没有INSDIE WIN2000的电子版下载啊?谢谢。
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地板#
发布于:2004-05-12 08:55
有中文版 的书卖的,翻译的还凑活,嘿嘿......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
poweruser
驱动老牛
驱动老牛
  • 注册日期2003-02-26
  • 最后登录2008-07-18
  • 粉丝0
  • 关注0
  • 积分652分
  • 威望72点
  • 贡献值0点
  • 好评度64点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-05-13 16:28
使用windbg的!handle命令
老虎不发威,你当我是Hello Kitty!
poweruser
驱动老牛
驱动老牛
  • 注册日期2003-02-26
  • 最后登录2008-07-18
  • 粉丝0
  • 关注0
  • 积分652分
  • 威望72点
  • 贡献值0点
  • 好评度64点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-05-13 16:32
给你转贴一篇

谈谈进程句柄表
                     pjf   (oscar)
   Windows有许多种类的句柄,其中比较有趣的是内核对象(进程、
线程、文件、事件、互斥量等)的句柄。此HANDLE值仅仅是句柄表的
一个索引值。下面讨论一下进程句柄表相关结构以及一个应用例子:
向一个正运行程序的文件Write。
   一、Windows98、WindowsNT(NT未验证):句柄表的格式为一个DWORD
指明大小,后跟若干项,每项两DWORD:内核对象指针与标志掩码。
98上的例子:PHT Address = 0x8162C628
           Flag=0            Handle=0
           Flag=0x1F0FFF     Handle=0x8162C5E4
            ......
顺便说一句,第一项未用,第二项即为该进程句柄。0x8162C5E4即是
该进程数据库地址。
   二、Windows 2000:为了防止拷贝费时,Windows2000用一个三
级表来寻找对应项。(就可以在扩充时只用分配新内存而无需拷贝原
来各项。)
   1、首先,EPROCESS中的ObjectHandle指向表头:
             struct _OBJECT_TABLE{
                    ULONG Unkown1;//总为0
                    ULONG HandleCount;//所有有效项数
                    PVOID PAT;//最高级指针
                    PEPROCESS ThisProcess;
                    ULONG Unknown2;
                    ULONG Unknown3;
                    ULONG TotalCount;//纪录第三级表分配的内存
                                     //可容多少项
                    LIST_ENTRY link;
                      ......//??上面的名字随便取的
                    }_HANDLE_TABLE;
例子:00 00 00 00 27 00 00 00-00 D0 3B E1 20 24 85 FE
     04 02 00 00 00 1E 00 00-00 01 00 00 00 F3 CE FE
     68 DD 87 FE 00 00 00 00-00 00 00 00 00 00 00 00
                         ......
   2、上面的PAT就是一个指针数组,有256项,每项指向中级表PMT
例子:00 D4 3B E1 00 00 00 00-00 00 00 00 00 00 00 00
                         ......
   3、PMT与PAT类似,指向次级表PLT。
例子:00 D8 3B E1 00 00 00 00-00 00 00 00 00 00 00 00
                         ......
   4、PLT中每项8字节,其中第一个DWORD为内核对象的指针稍加修改,
第二项也是标志掩码。
      第一个表项未用,总为00 00 00 00 01 00 00 00,最后以项初
始化为00 00 00 00 FF FF FF FF,表结束。
例子:00 00 00 00 01 00 00 00-58 42 2D 61 1F 00 0F 00
     48 3F F4 7E 03 00 10 00-E8 F0 C4 7E 03 00 10 00
                          ......
     00 00 00 00 31 00 00 00-00 00 00 00 32 00 00 00
                          ......
     00 00 00 00 FF 00 00 00-00 00 00 00 FF FF FF FF

每项格式很清楚(见InsideWindows2000),内核对象头可由第一个DWORD
与0x80000000相或(低三位清为0)。内核对象头开始两DWORD为句柄计数
与引用计数等等,对象头偏移0x18处(未查过所有对象类型)即为实际的
内核对象。

    正在运行的程序对应的EXE文件你不能往里写东西,现在就对句柄表
和它指向的内核对象修改来实现这一点:
    用GENERIC_READ打开文件,此时不能写。传句柄给驱动,驱动找到
掩码与内核对象,改之,就可在此程序中对那个EXE肆意修改。
2000驱动片断(运行没错就草草了事了):
         PETHREAD PEThread=0;
PEPROCESS PEProcess=0;
PHANDLE_TABLE PHTable;
PFILE_OBJECT file;
ULONG index;
UCHAR pointer1,pointer2,pointer3;
switch( ControlCode)
{
case IOCTL_******:
_asm cli
PEThread=(PETHREAD)(ULONG)Irp->Tail.Overlay.Thread;
PEProcess=(PEPROCESS)PEThread->ThreadsProcess;
PHTable=PEProcess->ObjectTable;
index=((PULONG)Irp->AssociatedIrp.SystemBuffer)[0];
pointer3=(UCHAR)(index&0x000000FF);
pointer2=(UCHAR)((index&0x0000FF00)>>8);
pointer1=(UCHAR)((index&0x00FF0000)>>16);
file=(PFILE_OBJECT)((PULONG)PHTable)[2];
file=(PFILE_OBJECT)((PULONG)file)[pointer1];
file=(PFILE_OBJECT)((PULONG)file)[pointer2];
((PULONG)file)[pointer3/2+1]=0x0012019f;//可写的掩码
file=(PFILE_OBJECT)((PULONG)file)[pointer3/2];
file=(PFILE_OBJECT)((ULONG)file|0x80000000);
file=(PFILE_OBJECT)((ULONG)file+0x18);
file->WriteAccess=TRUE;//这可以不改
_asm sti
                ......

9x中简单多了,首先找出异或码可由进程ID得出进程数据库,再得出句柄表基址,就可访问,就在ring3即可,略了。对于Hume发的那个贴,你仔细在9x上由句柄表得出的“对象”中分析,但未必有收获,9x这方面远不及nt。
老虎不发威,你当我是Hello Kitty!
游客

返回顶部