《麦洛克菲内核驱动开发第一课.ppt》由会员分享,可在线阅读,更多相关《麦洛克菲内核驱动开发第一课.ppt(34页珍藏版)》请在三一办公上搜索。
1、2012-03-03,麦洛克菲内核开发第一课,麦洛克菲,周扬荣,上课整体安排,周六,周日下午1点到6点地点:清华园宾馆旁边周三,周四晚上8点到10点辅导地点:回龙观地铁对面首开智慧社4楼1单元1204时间:3月3日到7月1日(中间清明和五一正常放假)手机调为震动交作业时间:每周五晚上意见反馈学员群:183948142邮箱:,麦洛克菲,提纲,测试试题串讲Hello world编译与运行驱动框架驱动是如何运行的驱动服务安装RING3与RING0通信RING3与RING0开发区别驱动API分类集合常见的驱动漏洞、缺陷问题的7大忠告调试(蓝屏DUMP分析,ring3与ring0联调)第一个驱动例子:进
2、程创建监视,测试与基础,打印格式%c%wc%C%d%ld%i64d%D%L%s%ws%S%u%x%p%f%Z%wZ数据对齐系统内存布局程序内存布局位运算(数的表示与存储 补码/低位优先)C语言:0 x/0 u/l/ul/i64/ll/LL汇编:1aH/17O/12D/110B函数形参参数内存分配/堆/栈调用约定与栈帧、FPO优化(stdcall,cdecl,fastcall,thiscall,nakedcall)算法(确定原型,输入检查(严进宽出),边界考虑,出错处理,性能优化),麦洛克菲,麦洛克菲,努力方向,C语言(数据结构,操作系统,汇编,编译原理)UI界面(MFC/WTL)内核调试(WI
3、NDBG)(F1HELP文档)逆向(IDA/OLLYDBG),麦洛克菲,基础书籍推荐,C程序设计 谭浩强 清华大学出版社C语言入门经典英文版C语言编程精粹 姜静波等译 电子工业高质量C+/C编程指南 林锐 电子工业Effective C+侯捷译 华中科技大学出版社More Effective C+侯捷译 中国电力出版社程序员求职成功路 周扬荣 机械工业出版社汇编语言 王爽 清华大学出版社VC技术内幕深入浅出MFC,麦洛克菲,内核书籍推荐,Windows 2000设备驱动程序设计指南 Art Baker等著 施诺译 机械工业出版社寒江独钓:Windows内核安全编程 邵坚磊等著 电子工业出版社天
4、书夜读:从汇编语言到Windows内核编程邵坚磊等著 电子工业 Windows驱动开发技术详解 张帆 电子工业出版社 Rootkits:Subverting the Windows Kernel GregHoglund等著C:WinDDK7600.16385.0srchttp:/http:/http:/http:/MSDN,麦洛克菲,Hello world,.c/.hSOURCES/MAKEFILE.DSP/.DSWEASYSYS/既有框架安装与运行虚拟机调试环境搭建,Sources文件:TARGETNAME=HelloDrv(DrvName)TARGETPATH=debugTARGETTYP
5、E=DRIVERSOURCES=main.c other.cSources文件其它字段:C_DEFINES=$(C_DEFINES)DYOUR_DEFINESINCLUDES=$(INCLUDES);.incTARGETLIBS=$(TARGETLIBS)$(DDK_LIB_PATH)ndis.libPRECOMPILED_INCLUDE=precomp.hDRIVERTYPE=FSmakefile文件:!INCLUDE$(NTMAKEENV)makefile.def,虚拟机设置,创建一个com1串口XP BOOT.ini(com1可能为com2,取决于vmware这端的ID)multi(0)
6、disk(0)rdisk(0)partition(1)WINDOWS=Microsoft Windows XP Professional-debug/debug/debugport=com1/baudrate=115200/fastdetectWIN7bcdedit/dbgsettings serial baudrate:115200 debugport:1bcdedit/copy current/d DebugEntrybcdedit/displayorder current d3d5f290-f64b-11de-a86d-aba3805c5629bcdedit/debug d3d5f290
7、-f64b-11de-a86d-aba3805c5629 ONwindbg.exe-k com:port=.pipecom_1,baud=115200,pipe 符号设置:srv*d:symbols*http:/ManagerDebug Print Filter“DEFAULT”:REG_DWORD:0 xFFFFFFFF,麦洛克菲,驱动框架(1),HOOK函数,驱动框架(2),麦洛克菲,NT模型DriverEntry()(单线程环境)DispatchCreate()IRP_MJ_CREATEDispatchRead()IRP_MJ_READDispatchWrite()IRP_MJ_WRIT
8、EDispatchClose()IRP_MJ_CLOSE(FileObject引用为0)DispatchClean()IRP_MJ_CLEANUP(Handle引用为0)DispatchControl()IRP_MJ_DEVICE_CONTROLDriverUnload()(单线程环境)WDMWDMAddDevice()WDMPnp()应用框架Sfilter/MinifilterTDI/NDIS/WFPDISKPERFHOOK,写一个NTModelDrv,结构定义卸载例程分发函数(通用的,单独的)DriverEntry编译运行,麦洛克菲,麦洛克菲,IRP结构理解与操作(1),文件过滤驱动设备,
9、文件卷设备,磁盘设备,IRP,驱动设备,IRP,麦洛克菲,IRP结构理解与操作(2),Irp-AssociatedIrp.SystemBufferIrp-IoStatus.StatusIrp-IoStatus.InformationIrp-UserBufferIrp-MdlAddressPIO_STACK_LOCATION irpStack;irpStack=IoGetCurrentIrpStackLocation(Irp);irpStack-Parameters.Read.LengthirpStack-Parameters.Read.ByteOffsetirpStack-Parameters
10、.DeviceIoControl.IoControlCodeirpStack-Parameters.DeviceIoControl.InputBufferLengthirpStack-Parameters.DeviceIoControl.OutputBufferLengthirpStack-MajorFunctionirpStack-MinorFunctionirpStack-DeviceObjectirpStack-FileObject,麦洛克菲,驱动是如何运行的,A驱动:1创建一个服务(注册表)HKEY_LOCAL_MACHINESYSTEMCurrentControlSetService
11、sSrvName启动GROUP与StartType决定了驱动加载的早晚StartType为0的比StartType为1的先启动。同一个StartType的,按照GroupOrder顺序来启动HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlGroupOrderList2对象管理器生成驱动对象(DriverObject),并传递给DriverEntry(),执行DriverEntry入口函数3创建控制设备对象4创建控制设备符号链接(RING3可见)5.如果是过滤驱动,创建过滤设备对象,绑定5注册分发函数6.其它初始化动作,麦洛克菲,驱动是如何运行的(
12、2),B驱动与应用层交互CreateReadWriteDeviceIoControlCloseHOOK,麦洛克菲,驱动服务安装,安装:OpenSCManager()CreateService()/OpenService()StartService()卸载:OpenSCManager()ControlService()-SERVICE_CONTROL_STOPDeleteService(),麦洛克菲,RING3与RING0通信(IOCONTROL),METHOD_BUFFEREDpIrp-AssociatedIrp.SystemBuffer;METHOD_IN_DIRECT/METHOD_OUT
13、_DIRECTpIrp-AssociatedIrp.SystemBuffer;pIrp-MdlAddress;METHOD_NEITHERstack-Parameters.DeviceIoControl.Type3InputBuffer;pIrp-UserBuffer;,RING3与RING0通信(DEVICE),DO_BUFFERED_IOpIrp-AssociatedIrp.SystemBuffer;DO_DIRECT_IOpIrp-MdlAddress;MmGetSystemAddressForMdlSafe 其它IO方式pIrp-UserBuffer;ProbeForWrite/Pro
14、beForRead,麦洛克菲,RING3与RING0通信,HANDLE hDevice=CreateFile(.NTModelDrv,GENERIC_WRITE|GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);if(hDevice=INVALID_HANDLE_VALUE)return;CHAR bufRead1024=0;CHAR bufWrite1024=Hello,world;DWORD dwRead=0;DWORD dwWrite=0;ReadFile(hDevice,bufRead,1024,麦洛克菲,RING3与RING0开发区别(1),什么是R
15、ING0与RING3R0/R1/R2/R3X64:只剩下R0和R3虚拟技术:0/1/3模式(速度,兼容)0/3模式(稳定性)VT:根模式/-1(环的旁边),RING3与RING0开发区别(2),printf/scanf/fopen/fclose/fwrite/fread/malloc/free不能用sprintf/strlen/strcpy/wcslen/wcscpy/memcpy/memset可用NTSTATUS/NT_SUCCESS()STATUS_SUCCESSSTATUS_UNSUCCESSFULSTATUS_ACCESS_DENIEDSTATUS_INSUFFICIENT_RESOU
16、RCES内存分配:PagedPool/NonPagedPool/tag,RING3与RING0开发区别(3),API调用与中断级别,麦洛克菲,驱动在安全领域的应用?,1绑定与过滤 Sfilter/minifilter2HOOK SSDT X64怎么办?3.回调 CmRegisterCallback minifilter,麦洛克菲,驱动API分类集合,ExXxx()IoXxx()KeXxx()MmXxx()ObXxx()PsXxx()RtlXxx()ZwXxx()FltXxx()NdisXxx(),ExAllocatePoolWithTag()ExAcquireFastMutex ExGetPr
17、eviousModeIoCreateDeviceIoCreateSymbolicLinkIoGetCurrentIrpStackLocationIoAttachDeviceToDeviceStackIoAllocateIrpIoSetCompletionRoutineKeWaitForSingleObjectKeSetEventKeInitializeEvent,ObReferenceObjectByHandleObQueryNameStringPsGetCurrentProcessPsGetCurrentProcessIdPsCreateSystemThreadPsLookupProcess
18、ByProcessIdRtlZeroMemoryRtlInitUnicodeStringZwOpenKeyZwCreateFileZwOpenProcessZwQuerySystemInformationMmGetSystemRoutineAddressMmIsAddressValid,麦洛克菲,良好的驱动开发习惯,1.MmIsAddressValid函数不可靠2.一定要保证在try_execpt内完成对于用户态内存的任何操作 3.设备控制尽量使用BUFFERED IO4.使用内核校验器(verifier)和Fuzz工具测试驱动,麦洛克菲,驱动调试(1),*kb/|*/bl/bc/bd/beb
19、p/bu/bm/bp/p eprocess bp/t ethread ba w4/r4/e1/i4/addrdb/dw/dd/dq/du/da/ds/dS(显示内存)ddu/ddp/dda/dpp/dpu/dpa/dqp/dqa/dqu(显示含有指针的内存)dds/dqs/dps(显示含有符号地址的内存)dt nt!_eprocess dt nt!_eprocess Addrkv/kb/kp(FPO).open-a crash!wmain+0 x33.reload/isymopt+40lm/lm n t/lm vm.dump/f.dump/m.dump/mf.dump/ma.crash,x n
20、t!*显示匹配符号!process 0 0!process EPROCESS 7.process EPROCESS.thread ETHREAD!thread ETHREADenable_unicode 1 windbg.exe I(大写I)adplus.vbs-hang(或-crash)-p 1234(或-pn xyz.exe)-dbg WinDbg.exe-o d:dump,驱动调试(2),ssdt:dds poi(nt!KeServiceDescriptorTable)L200Shadow ssdt:启动notepad!process 0 0.process/p NOTEPAD epro
21、cess.reloadx win32k!*uf win32k!NtUserGetForegroundWindow,驱动调试(3),BSOD关闭了无效的HANDLE在没有ObReferenceObject(pFileObject)的情况下ObDereferenceObject(pFileObject)引用NULL指针内存访问越界,BAD POOL HEADER 高中断级访问了缺页内存DRIVER_IRQL_NOT_LESS_OR_EQUAL!analyze vR0与R3联调,麦洛克菲,第一个驱动例子:进程创建监视,VOID ProcessCreateMon();VOID ThreadCreateMon();PsSetCreateThreadNotifyRoutinePsSetCreateProcessNotifyRoutine,麦洛克菲,练习与作业,实现char*strstr(const char*s1,const char*s2)默写一个NTModelDrv驱动,并实现R3与R0通信R3与R0联调改写NTModelDrv,促使其蓝屏发生,分析蓝屏思考如何将ProcWatch监控到的内容发送到R3来,