能力值:
( LV9,RANK:850 )
|
-
-
2 楼
沙发学习
|
能力值:
( LV6,RANK:90 )
|
-
-
3 楼
不错 有创意
|
能力值:
( LV12,RANK:1010 )
|
-
-
4 楼
谢谢分享~~
|
能力值:
( LV9,RANK:610 )
|
-
-
5 楼
现在觉得似乎把存储结构改成链表会好一点?毕竟不像系统那样只有8个,不过影响不大
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
不错,processnotify确实有嚼头、
|
能力值:
( LV12,RANK:760 )
|
-
-
7 楼
过年了该娱乐一下了
|
能力值:
( LV7,RANK:100 )
|
-
-
8 楼
好帖子,类似于地址总线扩展的概念,支持~~~
|
能力值:
( LV9,RANK:170 )
|
-
-
9 楼
不错,不过蹲坑是个无耻的办法啊
|
能力值:
( LV9,RANK:610 )
|
-
-
10 楼
你是说强占别人的坑吗?不无耻,善后工作做好就行了
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
学习 感谢楼主分享。
|
能力值:
( LV5,RANK:60 )
|
-
-
12 楼
能否解释一下
pRoutineAddr=(PULONG)((char*)PsSetCreateProcessNotifyRoutineArrary[0]-3);
PsSetCreateProcessNotifyRoutineArrary不是一个数组吗,-3指向哪个位置,还有这个数组是怎样一个结构 。
谢谢
|
能力值:
( LV9,RANK:610 )
|
-
-
13 楼
结构定义在WRK中有啊
|
能力值:
( 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 是怎么回事,能解析一下吗?
谢谢
|
能力值:
( 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是个相当不错的参考资料,好好利用~~~~~~~
|
能力值:
( LV5,RANK:60 )
|
-
-
16 楼
[QUOTE=achillis;593781]答案其实还在WRK中啊,自已分析学的效果会更好~~
我这么写一下吧:
PsSetCreateProcessNotifyRoutineArrary[0]-3
=PsSetCreateProcessNotifyRoutineArrary[0]-7+4
再给出几个定义:
EX_CALLB...[/QUOTE]
谢谢楼主,顶了慢慢看
|
|
|