编辑: 笨蛋爱傻瓜悦 2019-07-03
关于 XP SP3 系统下 NtUserCreateWindowEx 原型分析(修正版) 第1页共7页关于 XP SP3 系统下 NtUserCreateWindowEx 原型分析 修正版 By HSQ 说明: 其实以前就因为需要用到这个函数来处理一些特定窗口, 苦于没有该 API 原型, 最后自己也是草草的 DBG 了一下,可弄错来的结果还是有偏差.

最近再次用那些东西试试效果,居然发现用起来完全形同虚设.可能是系 统升级后, 原来蒙的偏移量改变了. 乘着闲来无事, 干脆下决心给彻底弄清楚其原型. 顺便将分析过程记录存档, 以便共享后来者和遗忘是查阅. 1. 其最终由 WIN32K.SYS 实现 2. 调用流程 关于 XP SP3 系统下 NtUserCreateWindowEx 原型分析(修正版) 第2页共7页3. 参数传递经过 3.1 CreateWindowEx(CreateWindowExW/A) 先从 2k 源码看参数传递过程开始分析 注意:在2K 中没有 CreateWindowExW/A 之分,这也正是需要对 NtUserCreateWindowEx 进行重新分析的原因 CreateWindowEx 没有对参数进行任何处理,而是追加一个参数后直接调用_CreateWindowEx 3.2 _CreateWindowEx 可见,在2k 时,是通过是否定义了 这个标志来调用相应版本的 API,及 来确定是 W/A 之分的.而在 XP 中,已经存 CreateWindowExW/A 之分了,在通过 IDA 分析可知 对于 的调用: 关于 XP SP3 系统下 NtUserCreateWindowEx 原型分析(修正版) 第3页共7页对于 的调用: 即A版本的 = ,W 版本为 ,其他参数都沿袭 2K. _CreateWindowEx 进行一些处理后接着开始进入下一层调用,这里 XP 与2K 处理有些差异. 3.3 NtUserCreateWindowEx(VerNtUserCreateWindowEx) A. 在2K 中,到次就直接进入了 NtUserCreateWindowEx 流程 NtUserCreateWindowEx 的原型: 关于 XP SP3 系统下 NtUserCreateWindowEx 原型分析(修正版) 第4页共7页至此,用户层的处理已经结束. B.而在 XP 中,却还得经过一个 VerNtUserCreateWindowEx 调用才会进入 NtUserCreateWindowEx 流程.结合 2K 的源码,拿IDA 的F5 初步分析,猜测 VerNtUserCreateWindowEx 应该就是以前 NtUserCreateWindowEx 的伪函数 再看看该处使用到的一些字符结构 由此可见 PLARGE_STRING 是PLARGE_ANSI_STRING 与PLARGE_UNICODE_STRING 的通用结构, 而VerNtUserCreateWindowEx 内代码片无非是根据上层函数传入的 进行做 A/W 的配对吻合而已,故 最终确定其原型应该为 关于 XP SP3 系统下 NtUserCreateWindowEx 原型分析(修正版) 第5页共7页在此基础上,用IDA 进行分析看得出 NtUserCreateWindowEx 的最终原型基本为, 4. 最终整理 XP SP3 下得到真正的 NtUserCreateWindowEx 由于昨晚马虎,依据以前的经验,直接认为传到内核后所有的字符参数应该均为宽字节类型,于是直接将 和 参数类型设为 PLARGE_UNICODE_STRING.后来在自己写个创建窗口 的例子时,发现用 A 版 创建了一个自定义的类窗口,到内核层却只能把窗口类名称给解析出 关于 XP SP3 系统下 NtUserCreateWindowEx 原型分析(修正版) 第6页共7页来.再看看以前的分析过程,于是猜测也可能存在传到内核还是单字节的情况,随即在自己的代码内加了 W/A 之分后,发现窗口的类好名都能很好的解析出来.于是它们的参数类型应该为的 PLARGE_STRING,自己在内 核里还得具体区别对待.修正后的原型如下: 5. 验证分析结果正确性 测试例子的代码片: 测试驱动的解析代码片: 关于 XP SP3 系统下 NtUserCreateWindowEx 原型分析(修正版) 第7页共7页最后测试了一下,证明这次分析的是完全对的…^_^…. 参考资料: 1. 部分源码 2. > 部分源码

下载(注:源文件不在本站服务器,都将跳转到源网站下载)
备用下载
发帖评论
相关话题
发布一个新话题