背景知识
本节内容描述了创建窗口时需要用到的结构体及函数:
用户态的窗口数据结构体:WNDCLASSEXW。
窗口数据保存在内核态时使用:tagWND和tagWNDK结构体。
用户态调用SetWindowLong可以设置窗口扩展内存数据,逆向分析SetWindowLong如何设置窗口扩展内存数据。
窗口类拥有如下属性结构,此处仅列出比较重要的结构:
typedefstructtagWNDCLASSEXW{UINTcbSize;//结构体的大小…UINTstyle;//窗口的风格WNDPROClpfnWndProc;//处理窗口消息的回调函数地址intcbClsExtra;//属于此类窗口所有实例共同占用的内存大小intcbWndExtra;//窗口实例扩展内存大小LPCWSTRlpszClassName;//类名…}WNDCLASSEXW
在用户态创建窗口时,需要调用RegisterClass注册窗口类,每个窗口类有自己的名字,调用CreateWindow创建窗口时传入类的名字,即可创建对应的窗口实例。当cbWndExtra不为0时,系统会申请一段对应大小的空间,如果回调到用户态申请空间时,可能会触发漏洞。内核中使用两个结构体来保存窗口数据tagWND和tagWNDK:
ptagWND//内核中调用ValidateHwnd传入用户态窗口句柄可返回此数据指针0x18unknown0x80kerneldesktopheapbase//内核桌面堆基址0x28ptagWNDk//需要重点