注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

风雨夜归人

专业收集资料,个人爱好!

 
 
 

日志

 
 

谈谈进程句柄表  

2009-06-25 19:23:06|  分类: 外挂学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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。

  评论这张
 
阅读(1178)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017