cryptoki
驱动牛犊
驱动牛犊
  • 注册日期2008-03-24
  • 最后登录2008-03-31
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
阅读:2325回复:6

系统服务调用的问题

楼主#
更多 发布于:2008-03-24 13:21
我接管了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有什么不同
cryptoki
驱动牛犊
驱动牛犊
  • 注册日期2008-03-24
  • 最后登录2008-03-31
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-03-24 13:26
这是小弟所在公司在开发一套安全产品时遇到的问题,希望各位大侠能够提供帮助?具体费用可以进一步谈。
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2008-03-24 17:30
建议你在应用层HOOK来做,在核心层做的话,除非不改变任何参数调用,或者你所有的核心调用全放到WORKITEM,或系统线程中去做.不然够你受的,嘿嘿......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
Pegram
论坛版主
论坛版主
  • 注册日期2005-12-03
  • 最后登录2013-08-23
  • 粉丝13
  • 关注5
  • 积分1333分
  • 威望4717点
  • 贡献值1点
  • 好评度78点
  • 原创分0分
  • 专家分2分
地板#
发布于:2008-03-24 18:04
你HOOK CreateProcess是没有问题的,如果你在内核里面做,你要hook NtCreateProcess。
你最好把代码相关的地方贴出来。
wowocock,我要离职了。你回来见不到俺咯。
《寒江独钓》与《竹林蹊径》的合作作者。精通USB开发,设计了CY001 USB驱动套件(http://bbs.driverdevelop.com/read.php?tid-119314.html)。
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地下室#
发布于:2008-03-25 08:38
GOOD LUCK!
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
cryptoki
驱动牛犊
驱动牛犊
  • 注册日期2008-03-24
  • 最后登录2008-03-31
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-03-25 16:29
非常感谢楼上两位的帮助!

如wowocock大侠所说,我在系统线程能够成功打开刚刚创建的进程,但是进一步对新进程地址空间的imports部分做修改时(ms的detours技术中的UpdateImports方法进行了内核态的移植),虽然操作能够成功,但winlogon进程(第一个win32进程)还是崩溃了。

做应用层HOOK可能会绕过某些关键的系统进程,象smss,其创建的native进程,csrss和winlogon等,以后也许没有机会在向其内部注入代码了。奇怪的是,这些代码在w2k下能够正常执行,在xp和2k3下确不行。

尝试ing……
zzzevazzz
驱动小牛
驱动小牛
  • 注册日期2002-12-27
  • 最后登录2020-06-29
  • 粉丝0
  • 关注0
  • 积分1008分
  • 威望242点
  • 贡献值0点
  • 好评度170点
  • 原创分0分
  • 专家分0分
  • 社区居民
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,楼主没忘记吧?
[b][url]http://hi.baidu.com/zzzevazzz[/url][/b]
游客

返回顶部