返回信息流简单谈谈winxp+sp2/win2k03+sp1新增的EPROCESS.COOKIE成员
by flyingkisser 2007.9
winxp+sp2/win2k03+sp1下面,EPROCESS偏移258h处的成员是COOKIE,当然,这个成员在win2k的EPROCESS结构中
是不存在的
1.EPROCESS.COOKIE干什么用的?
因为它是一个随机值,因此广义一点说,需要用到随机值的地方都可以使用它。
这个值各个进程互不相同,同一个进程内是相同的。
当需要对某个值,如某个关键函数的地址,进行一下简单的加密,使得这个地址不能被外界的程序或代码片断猜到,可以使用这个cookie对需要保密的值进行一次异或编码,当需要使用这个关键地址时,再用这个cookie异或解码一下就行了。
这里我举一个例子,xp+sp2新增加了一个API:EncodePointer(),这个函数只有一个参数,dword类型的双字,返回编码过的值。其内部的最终实现是把给定的参数与EPROCESS.COOKIE异或一下。使用EncodePointer()的对关键地址进行编码以防被猜测的一个典型例子就是向量化异常处理(VEH)中的异常处理函数地址的保护。
2.在ring3下面如何获取这个值?
当然,系统得是xp+sp2或2k3+sp1
使用0x24作为ProcessInformationClass来调用NtQueryInformationProcess
类似于NtQueryInformationProcess(ffh,24h,&Buf,4,0),它将在Buf里返回当前进程的EPROCESS.COOKIE
3.最后如果您有兴趣的话,来看看它的初始化算法
大概思路是计算这么一个表达式的值
KPRCB->KeSystemCalls^KPRCB->InterruptTime^KeQuerySystemTime()返回值的高双字^KeQuerySystemTime()返回值的低双字
再用cmpxchg指令把这个随机值赋给EPROCESS.COOKIE
805c395b 8d45c4 lea eax,[ebp-0x3c]
805c395e 50 push eax
805c395f e8c643f3ff call nt!KeQuerySystemTime (804f7d2a)
805c3964 3ea120f0dfff mov eax,ds:[ffdff020] ;eax=kpcr->Prcb
805c396a 8b8818050000 mov ecx,[eax+0x518] ;ecx=KPRCB->KeSystemCalls
805c3970 3388b8040000 xor ecx,[eax+0x4b8] ;ecx=KPRCB->KeSystemCalls ^ KPRCB->InterruptTime
805c3976 334dc8 xor ecx,[ebp-0x38] ;ecx=
805c3979 334dc4 xor ecx,[ebp-0x3c]
805c397c 898d34ffffff mov [ebp-0xcc],ecx ;ecx=KPRCB->KeSystemCalls ^ KPRCB->InterruptTime ^KeQuerySystemTime()返回值的高双字^KeQuerySystemTime()返回值的低双字
805c3982 89bd2cffffff mov [ebp-0xd4],edi ;edi=&eprocess->Cookie
805c3988 b800000000 mov eax,0x0 ;eax=0
805c398d 8b8d2cffffff mov ecx,[ebp-0xd4] ;ecx=&eprocess->Cookie
805c3993 8b9534ffffff mov edx,[ebp-0xcc] ;edx=KPRCB->KeSystemCalls ^ KPRCB->InterruptTime ^KeQuerySystemTime()返回值的高双字^KeQuerySystemTime()返回值的低双字
805c3999 0fb111 cmpxchg [ecx],edx
这是一条镜像帖。来源:北邮人论坛 / security / #13443同步于 2007/9/17
Security机器人发帖
[原创]简单谈谈winxp+sp2/win2k03+sp1新增的EPROCESS.COOKIE成
flyingkisser
2007/9/17镜像同步0 回复
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。