zoukankan      html  css  js  c++  java
  • 【旧文章搬运】关于在指定进程调用KeUserModeCallback的问题

    原文发表于百度空间,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也可以~~

  • 相关阅读:
    [CQOI2007]涂色
    NOI.AC NOIP模拟赛 第五场 游记
    AGC018D Tree and Hamilton Path
    AGC001E BBQ Hard
    LOJ6089 小Y的背包计数问题
    UOJ272 【清华集训2016】石家庄的工人阶级队伍比较坚强
    Gym102538A Airplane Cliques
    AT5762 Preserve Diameter
    CF1030G Linear Congruential Generator
    CF1149E Election Promises
  • 原文地址:https://www.cnblogs.com/achillis/p/10183634.html
Copyright © 2011-2022 走看看