麦洛克菲内核驱动开发第一课

上传人:鲁** 文档编号:579730133 上传时间:2024-08-27 格式:PPT 页数:34 大小:399.02KB
返回 下载 相关 举报
麦洛克菲内核驱动开发第一课_第1页
第1页 / 共34页
麦洛克菲内核驱动开发第一课_第2页
第2页 / 共34页
麦洛克菲内核驱动开发第一课_第3页
第3页 / 共34页
麦洛克菲内核驱动开发第一课_第4页
第4页 / 共34页
麦洛克菲内核驱动开发第一课_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《麦洛克菲内核驱动开发第一课》由会员分享,可在线阅读,更多相关《麦洛克菲内核驱动开发第一课(34页珍藏版)》请在金锄头文库上搜索。

1、2012-03-03麦洛克菲内核开发第一课麦洛克菲周扬荣周扬荣上课整体安排n周六,周日下午1点到6点q地点:清华园宾馆旁边n周三,周四晚上8点到10点辅导q地点:回龙观地铁对面首开智慧社4楼1单元1204n时间:3月3日到7月1日(中间清明和五一正常放假)n手机调为震动n交作业时间:每周五晚上n意见反馈q学员群:183948142q邮箱:麦洛克菲麦洛克菲提纲n测试试题串讲nHelloworld编译与运行n驱动框架n驱动是如何运行的n驱动服务安装nRING3与RING0通信nRING3与RING0开发区别n驱动API分类集合n常见的驱动漏洞、缺陷问题的7大忠告n调试(蓝屏DUMP分析,ring3

2、与ring0联调)n第一个驱动例子:进程创建监视测试与基础n打印格式q%c%wc%C%d%ld%i64d%D%Lq%s%ws%S%u%x%p%f%Z%wZn数据对齐n系统内存布局n程序内存布局n位运算(数的表示与存储补码/低位优先)qC语言:0x/0u/l/ul/i64/ll/LLq汇编:1aH/17O/12D/110Bn函数形参参数n内存分配/堆/栈n调用约定与栈帧、FPO优化q(stdcall,cdecl,fastcall,thiscall,nakedcall)n算法(确定原型,输入检查(严进宽出),边界考虑,出错处理,性能优化)麦洛克菲麦洛克菲麦洛克菲麦洛克菲努力方向nC语言(数据结构,

3、操作系统,汇编,编译原理)nUI界面(MFC/WTL)n内核n调试(WINDBG)(F1HELP文档)n逆向(IDA/OLLYDBG)麦洛克菲麦洛克菲基础书籍推荐nC程序设计谭浩强清华大学出版社nC语言入门经典英文版nC语言编程精粹姜静波等译电子工业n高质量C+/C编程指南林锐电子工业nEffectiveC+侯捷译 华中科技大学出版社nMoreEffectiveC+侯捷译 中国电力出版社n程序员求职成功路周扬荣机械工业出版社n汇编语言王爽清华大学出版社nVC技术内幕n深入浅出MFC麦洛克菲麦洛克菲内核书籍推荐nWindows2000设备驱动程序设计指南ArtBaker等著施诺译机械工业出版社n

4、寒江独钓:Windows内核安全编程邵坚磊等著电子工业出版社n天书夜读:从汇编语言到Windows内核编程邵坚磊等著电子工业nWindows驱动开发技术详解张帆电子工业出版社nRootkits:SubvertingtheWindowsKernelGregHoglund等著nC:WinDDK7600.16385.0srcnhttp:/nhttp:/nhttp:/nhttp:/nMSDN麦洛克菲麦洛克菲Hello worldn.c/.hnSOURCES/MAKEFILEn.DSP/.DSWnEASYSYS/既有框架n安装与运行n虚拟机调试环境搭建Sources文件:TARGETNAME=Hello

5、Drv(DrvName)TARGETPATH=debugTARGETTYPE=DRIVERSOURCES=main.cother.cSources文件其它字段:C_DEFINES=$(C_DEFINES)DYOUR_DEFINESINCLUDES=$(INCLUDES);.incTARGETLIBS=$(TARGETLIBS)$(DDK_LIB_PATH)ndis.libPRECOMPILED_INCLUDE=precomp.hDRIVERTYPE=FSmakefile文件文件:!INCLUDE$(NTMAKEENV)makefile.def虚拟机设置n创建一个com1串口nXPBOOT.in

6、i(com1可能为com2,取决于vmware这端的ID)qmulti(0)disk(0)rdisk(0)partition(1)WINDOWS=MicrosoftWindowsXPProfessional-debug/debug/debugport=com1/baudrate=115200/fastdetectnWIN7qbcdedit/dbgsettingsserialbaudrate:115200debugport:1qbcdedit/copycurrent/dDebugEntryqbcdedit/displayordercurrentd3d5f290-f64b-11de-a86d-ab

7、a3805c5629qbcdedit/debugd3d5f290-f64b-11de-a86d-aba3805c5629ONnwindbg.exe-kcom:port=.pipecom_1,baud=115200,pipen符号设置:qsrv*d:symbols*http:/ Header0n头部堆栈IO_STATUS_BLOCKStatusInformationIO_STACK_LOCATIONMajorFunctionMinorFunctionunion struct Read;struct Write;struct DeviceControl; Parameters;DeviceObje

8、ctFileObject文件过滤驱动设备文件卷设备磁盘设备IRP驱动设备IRP麦洛克菲麦洛克菲IRP结构理解与操作(2)Irp-AssociatedIrp.SystemBufferIrp-IoStatus.StatusIrp-IoStatus.InformationIrp-UserBufferIrp-MdlAddressPIO_STACK_LOCATIONirpStack;irpStack=IoGetCurrentIrpStackLocation(Irp);irpStack-Parameters.Read.LengthirpStack-Parameters.Read.ByteOffsetirp

9、Stack-Parameters.DeviceIoControl.IoControlCodeirpStack-Parameters.DeviceIoControl.InputBufferLengthirpStack-Parameters.DeviceIoControl.OutputBufferLengthirpStack-MajorFunctionirpStack-MinorFunctionirpStack-DeviceObjectirpStack-FileObject麦洛克菲麦洛克菲驱动是如何运行的nA驱动:驱动:q1创建一个服务(注册表)nHKEY_LOCAL_MACHINESYSTEMC

10、urrentControlSetServicesSrvNamen启动GROUP与StartType决定了驱动加载的早晚nStartType为0的比StartType为1的先启动。n同一个StartType的,按照GroupOrder顺序来启动nHKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlGroupOrderListq2对象管理器生成驱动对象(DriverObject),并传递给DriverEntry(),执行DriverEntry入口函数q3创建控制设备对象q4创建控制设备符号链接(RING3可见)q5.如果是过滤驱动,创建过滤设备对象,绑定

11、q5注册分发函数q6.其它初始化动作麦洛克菲麦洛克菲驱动是如何运行的(2)nB驱动与应用层交互驱动与应用层交互qCreateqReadqWriteqDeviceIoControlqClosenHOOK麦洛克菲麦洛克菲驱动服务安装n安装:qOpenSCManager()qCreateService()/OpenService()qStartService()n卸载:qOpenSCManager()qControlService()-SERVICE_CONTROL_STOPqDeleteService()麦洛克菲麦洛克菲RING3与RING0通信(IOCONTROL)nMETHOD_BUFFERE

12、DqpIrp-AssociatedIrp.SystemBuffer;nMETHOD_IN_DIRECT/METHOD_OUT_DIRECTqpIrp-AssociatedIrp.SystemBuffer;qpIrp-MdlAddress;nMETHOD_NEITHERqstack-Parameters.DeviceIoControl.Type3InputBuffer;qpIrp-UserBuffer;RING3与RING0通信(DEVICE)nDO_BUFFERED_IOqpIrp-AssociatedIrp.SystemBuffer;nDO_DIRECT_IOqpIrp-MdlAddress

13、;MmGetSystemAddressForMdlSafen其它IO方式qpIrp-UserBuffer;ProbeForWrite/ProbeForRead麦洛克菲麦洛克菲RING3与RING0通信HANDLEhDevice=CreateFile(.NTModelDrv,GENERIC_WRITE|GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);if(hDevice=INVALID_HANDLE_VALUE)return;CHARbufRead1024=0;CHARbufWrite1024=Hello,world;DWORDdwRead=0;DWORDdw

14、Write=0;ReadFile(hDevice,bufRead,1024,&dwRead,NULL);WriteFile(hDevice,bufWrite,strlen(bufWrite)+1,&dwWrite,NULL);CHARbufInput1024=Hello,world;CHARbufOutput1024=0;DWORDdwRet=0;DeviceIoControl(hDevice,IOCTL_HELLO,bufInput,sizeof(bufInput),bufOutput,sizeof(bufOutput),&dwRet,NULL);CloseHandle(hDevice);麦

15、洛克菲麦洛克菲RING3与RING0开发区别(1)n什么是RING0与RING3qR0/R1/R2/R3qX64:只剩下R0和R3q虚拟技术:n0/1/3模式(速度,兼容)n0/3模式(稳定性)nVT:根模式/-1(环的旁边)RING3与RING0开发区别(2)nprintf/scanf/fopen/fclose/fwrite/fread/malloc/free不能用nsprintf/strlen/strcpy/wcslen/wcscpy/memcpy/memset可用nNTSTATUS/NT_SUCCESS()qSTATUS_SUCCESSqSTATUS_UNSUCCESSFULqSTATU

16、S_ACCESS_DENIEDqSTATUS_INSUFFICIENT_RESOURCESn内存分配:PagedPool/NonPagedPool/tagRING3与RING0开发区别(3)nAPI调用与中断级别麦洛克菲麦洛克菲驱动在安全领域的应用?驱动在安全领域的应用?n1绑定与过滤qSfilter/minifiltern2HOOKqSSDTqX64怎么办?n3.回调qCmRegisterCallbackqminifilter麦洛克菲麦洛克菲驱动API分类集合nExXxx()nIoXxx()nKeXxx()nMmXxx()nObXxx()nPsXxx()nRtlXxx()nZwXxx()nF

17、ltXxx()nNdisXxx()ExAllocatePoolWithTag()ExAcquireFastMutexExGetPreviousModeIoCreateDeviceIoCreateSymbolicLinkIoGetCurrentIrpStackLocationIoAttachDeviceToDeviceStackIoAllocateIrpIoSetCompletionRoutineKeWaitForSingleObjectKeSetEventKeInitializeEventObReferenceObjectByHandleObQueryNameStringPsGetCurren

18、tProcessPsGetCurrentProcessIdPsCreateSystemThreadPsLookupProcessByProcessIdRtlZeroMemoryRtlInitUnicodeStringZwOpenKeyZwCreateFileZwOpenProcessZwQuerySystemInformationMmGetSystemRoutineAddressMmIsAddressValid麦洛克菲麦洛克菲良好的驱动开发习惯n1. MmIsAddressValid函数不可靠函数不可靠n2.一定要保证在一定要保证在try_execpt内完成对于用户态内完成对于用户态内存的任何

19、操作内存的任何操作n3.设备控制尽量使用设备控制尽量使用BUFFERED IOn4.使用内核校验器使用内核校验器(verifier)和和Fuzz工具工具测试驱动麦洛克菲麦洛克菲驱动调试(1)n*kb/|*/nbl/bc/bd/benbp/bu/bm/bp/peprocessbp/tethreadnbaw4/r4/e1/i4/addrndb/dw/dd/dq/du/da/ds/dS(显示内存)nddu/ddp/dda/dpp/dpu/dpa/dqp/dqa/dqu(显示含有指针的内存)ndds/dqs/dps(显示含有符号地址的内存)ndtnt!_eprocessndtnt!_eprocessA

20、ddrnkv/kb/kp(FPO)n.open-acrash!wmain+0x33n.reload/insymopt+40nlm/lmnt/lmvmn.dump/fn.dump/mn.dump/mfn.dump/man.crashxnt!*显示匹配符号!process00!processEPROCESS7.processEPROCESS.threadETHREAD!threadETHREADenable_unicode1windbg.exeI(大写I)adplus.vbs-hang(或-crash)-p1234(或-pnxyz.exe)-dbgWinDbg.exe-od:dump驱动调试(2)

21、nssdt:ddspoi(nt!KeServiceDescriptorTable)L200nShadowssdt:q启动notepadq!process00q.process/pNOTEPADeprocessq.reloadqxwin32k!*qufwin32k!NtUserGetForegroundWindow驱动调试(3)nBSODq关闭了无效的HANDLEq在没有ObReferenceObject(pFileObject)的情况下ObDereferenceObject(pFileObject)q引用NULL指针q内存访问越界,BADPOOLHEADERq高中断级访问了缺页内存DRIVER

22、_IRQL_NOT_LESS_OR_EQUALq!analyzevnR0与R3联调麦洛克菲麦洛克菲第一个驱动例子:进程创建监视nVOIDProcessCreateMon();nVOIDThreadCreateMon();nPsSetCreateThreadNotifyRoutinenPsSetCreateProcessNotifyRoutine麦洛克菲麦洛克菲练习与作业n实现char*strstr(constchar*s1,constchar*s2)n默写一个NTModelDrv驱动,并实现R3与R0通信nR3与R0联调n改写NTModelDrv,促使其蓝屏发生,分析蓝屏n思考如何将ProcWatch监控到的内容发送到R3来64KB NULL空间进程空间64KB非法区域2GB内核空间0x000000000x0000ffff0x7fff00000x7fffffff0xffffffff 静态常量数据代码 堆(非连续区域) 空闲区栈及增长方向内存方向低 高全局变量区参数n参数1返回地址老ebp局部变量区ebpesp栈增长方向内存增长方向

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号