阅读:3058回复:16
strace for 2k/xp/2003
(请确认Strace for Windows 2000除对有志于理解
Windows 2000内部结构的人员可能有少许帮助,对普 通用户其除了降低系统速度与稳定以外,别无他用.) 前段时间,想进一步了解Windows的内部消息驱动机制,想对消息队列有更深的理解,便时时接触如NtUserGetMessage、NtUserDispatchMessage、NtUserPeekMessage与NtUserWaitMessage等系统内部的一些例程。也曾使用Spyxx跟踪使用过,不过其仅仅对用户模式操作且无法显示系统内部处理方式的局限,最终还是让我不得不使用Softice步步跟踪,由于使用过程的不便,才有了Strace for Windows 2000的出现。 What's Strace for Windows 2000 Strace for Windows 2000其实只是跟踪Windows 2000 System Service的一个小程序。关于Windows 2000的System Service请参阅《再谈Windows NT/2000内部数据结》 与 《Windows 2000 System Services列表》)。Strace for Windows 2000能捕获系统中任何进程,不管用户态或核心态的任何对System Service的操作,并将之呈现在一个用户窗口中。 Strace for Windows 2000组成 Strace for Windows 2000主文件由Strace.exe与Strace.sys两个文件组成。其是系统的主要构成,只要将这两个文件置于同一目录中,即可执行。但我强烈建议您拥有下面的几个文件: ntoskrnl.dbg、ntoskrnl.pdb、win32k.dbg与win32k.pdb 大家知道Windows 2000的System Service是由ntoskrnl.exe与win32k.sys两个文件导出的。上面所提及的四个文件是这两个系统组件的Symbol文件,它们都在零售Windows 2000 Server的Microsoft Windows 2000 Customer Support Diagnostics CD中。这些文件清清楚楚的将System Service的进程名(函数名)与其对应的地址(内存中映射地址)一一对应。Strace for Windows 2000可以从中提取出系统的函数名。我已经在 《Windows 2000 System Services列表》中列出所有Windows 2000 Server Build 2195 SP0 Chinese Edition的所有函数名。正因为这些函数名只是与内存中地址一一对应,故其与系统版本,哪怕是Build号的不同,所装的SP包不同,都可能没办法确切读出函数名,故您在使用Strace for Windows 2000中勿必使用相同版本的Symbol文件。 Strace for Windows 2000的使用 Strace for Windows 2000使用了一设备驱动程序,所以要正确执行它需要有SE_DEBUG与SE_LOADDRIVER权限,而一般只有Administrator才有这些至高的权力,故如果您要运行Strace必须拥有管理员权限。 在下载了上面为你提供的压缩包后(注意我并未提供上面提及的四个Symbol文件),解压然后装上您的Windows 2000的Symbol后即能执行。下面是Strace for Windows 2000的一个执行Snapshot: 上图是我对Micrsoft Visual C++对调用含有Message的System Service的跟踪,从图中输出的结果可看出,Strace得到的结果包含进程ID,进程name,System Service ID,Function名,参数基地址,参数个数与各个参数的具体值。应该说明的是关于各个参数与参数的类型有较大的关系,如是指针类型的参数,这儿只是将其地址输出。故这些值其意义仅供一些参考,真正要看出它们的具体值等还需要一个内核态的调试器如SoftICE或Windbg等。另外参数信息有可能在被捕获之后就被Windows 2000覆盖或丢弃。 Strace for Windows 2000提供了较多的筛选的功能,这个从下面的两图中看出: Strace for Windows 2000进程筛选 Strace for Windows 2000的其它一些主要筛选功能 在进行筛选时,能用Service ID筛选的尽量选使用Service ID筛选,这将大大提高系统性能。以Windows 2000 Server Build 2195 SP0 Chinese Edition举个例子吧,如我们想跟踪系统创建的每一个进程的情况,这可以通过捕获Service ID为0x29(Strace在主窗口中除纪录号外均以16进制显示)的System Service。在筛选过程中请使用Service ID中的自定义从41(此输入窗口仅支持10进制)到41即可。当然假如你使用函数名NtCreateProcess筛选也可达到同样的效果,但其却大大影响系统执行速度。 注意:在关于字符串的筛选中,系统区分大小写,在使用过程中请注意字符串左右的空格,否则系统将得不到任何结果! 调用方式并非用于区别被捕获的进程是内核态进程还是用户态进程,而是用于区分执行这个System Service后是否导致从Ring 3切换到Ring 0!如系统从Ring 3切换到Ring 0,则标识此次调用是从用户态调用的,若并未发生环的切换(Ring0->Ring0)则标识为从内核态调用的。例如某用户态进程直接或通过调用其他用户态模块(如kernel32.dll、ntdll.dll等)使用System Service,则此时的调用即为用户态调用,如若它进入内核态后,再通过ntoskrnl.exe等模块继续使用System Service,而这时的调用则应该为内核态调用。 Strace for Windows 2000使用注意事项 Strace中使用了大量的与x86平台息息相关的指令,只能应用于x86平台. Strace for Windows 2000原来只是我用来跟踪System Service的小工具,且牵涉到对内核的操作,使用了较多的内部Undocumented的结构,我目前只在Windows 2000 Server Build 2195 SP0 Chinese Edition中测试过,在使用过程中如出现任何数据丢失等一切损失,本人概不负责。如果您在使用过程中发现什么问题,我也只乐意与您探讨一些技术性的话题,可联系我(tsu00@263.net)! 在Strace进行跟踪时,若由于跟踪的数据比较多,有可能导致Strace不能正常退出,主要由于System Service是Windows 2000操作系统的核心部分,系统在未进行任何操作的前提下每秒都会有近千个System Service调用。如果在使用Strace过程中未进行筛选操作时,可能会出现这个问题。在目前未进行输出纪录限制条件下(避免跟踪数据丢失),解决办法可以是使用快捷键(Strace设为Ctrl+R)代替鼠标操作,因为系统在鼠标移动与点击过程中对System Service的调用远比击键来的多,这可使用Perfmon进行验证。在我的Legend Soleil笔记本中(PII366HZ 64M),在系统空闲状态下Windows 2000 Server每秒约调用250次,击键则约为450次,而鼠标移动这个值则高达2200多次。除此以外,我建议尽量使用Strace提供的筛选功能。 Strace for Windows 2000中断了系统所有的System Service,故对系统性能有一定的影响。您千万不要将其像其它应用程序一样使用。我尽量将一些筛选功能移到用户态执行,尽量保持WDM Driver尽可能小. WEBCRAZYd 的STRACE功能很不错,可惜只能用于WIN2K,我修改了下可以用于2K/XP/2003,大家测试看看,INTEL的没问题,AMD的就不保证了,大家自己当心. |
|
最新喜欢:![]()
|
沙发#
发布于:2005-05-12 15:50
强烈要求老大公开新的程序原码! XP下已不再用Int 2E了,用SysEnter,换了Idt表中对应Int2e一项,又有何用?至于xp下hookint2e的,我已替狗狗改好了,不会兰屏的,可以看一下 http://www.driverdevelop.com/forum/viewthread.php?tid=90750 |
|
|
板凳#
发布于:2005-05-12 14:41
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
|
|
地板#
发布于:2005-05-12 09:36
强烈要求老大公开新的程序原码!
我读了早期版本的原码,使用的是拦截int2e,无法实现xp下的功能。而且,我使用sinister的hookint2e的原码,编译后在2000下运行后总是bluescreen,但比较两者的原码,实现上是一样的,为什么,我的不行?难道不能简单的替换idt表中指定地址内容! 另外,《Undocumented Nt》一书所附的原码中,hookint的例子中,没有是使用嵌入式汇编,而是使用了.asm文件,如何同.c的文件放在一起编译?请各位老大帮忙!救命! |
|
地下室#
发布于:2005-05-11 23:37
强烈要求老大公开新的程序原码!
我读了早期版本的原码,使用的是拦截int2e,无法实现xp下的功能。而且,我使用sinister的hookint2e的原码,编译后在2000下运行后总是bluescreen,但比较两者的原码,实现上是一样的,为什么,我的不行?难道不能简单的替换idt表中指定地址内容! 另外,《Undocumented Nt》一书所附的原码中,hookint的例子中,没有是使用嵌入式汇编,而是使用了.asm文件,如何同.c的文件放在一起编译?请各位老大帮忙!救命! :( |
|
|
5楼#
发布于:2005-05-11 15:57
http://webcrazy.yeah.net有最初的源代码,希望老大在修改后同样能公布源代码。
强烈要求公布源代码!!! |
|
6楼#
发布于:2005-05-11 09:50
老大要是能贴出源代码就好了!!!
|
|
7楼#
发布于:2004-03-19 16:42
考虑拦截MSR的方法,只能拦截RING3-》RING0的函数调用,不能拦截RING0的函数调用,而且INT 2EH在XP以后的内核系统中也没有使用,所以重新改写了核心驱动部分,现在不利用MSR的HOOK,做到CPU无关,同时可以同时拦截RING,RING3的各个函数调用,大家可以看看
|
|
|
8楼#
发布于:2004-03-18 20:52
加入2K/XP/2003,OS下的NTOSKRNL函数,显示
|
|
|
9楼#
发布于:2004-03-18 16:11
是执行WRMSR前必须设定EDX为0,看看INTEL或AMD的手册.
|
|
|
10楼#
发布于:2004-03-18 13:43
新的SYSENTER_EIP_MSR执行jmp old_SYSENTER_EIP_MSR.
可能是edx没置0,为什么要将edx置0? |
|
11楼#
发布于:2004-03-18 11:52
应该不会有问题的,你是如何实现的??
写之前必须确定EDX为0,不然必死。。。。。。 |
|
|
12楼#
发布于:2004-03-18 11:46
谢谢!对于intel的cpu除了改写SYSENTER_EIP_MSR还需要做别的操作吗?为什么我写完SYSENTER_EIP_MSR系统就down掉了?
|
|
13楼#
发布于:2004-03-18 11:30
读取AMD的MSR寄存器,详细参考AMD的SYSCALL,SYSRET指令手册.
|
|
|
14楼#
发布于:2004-03-18 10:31
mov ecx, 0C0000081h
rdmsr 请问这两条指令读到eax寄存器中的是什么? |
|
15楼#
发布于:2004-03-18 09:51
昨天有网友说AMD下没反应,而且他说AMD下还是采用INTEL的SYSENTER而不是AMD自身的SYSCALL,我想可能是最新的ATHLON加入了,INTEL的这个指令的支持,所以可以和INTEL的兼容,可能老的AMDK6-2,K6-3,没支持,我修改了下驱动,如果是AMD的CPU,如果支持SYSENTER就采用INTEL的方法,如果不支持,就采用AMD自身的方法,大家再测试看看,同时把应用层的程序,修改为静态MFC库,免得大家DLL。
|
|
|
16楼#
发布于:2004-03-17 22:59
Windows XP Build 2600 System Services vs Windows 2000 Build 2195 System Services
便于大家参考 |
|
|