能力值:
( LV6,RANK:90 )
|
-
-
2 楼
额,
值得一提的是CmpCallback的找法,xp和win7有很大的区别, xp里面是个数组,到了win7变成了队列了
看reactos源码时,见到它使用队列来完成的,还以为楼主弄错了00!反汇编了下,这里还真跟xp不一样00!
|
能力值:
( LV9,RANK:160 )
|
-
-
3 楼
|
能力值:
( LV12,RANK:470 )
|
-
-
4 楼
引用的文字都保存到论坛一份
从CmUnRegisterCallback进去在XP有一个_CmpCallBackVector数组,数目为100,数组元素为
typedef struct _EX_FAST_REF { union { PVOID Object; ULONG_PTR RefCnt:3; ULONG_PTR Value; }; } EX_FAST_REF, *PEX_FAST_REF;
其中的Object指向的结构为
typedef struct _EX_CALLBACK_ROUTINE_BLOCK { EX_RUNDOWN_REF RundownProtect; PEX_CALLBACK_FUNCTION Function; PVOID Context;// } EX_CALLBACK_ROUTINE_BLOCK, *PEX_CALLBACK_ROUTINE_BLOCK;
而Context结构指向
typedef struct _CM_ARRY_XP { LARGE_INTEGER Cookie;// LIST_ENTRY ListEntry1;//8 ULONG UnKnown1;//16 ULONG UnKnown2;//20 ULONG UnKnown3;//24 ULONG UnKnown4;//28 ULONG UnKnown5;//32 LIST_ENTRY ListEntry2;//36 ULONG UnKnown;//44 ULONG Context;//48 ULONG UnKnown6; }CM_CONTEXT,*PCM_CONTEXT;
取得Cookie就可以实现卸载了……在XP这个Cookie居然就是注册时的系统时间……
上面那种方式很明显寻址效率超低,所以Windows7下就做了改进了,没有使用数组而是一个链表:
_CallbackListHead,这个链表连接在下面结构的第一项里(就是ListEntryHead):
typedef struct _CM_NOTIFY_ENTRY { LIST_ENTRY ListEntryHead;///初始化时指向自己 ULONG UnKnown1;//+8 ULONG UnKnown2;//12 LARGE_INTEGER Cookie;//16 ULONG Context;//+24 ULONG Function;//+28 ULONG Altitudes;//32 PVOID BufferPointer;//36 LIST_ENTRY ListEntry1;//40初始化时指向自己,没搞清楚到底指哪去 }CM_NOTIFY_ENTRY,*PCM_NOTIFY_ENTRY;
要卸载只需要遍历这个双向链表,取得Cookie就可以了……Windows7下那个Cookie值好像是去一个全局变量里取,没搞懂是在哪里设置的
|
能力值:
( LV6,RANK:80 )
|
-
-
5 楼
我去你的博客看了,多谢大牛逆向的完整的结构啊~~~
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
楼主的想法很巧妙啊....不错..我没有想到...
|
|
|