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

上传人:本田雅阁 文档编号:3379206 上传时间:2019-08-20 格式:PPT 页数:34 大小:399.04KB
返回 下载 相关 举报
麦洛克菲内核驱动开发第一课.ppt_第1页
第1页 / 共34页
麦洛克菲内核驱动开发第一课.ppt_第2页
第2页 / 共34页
麦洛克菲内核驱动开发第一课.ppt_第3页
第3页 / 共34页
麦洛克菲内核驱动开发第一课.ppt_第4页
第4页 / 共34页
麦洛克菲内核驱动开发第一课.ppt_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《麦洛克菲内核驱动开发第一课.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分析,ring

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

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

4、rt Baker等著 施诺译 机械工业出版社 寒江独钓:Windows内核安全编程 邵坚磊等著 电子工业出版社 天书夜读:从汇编语言到Windows内核编程邵坚磊等著 电子工业 Windows驱动开发技术详解 张帆 电子工业出版社 Rootkits: Subverting the Windows Kernel Greg Hoglund等著 C:WinDDK7600.16385.0src http:/ http:/ http:/ http:/ MSDN,麦洛克菲,Hello world,.c/.h SOURCES/MAKEFILE .DSP/.DSW EASYSYS/既有框架 安装与运行 虚拟

5、机调试环境搭建,Sources文件: TARGETNAME=HelloDrv(DrvName) TARGETPATH=debug TARGETTYPE=DRIVER SOURCES=main.c other.c Sources文件其它字段: C_DEFINES=$(C_DEFINES) DYOUR_DEFINES INCLUDES=$(INCLUDES);inc TARGETLIBS=$(TARGETLIBS) $(DDK_LIB_PATH)ndis.lib PRECOMPILED_INCLUDE=precomp.h DRIVERTYPE=FS makefile文件: !INCLUDE $(N

6、TMAKEENV)makefile.def,虚拟机设置,创建一个com1串口 XP BOOT.ini(com1可能为com2,取决于vmware这端的ID) multi(0)disk(0)rdisk(0)partition(1)WINDOWS=“Microsoft Windows XP Professional -debug“ /debug /debugport=com1 /baudrate=115200 /fastdetect WIN7 bcdedit /dbgsettings serial baudrate:115200 debugport:1 bcdedit /copy current

7、/d DebugEntry bcdedit /displayorder current d3d5f290-f64b-11de-a86d-aba3805c5629 bcdedit /debug d3d5f290-f64b-11de-a86d-aba3805c5629 ON windbg.exe -k com:port=.pipecom_1,baud=115200,pipe 符号设置: srv*d:symbols*http:/ Vista上DbgPrint启用 HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerDebug

8、Print Filter “DEFAULT” : REG_DWORD : 0xFFFFFFFF,麦洛克菲,驱动框架(1),HOOK函数,驱动框架(2),麦洛克菲,NT模型 DriverEntry()(单线程环境) DispatchCreate()IRP_MJ_CREATE DispatchRead()IRP_MJ_READ DispatchWrite()IRP_MJ_WRITE DispatchClose()IRP_MJ_CLOSE(FileObject引用为0) DispatchClean()IRP_MJ_CLEANUP(Handle引用为0) DispatchControl()IRP_MJ

9、_DEVICE_CONTROL DriverUnload()(单线程环境) WDM WDMAddDevice() WDMPnp() 应用框架 Sfilter/Minifilter TDI/NDIS/WFP DISKPERF HOOK,写一个NTModelDrv,结构定义 卸载例程 分发函数(通用的,单独的) DriverEntry 编译 运行,麦洛克菲,麦洛克菲,IRP结构理解与操作(1),文件过滤驱动设备,文件卷设备,磁盘设备,IRP,驱动设备,IRP,麦洛克菲,IRP结构理解与操作(2),Irp-AssociatedIrp.SystemBuffer Irp-IoStatus.Status

10、Irp-IoStatus.Information Irp-UserBuffer Irp-MdlAddress PIO_STACK_LOCATION irpStack; irpStack = IoGetCurrentIrpStackLocation (Irp); irpStack-Parameters.Read.Length irpStack-Parameters.Read.ByteOffset irpStack-Parameters.DeviceIoControl.IoControlCode irpStack-Parameters.DeviceIoControl.InputBufferLeng

11、th irpStack-Parameters.DeviceIoControl.OutputBufferLength irpStack-MajorFunction irpStack-MinorFunction irpStack-DeviceObject irpStack-FileObject,麦洛克菲,驱动是如何运行的,A驱动: 1创建一个服务(注册表) HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesSrvName 启动GROUP与StartType决定了驱动加载的早晚 StartType为0的比StartType为1的先启动。 同一个Star

12、tType的,按照GroupOrder顺序来启动 HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlGroupOrderList 2对象管理器生成驱动对象(DriverObject),并传递给DriverEntry(),执行DriverEntry入口函数 3创建控制设备对象 4创建控制设备符号链接(RING3可见) 5. 如果是过滤驱动,创建过滤设备对象,绑定 5注册分发函数 6. 其它初始化动作,麦洛克菲,驱动是如何运行的(2),B驱动与应用层交互 Create Read Write DeviceIoControl Close HOOK,麦洛克菲

13、,驱动服务安装,安装: OpenSCManager() CreateService()/OpenService() StartService() 卸载: OpenSCManager() ControlService() - SERVICE_CONTROL_STOP DeleteService(),麦洛克菲,RING3与RING0通信(IOCONTROL),METHOD_BUFFERED pIrp-AssociatedIrp.SystemBuffer; METHOD_IN_DIRECT/METHOD_OUT_DIRECT pIrp-AssociatedIrp.SystemBuffer; pIrp

14、-MdlAddress; METHOD_NEITHER stack-Parameters.DeviceIoControl.Type3InputBuffer; pIrp-UserBuffer;,RING3与RING0通信(DEVICE),DO_BUFFERED_IO pIrp-AssociatedIrp.SystemBuffer; DO_DIRECT_IO pIrp-MdlAddress; MmGetSystemAddressForMdlSafe 其它IO方式 pIrp-UserBuffer; ProbeForWrite /ProbeForRead,麦洛克菲,RING3与RING0通信,HAND

15、LE 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),什么是

16、RING0与RING3 R0/R1/R2/R3 X64:只剩下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_SUCCESS STATUS_UNSUCCESSFUL STATUS_ACCESS_DENIED STATUS_INSUF

17、FICIENT_RESOURCES 内存分配:PagedPool/NonPagedPool/tag,RING3与RING0开发区别(3),API调用与中断级别,麦洛克菲,驱动在安全领域的应用?,1绑定与过滤 Sfilter/minifilter 2HOOK SSDT X64怎么办? 3. 回调 CmRegisterCallback minifilter,麦洛克菲,驱动API分类集合,ExXxx() IoXxx() KeXxx() MmXxx() ObXxx() PsXxx() RtlXxx() ZwXxx() FltXxx() NdisXxx(),ExAllocatePoolWithTag()

18、 ExAcquireFastMutex ExGetPreviousMode IoCreateDevice IoCreateSymbolicLink IoGetCurrentIrpStackLocation IoAttachDeviceToDeviceStack IoAllocateIrp IoSetCompletionRoutine KeWaitForSingleObject KeSetEvent KeInitializeEvent,ObReferenceObjectByHandle ObQueryNameString PsGetCurrentProcess PsGetCurrentProce

19、ssId PsCreateSystemThread PsLookupProcessByProcessId RtlZeroMemory RtlInitUnicodeString ZwOpenKey ZwCreateFile ZwOpenProcess ZwQuerySystemInformation MmGetSystemRoutineAddress MmIsAddressValid,麦洛克菲,良好的驱动开发习惯,1. MmIsAddressValid函数不可靠 2.一定要保证在try_execpt内完成对于用户态内存的任何操作 3.设备控制尽量使用BUFFERED IO 4.使用内核校验器(v

20、erifier)和Fuzz工具测试驱动,麦洛克菲,驱动调试(1),* kb/|*/ bl/bc/bd/be bp/bu/bm/ bp /p eprocess bp /t ethread ba w4/r4/e1/i4/ addr db/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 Addr kv/kb/kp (FPO) .open -a crash!wmain+0x33 .reloa

21、d /i symopt +40 lm/lm n t/lm vm .dump /f .dump /m .dump /mf .dump /ma .crash,x nt!*显示匹配符号 !process 0 0 !process EPROCESS 7 .process EPROCESS .thread ETHREAD !thread ETHREAD enable_unicode 1 windbg.exe I(大写I) adplus.vbs -hang(或-crash) -p 1234 (或-pn xyz.exe) -dbg WinDbg.exe -o d:dump,驱动调试(2),ssdt:dds

22、poi(nt!KeServiceDescriptorTable) L200 Shadow ssdt: 启动notepad !process 0 0 .process /p NOTEPAD eprocess .reload x win32k!* uf win32k!NtUserGetForegroundWindow,驱动调试(3),BSOD 关闭了无效的HANDLE 在没有ObReferenceObject(pFileObject)的情况下ObDereferenceObject(pFileObject) 引用NULL指针 内存访问越界,BAD POOL HEADER 高中断级访问了缺页内存DRI

23、VER_IRQL_NOT_LESS_OR_EQUAL !analyze v R0与R3联调,麦洛克菲,第一个驱动例子:进程创建监视,VOID ProcessCreateMon(); VOID ThreadCreateMon(); PsSetCreateThreadNotifyRoutine PsSetCreateProcessNotifyRoutine,麦洛克菲,练习与作业,实现char *strstr(const char *s1, const char *s2) 默写一个NTModelDrv驱动,并实现R3与R0通信 R3与R0联调 改写NTModelDrv,促使其蓝屏发生,分析蓝屏 思考如何将ProcWatch监控到的内容发送到R3来,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1