阅读:2324回复:6
系统服务调用的问题
我接管了NT系统服务CreateProcess,在重新实现这个系统服务时,我做了以下两步操作:
1、调用原始的NT系统服务CreateProcess函数并成功返回 2、在进程句柄上进一步调用有关的系统服务来获得这个进程对象的一些信息,如PEB的基地址 问题表象如下: 在win2k下,第2步可以成功返回;在winxp和win2k3下,第2步调用不能成功,不成功分为 两种情况:①调用NTDLL.NtQueryInformationProcess永远锁定不再返回②调用SSDT中的真实 NtQueryInformationProcess函数,则不会阻塞,但返回值为STATUS_ACCESS_VIOLATION。 相关的问题和现象: 对于线程对象,我已经做了验证,和进程对象类似,在xp和2k3下调用线程相关的系统服务 不是缩死就是STATUS_ACCESS_VIOLATION,其它内核对象没有做尝试,不敢假设是否也会出现 类似的错误。 我的问题: 在xp和2k3下,对象的创建者创建了对象,并且指定了XXX_ALL_ACCESS访问,且属性中没有 设置FORCE_ACCESS_CHECK位,为什么创建者在内核模式下不能访问刚刚创建或打开的对象? 在xp和2k3下,在内核模式下调用NTDLL中的系统服务重入内核模式会导致锁死吗?上述锁 死的原因是什么?xp、2k3和2k有什么不同 |
|
沙发#
发布于:2008-03-24 13:26
这是小弟所在公司在开发一套安全产品时遇到的问题,希望各位大侠能够提供帮助?具体费用可以进一步谈。
|
|
板凳#
发布于:2008-03-24 17:30
建议你在应用层HOOK来做,在核心层做的话,除非不改变任何参数调用,或者你所有的核心调用全放到WORKITEM,或系统线程中去做.不然够你受的,嘿嘿......
|
|
|
地板#
发布于:2008-03-24 18:04
你HOOK CreateProcess是没有问题的,如果你在内核里面做,你要hook NtCreateProcess。
你最好把代码相关的地方贴出来。 wowocock,我要离职了。你回来见不到俺咯。 |
|
|
地下室#
发布于:2008-03-25 08:38
GOOD LUCK!
|
|
|
5楼#
发布于:2008-03-25 16:29
非常感谢楼上两位的帮助!
如wowocock大侠所说,我在系统线程能够成功打开刚刚创建的进程,但是进一步对新进程地址空间的imports部分做修改时(ms的detours技术中的UpdateImports方法进行了内核态的移植),虽然操作能够成功,但winlogon进程(第一个win32进程)还是崩溃了。 做应用层HOOK可能会绕过某些关键的系统进程,象smss,其创建的native进程,csrss和winlogon等,以后也许没有机会在向其内部注入代码了。奇怪的是,这些代码在w2k下能够正常执行,在xp和2k3下确不行。 尝试ing…… |
|
6楼#
发布于:2008-03-25 19:01
我来说几句:
1,ntdll.dll在2000上通过int2e调用系统服务,可以重入。XP和2003使用sysenter/syscall,应该不能在ring0调用。 2,还是Zw和Nt的区别问题。 在系统服务的钩子里PreviousMode是UserMode,此时调用NtXxx就要求相关的地址参数位于用户态,否则ProbeForRead/Wirte参数检查通不过,返回STATUS_ACCESS_VIOLATION。 调用对应的ZwXxx函数没有这个问题,因为它重入一次KiSystemService,PreviousMode变成KernelMode了。 3,利用系统线程做事情,在访问用户态地址时,要先KeStackAttachProcess,楼主没忘记吧? |
|
|