虫趣:BAD POOL CALLER (par1: 0x20)

作者:张佩 【原文:http://www.yiiyee.cn/Blog/0x19-1/

内核在管理内存的时候,为了提高内存使用效率,对于小片内存的申请(小于一个PAGE大小),都是通过内存池来操作的。系统里面有两种不同的内存池:分页内存池和非分页内存池。这二者的区别是很明显的:分页内存池所使用的内存页面,随时有可能被分页出去;而非分页内存池所使用的虚拟页面,总是留驻在物理内存中。

对于运行在高中断级别(>=DISPATCH_LEVEL 2)上的代码,它使用的内存只应该是从非分页内存池中申请的。因为系统无法在这些中断级上处理页错误。

除了上面的区别外,系统对两个内存池的管理是极类似的。那么,系统是怎么管理这些内存池的呢?当请求者申请内存的时候,池管理器首先会检查自己当前的储备内存,以确认能否满足申请者的要求,如果可以,则从储备内存中进行分配;否则就重新申请一个新的内存页,并从新内存页中划出一块给申请者,剩下的留作储备内存继续使用。 继续阅读“虫趣:BAD POOL CALLER (par1: 0x20)”

4,442 total views, no views today

虫趣:空指针引用(SYSTEM_SERVICE_EXCEPTION)

作者:张佩】【原文: http://www.yiiyee.cn/Blog/bsod-0x3b-1/

这是一个BSOD 0x3B的dump文件,BSOD 0x3B所代表错误的描述是:SYSTEM_SERVICE_EXCEPTION,表示在一个系统线程里面发生了不可解决的系统异常,导致的系统错误。

系统线程是一个笼统的概念,凡是通过内核函数IoCreateSystemThread创建的线程,都是系统线程。内核是一个混沌的整体,内核里面不存在进程的概念。但是它却需要分配一些独立执行的任务,线程是执行这些独立任务的最佳载体。但是线程必须依附在进程中。为了解决这种矛盾,系统专门创建了一个SYSTEM进程,这个进程没有用户模式的代码,专门作为内核线程的载体存在。系统为SYTEM进程分配固定的进程号4。在Windbg内核调试会话中运行命令!process 4将列印SYSTEM进程信息:

0: kd> !process 4 0
Searching for Process with Cid == 4
Cid handle table at fffff8a000004e80 with 754 entries in use

PROCESS fffffa8003699040
    SessionId: none  Cid: 0004    Peb: 00000000  ParentCid: 0000
    DirBase: 00187000  ObjectTable: fffff8a0000019b0  HandleCount: 1559.
    Image: System

继续阅读“虫趣:空指针引用(SYSTEM_SERVICE_EXCEPTION)”

6,327 total views, no views today

虫趣:内存误操作引发中断级错误(IRQL_NOT_LESS_OR_EQUAL)

作者:张佩】【原文: http://www.yiiyee.cn/Blog/bsod-0xa-1/

得到一个BSOD 0xA的dump文件,BSOD 0xA代表的是 IRQL_NOT_LESS_OR_EQUAL错误,也就是说试图在错误的中断级上进行特定操作。在这个例子中,错误的原因是试图在中断级2上解决页错误,引发了系统蓝屏。

用windbg打开dump文件后,先用kv和r命令获取当前状态:

0: kd> kv;r
ChildEBP RetAddr Args to Child
81256650 815cd41b 0000000a c9495000 00000002 nt!KiBugCheck2
81256650 81558315 0000000a c9495000 00000002 nt!KiTrap0E+0x1b3 (FPO: [0,0] TrapFrame @ 81256670)
812566e4 ad6a47e4 c9494efc 00000000 00000120 nt!memset+0x45 (FPO: [3,0,0])
81256734 ad6a3a5b c35d6f7c 00000010 d5140dfc XXX!initializeIsoUrb+0x74 (FPO: [Non-Fpo]) (CONV: thiscall)
81256770 ad6a3c73 c35d6f7c c346a890 00000001 XXX!completeRequest+0x1cb (FPO: [Non-Fpo]) (CONV: thiscall)
81256794 8190852a 00000000 d51bade0 c35d6f7c XXX!completeFunc+0xe3 (FPO: [Non-Fpo]) (CONV: stdcall)
812567c8 814d5885 00000000 d51bade0 81256890 nt!IovpLocalCompletionRoutine+0x12f (FPO: [3,5,4])
81256864 819090f0 8163a015 8b136708 88441a38 nt!IopfCompleteRequest+0x42e (FPO: [Non-Fpo])
812568c8 8fae1ef7 8fe50028 88441a38 8fe50b88 nt!IovCompleteRequest+0x123 (FPO: [Non-Fpo])
8125697c 8fae268a d51bade0 8fe50b88 00026202 USBPORT!USBPORT_Core_iCompleteDoneTransfer+0x99a (FPO: [3,39,4])
812569a4 8fae8df6 246b5702 8fe50028 8fe50b88 USBPORT!USBPORT_Core_iIrpCsqCompleteDoneTransfer+0x1ff (FPO: [1,4,0])
812569e0 8fae9140 8fe50028 8fe50b88 246b5702 USBPORT!USBPORT_Core_UsbIocDpc_Worker+0x1b7 (FPO: [Non-Fpo])
81256a28 814e0bc3 8fe50b94 8fe50b88 00000000 USBPORT!USBPORT_Xdpc_Worker_IocDpc+0x1c9 (FPO: [Non-Fpo])
81256ae0 814e07fe 816860c0 81256b28 bedc4d40 nt!KiExecuteAllDpcs+0x1f2 (FPO: [Non-Fpo])
81256c00 815cea74 00000000 0000000e 00000000 nt!KiRetireDpcList+0xed (FPO: [0,65,4])
81256c04 00000000 0000000e 00000000 00000000 nt!KiIdleLoop+0x38 (FPO: [0,0,0])

eax=00000002 ebx=00000001 ecx=00000001 edx=00000000 esi=81558315 edi=c9495000
eip=81553c24 esp=81256654 ebp=81256670 iopl=0 nv up ei pl nz na po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000202
nt!KiBugCheck2:
81553c24 55 push ebp

继续阅读“虫趣:内存误操作引发中断级错误(IRQL_NOT_LESS_OR_EQUAL)”

5,597 total views, no views today

虫趣:Win8系统Bug分析一例

作者:张佩】【原文URL http://www.yiiyee.cn/Blog/win80x7e/
[download id=”3″]

有肉的地方总能发现蚊蝇。有软件的地方,就有臭虫相随(注1)。操作系统就是个大软件,所以臭虫是少不了的。最近碰到一个Windows 8的系统臭虫,报给微软并得到了确认,他们确保会在Windows Blue上解决此问题。到底是什么问题呢?今日有空,和大家一起来聊聊。
继续阅读“虫趣:Win8系统Bug分析一例”

6,719 total views, no views today

小z说:内核驱动的编译环境

作者:张佩】【原始URLhttp://www.yiiyee.cn/Blog/KernelBuildEnviroment/

[download id=”2″]

这一章驱动小z继续带大家遨游驱动王国。在这块地面上,小z是个地头蛇,跑动跑西惯了。贵读者有什么地方想特别了解的,都可以告诉我,很乐意陪您做半日游。

所谓登高必有卑,在把大家引入到高山圣境之前,先要在山脚下徜徉几时,为的是把一些预备的事情交代清楚。这一节讲的是驱动程序编译环境。Windows内核驱动的历史有多久,它的开发环境就要有多久,所以是很有历史的话题。话分两头讲,它起先是很不好,后来则非常好。很不好的时代是旧社会,现在则已是非常好的新时代。
继续阅读“小z说:内核驱动的编译环境”

6,848 total views, no views today

64位驱动签名工具64Signer

【作者:张佩】【原始URL:http://www.yiiyee.cn/Blog/64signer/

注,此工具业已过时,无存在之必要。许多人想寻求稳妥的64位系统之签名绕过方法,此处做统一回复,没有可能。唯文中所涉及之技术点,犹可供参考。删除下载链接,而留此文。

  • 背景介绍

微软对于自Vista开始的64位OS有新的数字签名策略,即所有内核驱动都必须是经过可信机构签发过数字证书的,否则系统拒绝加载,其目的是为了加强系统安全防护,使得一干惯于偷偷摸摸、不知所自何来的内核模块无法在系统中容身。但它却也给正经的内核开发人员带去了一个麻烦:开发过程中会不断生成新的驱动镜像文件,开发者不可能将每一个内部版本都拿去申请数字签名,那样不仅太麻烦,而且会大大延长开发周期。

微软当然也考虑到了这一点,它提供了一个可以禁止签名检验的开机启动项。要运用此启动项,用户必须在启动电脑的时候,及时在键盘上按下F8键,在出来的启动菜单中选择倒数第二个启动项:Disable Driver Signature Enforcement.

这看上去很省心,但你如果再了解得深入一点,就会发现它其实很麻烦。
继续阅读“64位驱动签名工具64Signer”

53,909 total views, no views today