原文发表于百度空间,2010-10-07
==========================================================================

由于KeUserModeCallback的工作原理,对调用者线程和进程有以下要求:

1、调用者线程不能是纯内核线程(由PsCreateSystemThread创建的线程)

2、调用者线程必须在其所属进程中调用KeUserModeCallback

3、调用者进程必须加载了user32.dll

原因很简单,因为KeUserModeCallback需要操作调用者线程ring3的栈,第1条不满足是因为纯内核线程没有ring3栈,也就是没有UserStack。所以想在DriverEntry等一些地方调用是不行的,即使Attach到其它进程也不行~~

第2条的限制是因为如果你使用KeAttachProcess/KeStackAttachProcess改变了进程环境,那么线程KTHREAD中保存的ring3栈指针(也就是KTHREAD.TrapFrame.HardwareEsp)在当前进程环境中将是无效的,而接下来就要向ring3栈中复制参数,即使有效也会因此破坏当前进程的数据。直接现象是KeUserModeCallback中的ProbeForWrite检查用户栈是否可写时将产生异常。

我的解决方法是Hook某个经常被调用的地方,然后检查当前进程是不是指定的进程,是的话就call ring3,call成功后恢复此Hook。这种方法有点“守株待兔”的感觉。。。

第1条和第2条的原因其实很相似,即线程本身并不会因进程环境的不同而改变,即使切换到一个普通进程,那么内核线程还是内核线程,UseESP仍然是原进程里的UserESP,在新进程中是无效的。

第3条的限制是因为如果不加载user32.dll,那么PEB->KernelCallbackTable将会为NULL。不过这个问题不是大问题,因为我们可以自己填充这个值,当然,还得多做点其它工作啦。或者DIY一下ntdll!KiUserCallbackDispatcher也可以~~

最新文章

  1. UVa 488 - Triangle Wave
  2. C# winform窗体设计-通过条件查询数据
  3. ActiveMQ: 搭建Broker集群(cluster)
  4. atitit. applet 浏览器插件 控件 的环境,开发,提示总结o9o
  5. 第一套增删改查(htm+ashx完成)
  6. SQLite 字段类型
  7. dubbo 负载均衡中策略决策
  8. Mybatis学习(5)高级映射
  9. CSS Font-family常用设置
  10. 使用HttpClient 调用Web Api
  11. GitHub:多人协作下的分支处理
  12. 在linux下制作静态库和动态链接库的方法
  13. qq通讯录
  14. HDU 1247 - Hat’s Words - [字典树水题]
  15. Cracking The Coding Interview 5.7
  16. FPGA基础知识1
  17. vba 语法
  18. centos下安装ngnix+php+mysql服务
  19. 读书笔记5基于matplotlib画图
  20. (转)ELK Stack 中文指南--性能优化

热门文章

  1. Visual Studio 12无法调试Silverligh应用程序的问题
  2. 每天进步一点点——Linux中的线程局部存储(二)
  3. android 5.X Toolbar+DrawerLayout实现抽屉菜单
  4. PHP中的$_SERVER['PATH_INFO']
  5. Matlab princomp函数浅析
  6. cygwin配置个人环境,android模拟器root映象和Babun
  7. stringByAppendingPathComponent和stringByAppendingString 的区别
  8. MAC如何查看某个端口的占用情况
  9. new和delete的基本用法
  10. 多用GCD,少用performSelect系列方法