首页
社区
课程
招聘
[原创]娱乐,扩展一下ProcessNotify~~
发表于: 2009-1-8 13:18 10796

[原创]娱乐,扩展一下ProcessNotify~~

2009-1-8 13:18
10796

这不是一个什么新话题了,但是DIY一下还是蛮有意思,纯属娱乐~~
大家都知道,Win2000,WInXp,Win2003下都只能安装8个Notify(Vista下听说是32个,看来够用了),多了不行.因为有个先来后到的问题,后来的坑满了就蹲不进去了,所以有时候我们为了跟别人和平共处,扩展一下还是有必要的.本代码只在WinXP SP2下测试通过,因为测试条件有限,所以没打算支持Vista,重在思路,重在实践!我把代码附上,如果谁愿意改成支持的也行~

上张图,27个Notify都正常工作:



附件中的testNotify.sys是专们用来测试的,它会注册9个NotifyRoutine~~
你可以把它复制多份来加载进行测试,打印的消息前面会有一个数字作为标识来区分
你可以先加载ExtendNotify.sys来完成扩展,然后注册多少个都可以~~卸载当然也是可以的~
或者你先加载testNotify.sys把8个坑占满再加载ExtendNotify.sys,依然可以正常扩展~~
实际上,上面那张图就是在虚拟机中8个坑全满的情况下再进行扩展的结果.

代码附上,有兴趣的自己看,有错误请指出~~


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

上传的附件:
收藏
免费 7
支持
分享
最新回复 (15)
雪    币: 424
活跃值: (10)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
2
沙发学习    
2009-1-8 13:32
0
雪    币: 214
活跃值: (24)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
不错    有创意
2009-1-8 13:52
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
4
谢谢分享~~
2009-1-8 13:53
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
5
现在觉得似乎把存储结构改成链表会好一点?毕竟不像系统那样只有8个,不过影响不大
2009-1-9 11:27
0
雪    币: 102
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不错,processnotify确实有嚼头、
2009-1-9 14:40
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
7
过年了该娱乐一下了
2009-1-9 21:21
0
雪    币: 247
活跃值: (10)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
8
好帖子,类似于地址总线扩展的概念,支持~~~
2009-1-12 19:36
0
雪    币: 471
活跃值: (3988)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
9
不错,不过蹲坑是个无耻的办法啊
2009-1-15 12:51
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
10

你是说强占别人的坑吗?不无耻,善后工作做好就行了
2009-1-15 16:05
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
学习 感谢楼主分享。
2009-1-23 00:58
0
雪    币: 87
活跃值: (41)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
12
能否解释一下
pRoutineAddr=(PULONG)((char*)PsSetCreateProcessNotifyRoutineArrary[0]-3);

PsSetCreateProcessNotifyRoutineArrary不是一个数组吗,-3指向哪个位置,还有这个数组是怎样一个结构 。
谢谢
2009-3-19 10:41
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
13
结构定义在WRK中有啊
2009-3-19 11:22
0
雪    币: 87
活跃值: (41)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
14
kd> dt PspCreateProcessNotifyRoutine
nt!PspCreateProcessNotifyRoutine
[8]    +0x000 RoutineBlock     : _EX_FAST_REF
kd> dt PspCreateProcessNotifyRoutine l10
nt!PspCreateProcessNotifyRoutine
[8] Cannot find specified field members.
kd> dt _EX_FAST_REF
nt!_EX_FAST_REF
   +0x000 Object           : Ptr32 Void
   +0x000 RefCnt           : Pos 0, 3 Bits
   +0x000 Value            : Uint4B

可是PsSetCreateProcessNotifyRoutineArrary[0]-3 是怎么回事,能解析一下吗?
谢谢
2009-3-19 12:29
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
15
答案其实还在WRK中啊,自已分析学的效果会更好~~
我这么写一下吧:
PsSetCreateProcessNotifyRoutineArrary[0]-3
=PsSetCreateProcessNotifyRoutineArrary[0]-7+4

再给出几个定义:
EX_CALLBACK PspCreateProcessNotifyRoutine[PSP_MAX_CREATE_PROCESS_NOTIFY];

typedef struct _EX_CALLBACK {
    EX_FAST_REF RoutineBlock;
} EX_CALLBACK, *PEX_CALLBACK;

typedef struct _EX_FAST_REF {
    union {
        PVOID Object;
	ULONG_PTR RefCnt : 3;
	ULONG_PTR Value;
    };
} EX_FAST_REF, *PEX_FAST_REF;

typedef struct _EX_RUNDOWN_REF {

#define EX_RUNDOWN_ACTIVE      0x1
#define EX_RUNDOWN_COUNT_SHIFT 0x1
#define EX_RUNDOWN_COUNT_INC   (1<<EX_RUNDOWN_COUNT_SHIFT)
    union {
        ULONG_PTR Count;
        PVOID Ptr;
    };
} EX_RUNDOWN_REF, *PEX_RUNDOWN_REF;

typedef struct _EX_CALLBACK_ROUTINE_BLOCK {
    EX_RUNDOWN_REF        RundownProtect;
    PEX_CALLBACK_FUNCTION Function;
    PVOID                 Context;
} EX_CALLBACK_ROUTINE_BLOCK, *PEX_CALLBACK_ROUTINE_BLOCK;


typedef NTSTATUS (*PEX_CALLBACK_FUNCTION ) (
    IN PVOID CallbackContext,
    IN PVOID Argument1,
    IN PVOID Argument2
    );


就是说,PspCreateProcessNotifyRoutine数组中的每一个元素其实都是一个EX_FAST_REF结构,而这个结构同时包含了对象本身及其快速引用记数两个信息,因为Windows总可以保证每个对象地址的低三位为0,因此这里低三位用于快速引用记数(句柄表中对象的低三位则用于其它标志,这是Windows里的一个习惯).这三位可以表示的最大引用记数是当然就是二进制的111,也就是7.如果一个EX_FAST_REF没有被引用(或引用后又恢复计数),它的低三位数值必然等于7.因此,EX_FAST_REF的值减去7之后才是对象的真正地址,这就是上面表达式中减7的原因.而对这个例子来说,这个对象也就是上面的EX_CALLBACK_ROUTINE_BLOCK结构.而ProcessRoutine在这个结构中的偏移为4,因此再加4就得到这个Routine的真实地址了.说得已经很细了,呵呵~~

其实这么写不算很好,应该直接屏蔽掉低三位然后再加4,像这样:
PsSetCreateProcessNotifyRoutineArrary[0]&~7+4

WRK是个相当不错的参考资料,好好利用~~~~~~~
2009-3-19 17:42
0
雪    币: 87
活跃值: (41)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
16
[QUOTE=achillis;593781]答案其实还在WRK中啊,自已分析学的效果会更好~~
我这么写一下吧:
PsSetCreateProcessNotifyRoutineArrary[0]-3
=PsSetCreateProcessNotifyRoutineArrary[0]-7+4

再给出几个定义:

EX_CALLB...[/QUOTE]

谢谢楼主,顶了慢慢看
2009-3-19 21:28
0
游客
登录 | 注册 方可回帖
返回
//