21:33 2007-9-20
今天发现了 syser debugger 的 SDbgMsg.sys。 这个驱动程序就是SERVICE_BOOT_START 类型的驱动程序, 在windows 启动后最新给出提示信息 "Press "ESC" to Cancel Load Syser Boot Module ",我想看看到底是怎样编程实现的:
打开 IDA 载入 SDbgMsg.sys 程序, 反汇编代码如下:
; int __stdcall start(PDEVICE_OBJECT DeviceObject)
public start
start proc near
SymbolicLinkName = UNICODE_STRING ptr -18h
DeviceName = UNICODE_STRING ptr -10h
SystemRoutineName = UNICODE_STRING ptr -8
DeviceObject = dword ptr 8
.text:00010850 push ebp
.text:00010851 mov ebp, esp ; 打开栈帧
.text:00010853 sub esp, 18h
.text:00010856 push ebx
.text:00010857 push esi
.text:00010858 mov esi, [ebp+DeviceObject]
.text:0001085B push edi
.text:0001085C push 1Bh
.text:0001085E lea edx, [esi+38h]
.text:00010861 pop ecx ; 给ecx赋值 1Bh
.text:00010862 mov eax, offset loc_10428
.text:00010867 mov edi, edx
.text:00010869 rep stosd
上面的反汇编代码可能有问题, DeviceObject 应该是 DirverObject。如果是 DeviceObject ,那偏移 38H 位置是
DeviceObject->Queue.Blink 或者是 DeviceObject->Queue.Wcb.WaitQueueEntry.Blink 。我想不出 DeviceObject 的这些成员怎么使用。一般情况下程序开始时就是设置 Dispatch 例程, 而 DriverObject 的 Dispatch 例程就是在 38H 偏移位置, 所以我可以认为这里的 DeviceObject 就是 DriverObject。
可见 loc_10428 例程就是通用的派遣例程.
下面是DeviceObject 的偏移为38H 位置的结构图
下面是 DriverObject 偏移为 38H 位置的结构图
.text:0001086B mov edi, ds:RtlInitUnicodeString
.text:00010871 push offset aDeviceSyserdbg ; "//Device//SyserDbgMsg"
.text:00010876 lea eax, [ebp+DeviceName]
.text:00010879 push eax ; DestinationString
; 设置 DirverObject->DriverUnload = sub_10702
.text:0001087A mov dword ptr [esi+34h], offset sub_10702
; 设置 DirverObject->MajorFunction