Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

Windows内核调试

帖子发起人: jlflyfox   发起时间: 2009-02-13 10:07 上午   回复: 3

Print Search
帖子排序:    
   2009-02-13, 10:07 上午
jlflyfox 离线,最后访问时间: 2009/1/24 22:08:06 jlflyfox

发帖数前25位
注册: 2008-10-28
发 贴: 65
u SharedUserData!SystemCallStub 有疑问
Reply Quote

我看本站首页那个资源部分第一个文章--Nt vs. Zw - Clearing Confusion... 有些疑问

就是我本机xp sp2,我执行u ntdll!NtReadFile是和文章介绍一样,但执行u SharedUserData!SystemCallStub 这个就不对了,没有看到sysenter 0f34???

0:000> u ntdll!NtReadFile
ntdll!ZwReadFile:
7c92e27c b8b7000000      mov     eax,0B7h
7c92e281 ba0003fe7f      mov     edx,offset SharedUserData!SystemCallStub (7ffe0300)
7c92e286 ff12            call    dword ptr [edx]
7c92e288 c22400          ret     24h
7c92e28b 90              nop
ntdll!NtReadFileScatter:
7c92e28c 90              nop
7c92e28d 90              nop
7c92e28e 90              nop

0:000> u SharedUserData!SystemCallStub
SharedUserData!SystemCallStub:
7ffe0300 8beb            mov     ebp,ebx
7ffe0302 92              xchg    eax,edx
7ffe0303 7c94            jl      SharedUserData+0x299 (7ffe0299) //就是这里看不懂了,怎么不sysenter?
7ffe0305 eb92            jmp     SharedUserData+0x299 (7ffe0299)
7ffe0307 7c00            jl      SharedUserData!SystemCallStub+0x9 (7ffe0309)
7ffe0309 0000            add     byte ptr [eax],al
7ffe030b 0000            add     byte ptr [eax],al
7ffe030d 0000            add     byte ptr [eax],al
0:000> u 7ffe0299
SharedUserData+0x299:
7ffe0299 0000            add     byte ptr [eax],al
7ffe029b 0000            add     byte ptr [eax],al
7ffe029d 0000            add     byte ptr [eax],al
7ffe029f 0000            add     byte ptr [eax],al
7ffe02a1 0000            add     byte ptr [eax],al
7ffe02a3 0000            add     byte ptr [eax],al
7ffe02a5 0000            add     byte ptr [eax],al
7ffe02a7 0000            add     byte ptr [eax],al
0:000> u 7ffe0309
SharedUserData!SystemCallStub+0x9:
7ffe0309 0000            add     byte ptr [eax],al
7ffe030b 0000            add     byte ptr [eax],al
7ffe030d 0000            add     byte ptr [eax],al
7ffe030f 0000            add     byte ptr [eax],al
7ffe0311 0000            add     byte ptr [eax],al
7ffe0313 0000            add     byte ptr [eax],al
7ffe0315 0000            add     byte ptr [eax],al
7ffe0317 0000            add     byte ptr [eax],al

.......

按两个jl再次u的结果发现也不对啊
最近在出差,张老师那本宝典没有带,那本宝典有一个大的问题,就是太厚,不好带 :) 所以有些疑问可能书上有,但自己没看,所以请哪位高手不吝指点下

 


IP 地址: 已记录   报告
   2009-02-13, 11:35 上午
WANGyu 离线,最后访问时间: 2012/9/10 3:34:00 王宇

发帖数前10位
男
注册: 2007-05-08
发 贴: 306
Re: u SharedUserData!SystemCallStub 有疑问
Reply Quote

那篇文章是我用 LaTeX 整理的。之所以要整理是因为那是篇好文章,但是部分内容过时了。所以我整理的时候做了脚注更新,楼主啊,您没仔细看啊......

在 Win-XP-SP1 时代是文章中的这样:

0: kd> u ntdll!ZwReadFile
ntdll!NtReadFile:
77f761e8 b8b7000000      mov     eax,0xb7
77f761ed ba0003fe7f      mov     edx,0x7ffe0300
77f761f2 ffd2            call    edx
77f761f4 c22400          ret     0x24

而您帖的代码是 Win-XP-SP2 以后的操作系统:

0:000> u ntdll!NtReadFile
ntdll!ZwReadFile:
7c92e27c b8b7000000      mov     eax,0B7h
7c92e281 ba0003fe7f      mov     edx,offset SharedUserData!SystemCallStub (7ffe0300)
7c92e286 ff12            call    dword ptr [edx]
7c92e288 c22400          ret     24h

注意到区别了吗?

一个是 call EDX 一个是 call [EDX]

所以,显然应该是:

0: kd> dd SharedUserData!SystemCallStub
7ffe0300  7c92e4f0 7c92e4f4 00000000 00000000
7ffe0310  00000000 00000000 00000000 00000000
7ffe0320  00000000 00000000 00000000 00000000

0: kd> u 7c92e4f0
ntdll!KiFastSystemCall:
7c92e4f0 8bd4            mov     edx,esp
7c92e4f2 0f34            sysenter
ntdll!KiFastSystemCallRet:
7c92e4f4 c3              ret


至于为什么要改变这个 call [EDX],我特地查了《Kernel-mode Payloads on Windows》(Uninformed, 2005)写在脚注里且红色标出。

Due to the fact that SharedUserData contained executable instructions, it was thus necessary that the SharedUserData mapping had to be marked as executable. When Microsoft began work on some of the security enhancements included with XP SP2 and 2003 SP1, such as Data Execution Prevention (DEP), they presumably realized that leaving SharedUserData executable was largely unnecessary and that doing so left open the possibility for abuse. To address this, the fields in KUSER_SHARED_DATA were changed from sets of instructions to function pointers that resided within ntdll.dll.

由于 SharedUserData 中包含了可执行指令,那么 SharedUserData 所在的页就会被映射成可执行代码段。当微软试图对 XP SP2 以及 2003 SP1 做一些安全性增强工作时(例如:数据执行保护 DEP),他们大概意识到让 SharedUserData (所在页面)变得可执行非常地多余,这留下了潜在的滥用可能性。为了解决这个问题,那个在 KUSER_SHARED_DATA 里的域由一组指令变成了指向 ntdll.dll 里指令的函数指针.


IP 地址: 已记录   报告
   2009-02-13, 15:43 下午
jlflyfox 离线,最后访问时间: 2009/1/24 22:08:06 jlflyfox

发帖数前25位
注册: 2008-10-28
发 贴: 65
Re: u SharedUserData!SystemCallStub 有疑问
Reply Quote
Ok,果然如此,我没有看对,我重新弄了下,的确如此,谢谢
IP 地址: 已记录   报告
   2009-02-16, 10:38 上午
WANGyu 离线,最后访问时间: 2012/9/10 3:34:00 王宇

发帖数前10位
男
注册: 2007-05-08
发 贴: 306
Re: u SharedUserData!SystemCallStub 有疑问
Reply Quote
^_^

现在工作时间好紧 有空我再整理一些经典文章!
IP 地址: 已记录   报告
高端调试 » 软件调试 » Windows内核调试 » Re: u SharedUserData!SystemCallStub 有疑问

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.