随笔分类 -  Windows Driver Dev

摘要:!dh 命令kd> !dh 7c800000File Type: DLL FILE HEADER VALUES 14C machine (i386) 4 number of sections 4121457C time date stamp Tue Aug 17 07:38:36 2004 0 file pointer to symbol table 0 number of symbols E0 size of optional header 210E characteristics Executable Line numbers ... 阅读全文
posted @ 2012-03-07 17:01 Fan Zhang 阅读(824) 评论(0) 推荐(0)
摘要:INTEL的IDE控制器连接在PCI总线上,其驱动是INTELIED.sys(intel提供)+PCIIEDX.sys(微软提供),堆栈关系如下: !DevObj !DrvObj !DevExt ObjectName > 80e9b030 \Driver\IntelIde 80e9b0e8 PciIde0 80e931d0 \Driver... 阅读全文
posted @ 2012-01-18 18:20 Fan Zhang 阅读(509) 评论(0) 推荐(0)
摘要:sxe 一般后面接ld XXXX,可以用来在加载XX模块时下断点。 例如:sxe ld user32.dll参考: http://stackoverflow.com/questions/1366051/windbg-setting-conditional-breakpoint 阅读全文
posted @ 2011-12-29 11:27 Fan Zhang 阅读(889) 评论(0) 推荐(0)
摘要:0:000:x86> .exr -1 ExceptionAddress: 00000000013c354e (MyTest!foo+0x000000000000001e) ExceptionCode: c0000005 (Access violation) ExceptionFlags: 00000000 NumberParameters: 2 Para... 阅读全文
posted @ 2011-12-29 10:49 Fan Zhang 阅读(536) 评论(0) 推荐(0)
摘要:MMPTE其实是个union,它抽象了PDE,PTE,原型PTE等数据结构 kd> dt _MMPTE -r2 nt!_MMPTE +0x000 u : __unnamed +0x000 Long : Uint4B +0x000 Flush : _HARDWARE_PT... 阅读全文
posted @ 2011-12-22 12:19 Fan Zhang 阅读(860) 评论(0) 推荐(0)
摘要:PsGetCurrentThread() == Irp->Tail.Overlay.Thread A进程打开设备,返回一个句柄。B进程会duplicate这个句柄 阅读全文
posted @ 2011-12-14 17:11 Fan Zhang 阅读(275) 评论(0) 推荐(0)
摘要:MDL的本质就是记录一段虚拟地址所对应着的一系列的物理地址。MDL数据结构的结尾是一组PFN,记录着物理地址,相关宏是MmGetMdlPfnArray。初始化:一般用用IoAllocateMdl初始化,但是这个步骤并没有建立起虚拟地址和物理地址的联系。IoAllocateMdl会调用MmInitializeMdl用于初始化MDL,填充MDL的header。校验MDL对应的虚拟地址可读写:MmProbeAndLockPages建立与PFN的联系:MmBuildMdlForNonPagedPool,IoBuildPartialMdl,MmProbeAndLockPages建立新的虚拟地址映射:Mm 阅读全文
posted @ 2011-12-13 17:45 Fan Zhang 阅读(968) 评论(0) 推荐(0)
摘要:MSDN的文档只是说不能,但没有说清楚到底为啥。 微软的Doron在他的博客里提了一下,http://blogs.msdn.com/b/doronh/archive/2010/02/02/what-is-irql.aspx,但是还是没有说的太清楚。 其实使用分页内存的时候,如果访问Swap out的内存会触发0E号异常(KiTrap0E),会间接调用MmAccessFault。出于同步要求,他... 阅读全文
posted @ 2011-12-08 23:48 Fan Zhang 阅读(605) 评论(0) 推荐(0)
摘要:1. inline hook 黑客都喜欢用这个方法,很容易被杀毒软件查出来。 2. 在Device Stack中插入filter driver,也很容易被人看出来,并且你不能保证别人插在你之后。 3. 修改Dispatch函数的入口地址,例如bus hound就是这么干的。 阅读全文
posted @ 2011-11-30 10:45 Fan Zhang 阅读(1251) 评论(0) 推荐(0)
摘要:不管是USB或者8042或者虚拟的Keyboard/Mouse,设备栈最上层都是Kbdclass或者Mouclass,操作系统会专门有个现成不停的向设备栈发送Read IRP。 kd> !devstack 80d8eaa0 !DevObj !DrvObj !DevExt ObjectName > 80d8eaa0 \Driver\Kbdclass... 阅读全文
posted @ 2011-11-28 14:20 Fan Zhang 阅读(1243) 评论(0) 推荐(0)
摘要:内核API是KdDisableDebugger。如果Enable就把第一次字节改成C3(Ret) 阅读全文
posted @ 2011-11-25 17:28 Fan Zhang 阅读(233) 评论(0) 推荐(0)
摘要:先说两个典型的应用 1. IoCompleteRequest内部实现,实现在任意上下文的时候,插入kernel APC,把IO操作结果返给相应的线程。 2. Set/Get 上下文的内部实现。 User mode APC:在系统进入Alert状态才会Deliver ,可以参考KeWaitXXXX系列函数,KeTestAlertThread可以返回是否Altert状态。 Kernel ... 阅读全文
posted @ 2011-11-23 15:41 Fan Zhang 阅读(489) 评论(0) 推荐(0)
摘要:在Ring0下,fs指向PCR,而PRCB是PCR的一个扩展。 可以用!pcr和!prcb命令查看,例如: kd> !pcr KPCR for Processor 0 at ffdff000: Major 1 Minor 1 NtTib.ExceptionList: 80551158 NtTib.StackBase: 80551970 ... 阅读全文
posted @ 2011-09-06 18:44 Fan Zhang 阅读(1026) 评论(0) 推荐(0)
摘要:dg 选择子 例如查看任务寄存器 kd> r tr Last set context: tr=00000028 kd> dg 0x28 P Si Gr Pr Lo Sel Base Limit Type l ze an es ng Flags ---- ------... 阅读全文
posted @ 2011-09-06 18:03 Fan Zhang 阅读(199) 评论(0) 推荐(0)
摘要:局部变量是存储在堆栈上的,而栈的大小是固定的。如果局部变量过大,或者函数调用嵌套太深,栈都会被用光。 在Debug版本或者check版本里,编译器会自动插入一段代码帮程序员校验可用堆栈。 void Foo() { 0042F580 55 push ebp 0042F581 8B EC mov ebp,esp 0042F583 B8 D4 00 40 00 mov eax,4000D4h 0042F... 阅读全文
posted @ 2011-08-03 15:23 Fan Zhang 阅读(224) 评论(0) 推荐(0)
摘要:首先要确定是哪个应用程序,然后查看这个应用程序的call stack !process 0 0 列出所有应用程序 !process xxxx 列出应用程序里的所有线程的call stack .thread xxxx 切换到想要调试的线程 设置断点 阅读全文
posted @ 2011-08-03 15:15 Fan Zhang 阅读(329) 评论(0) 推荐(0)
摘要:CPU内部的cache和内存有时候不吻合,虽然CPU是知道的,但是DMA却不知道这些。这就需要在DMA传输之前,强制CPU把cache写回内存。这个命令是KeFlushIoBuffers。 在x86和x64的CPU中,CPU会自动做这个事情,所以对于x86和x64CPU来说,KeFlushIoBuffers是空的。 对于Itanium来说,它不会自动做这些,KeFlushIoBuffers就应该是... 阅读全文
posted @ 2011-06-17 17:24 Fan Zhang 阅读(533) 评论(0) 推荐(0)
摘要:1. NTSYSAPI PIMAGE_NT_HEADERS NTAPI RtlImageNtHeader( IN PVOID ModuleAddress ); 阅读全文
posted @ 2011-06-16 02:27 Fan Zhang 阅读(939) 评论(0) 推荐(0)
摘要:bp ntdll!LdrLoadDll 在断点下输入: ed Kd_LDR_MASK ffffffff ed Kd_MM_MASK ffffffff ed Kd_DEFAULT_MASK ffffffff ed ntdll!ShowSnaps 1 ed ntdll!ShowErrors 1 下面是一段log [5e0,5e4] LDR: Recursive DLL load [5e0,5e4] ... 阅读全文
posted @ 2011-06-16 02:12 Fan Zhang 阅读(875) 评论(0) 推荐(0)
摘要:在WDF程序可以通过WdfFdoQueryForInterface函数得到BUS_INTERFACE_STANDARD 而WDM驱动可以通过下面的函数获得 static NTSTATUS GetPCIBusInterfaceStandard( __in PDEVICE_OBJECT DeviceObject, __out PBUS_INTERFACE_STANDARD BusInterfac... 阅读全文
posted @ 2011-06-15 11:10 Fan Zhang 阅读(977) 评论(0) 推荐(1)