驱动程序设计基础.doc
《驱动程序设计基础.doc》由会员分享,可在线阅读,更多相关《驱动程序设计基础.doc(78页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、驱动程序设计基础本文档又看雪软件安全论坛提供专题负责人:CCDeath参与人员:sislcb、vbcs、qqeleven、xhackx、火影、猪头三开题目前还没有独立驱动专业,很多人都是自学。写专题可以使所学知识系统化,规范化,运用起来思路清晰。写代码,刚开始尽量多写。代码能看懂并不能代表就能写,就像有看过windows部分源代码,不一定就能写出一个windows出来。代码有时候看比较简单的,但还需在键盘敲一下:-)。编码使要越写越深入,越写越规范。是个量变达到质变的过程。经历我有幸能在trw2000刘涛涛那边工作过二十几天,以下都是只从技术角度去看一切的。代码要写的漂亮,不能随便浪费一个字节
2、。精确的是到字节,不是随便定义int类型。个人感觉刘涛涛很有勤奋精神。他挖第一桶金的时候,可以连续工作一个月,赚了十万,头酸背痛的。是个善于学习的人,也能快速移植别人的想法,会做笔记,会思考。虽然现在离开,出来到其他公司一直深受到他的影响。结尾其实IT行业,不是很幸苦,就是有时候觉得工资不高而已。驱动有时候可以用IDA逆微软dll,看一下微软写的。驱动专题还有很多不完善的地方,需要每个人动起手来,写写。相信你,你会越写越漂亮的:-) 思路先用三个小专题介绍驱动流程,再用三个小专题介绍驱动程序是如何与应用程序进行通信的。然后分析一个经典驱动源码,最后再写监控程序。CCDeath2008.4.11
3、目录由此开始1真正的驱动入门(一)5驱动开发和调试的环境设置11inf文件的编写17驱动动态加载20WDM驱动中使用DeviceIoControl,CreateFile29WDM驱动程序使用Buffer I/O,Direct,Neither模式传递数据(修正版)38驱动和应用层的异步通信51真正的驱动入门(二)56filedisk源码分析67偶写的Ring0监控程序PRMonitor源代码(ddk+sdk)71驱动程序中几个常见例程(读书笔记)72过滤驱动中创建IRP时IO堆栈单元的细节处理76由此开始一、三个专题驱动整个入门流程内容列表流程一.配置VC+、不同操作系统对应的DDK、虚拟机VM
4、Ware,安装调试器SofticeorWinDbg;流程二.编译第一个最简单的Hello程序(DDK环境、VC+DDK环境都可),并用监视器观察输出结果.流程三.编写*.inf文件,进行手工安装到电脑上,并设备管理器进行观察.单独出来专题,可使用流程六流程四.编写一个自动加载驱动程序、卸载驱动程序的应用程序。单独出来专题,可使用流程六流程五.设置好调试器,特别是WinDbg双机调试通过com1端口。下载好符号表,转换格式,进行源码调试。Softice调试器,如果是XP系统,请下载补丁.流程六.提供一个快捷方式解决流程三.四途径,不够建议多多使用上面,多多了解计算机。装一个DirverStudi
5、o3.2,只是用里面的快捷工具,如EzDriverIntaller、DriverMonitor。任务:通过流程一、二、六、五可以直接完成任务。但是如果你想知道更多就按照流程一、二、三、四、五、六.来完成。总成果:心中有整个流程思想,编写第一个HelloWorld驱动程序,踏进驱动之门。课题3.1驱动整个入门流程之流程一、二、六、五课题要求:配置VC+、不同操作系统对应的DDK、虚拟机VMWare,安装调试器SofticeorWinDbg;成果3.1:编写得到第一个HelloWorld驱动程序相关解决方案:驱动开发和调试环境的设置(由qqeleven完成)真正的驱动入门()附小程序代码(由ccd
6、eath完成)课题3.2驱动整个入门流程之流程三课题要求:相信你3.1课题没问题吧,编译好驱动为*.sys。安装*.inf,接着用设备管理器进行观察。介绍*inf格式及如何编写成果3.2:编写得到一个简单HelloWorld的*.inf相关解决方案:inf文件的编写(由sislcb完成)课题3.3驱动整个入门流程之流程四课题要求:相信你3.1课题没问题吧,这个应用程序可以是控制台或者是Win32程序,打开服务管理之类,创建服务。能够把编译好的驱动程序,加载、卸载测试一下,在监视器进行观察.成果3.3:编写得到一个快捷加载、卸载驱动程序的应用程序相关解决方案:驱动整个入门流程之流程四-驱动动态加
7、载(由sislcb完成)二三个专题WDM驱动程序与应用程序之间的通信通信一.理解驱动程序基本框架,特别同步、IRP请求包这部分.通信二.应用程序可以分为:古老控制台main()、win32SDK程序、win32MFC框架,只需完成其中一个即可。通信三.驱动程序获取数据缓冲区三种方式:METHOD_BUFFERED,METHOD_IN(OUT)_DIRECT,METHOD_NEITHER;通信四.通信方式DeviceIoControl、事件通知(针对win32)等.通信五.调试、运行、观察结果任务:这个是在驱动整个入门流程基础上进行深化。总成果:从一到二是一个跨越式进步,通信实例程序。Fight
8、!课题3.4WDM驱动程序与应用程序之间的通信二课题要求:会使用DeviceIoControl访问,解决CreateFile问题,寻找桥梁-设备接口GUID。古老控制台main()、win32SDK程序、win32MFC框架,只需完成其中一个即可。成果3.4:编写得到一个测试程序框架,main()、win32SDK、win32MFC相关解决方案:WDM驱动中使用DeviceIoControl,CreateFile(由火影完成)课题3.5WDM驱动程序与应用程序之间的通信三课题要求:对控制命令,还有文件包含路径不要出错。驱动程序获取数据缓冲区三种方式:METHOD_BUFFERED,METHOD
9、_IN(OUT)_DIRECT,METHOD_NEITHER;成果3.5:编写得到一个驱动程序,能够分别把这三中获取数据方法。相关解决方案:WDM驱动程序使用BufferI/O,Direct,Neither模式传递数据(由火影完成)课题3.6WDM驱动程序与应用程序之间的通信四课题要求:通信方式DeviceIoControl异步、事件通知(针对win32)等,有可能还需要用到自旋锁.成果3.6:编写得到一个驱动程序,能够满足其中一种方式就可以了。相关解决方案:驱动和应用层的异步通信(由sislcb完成)真正的驱动入门(二)附2个源代码(由CCDeath完成)三filedisk源码分析课题3.7
10、filedisk源码分析课题要求:分析出应用层和核心层的整体框架思路成果3.7:filedisk源码分析相关解决方案:filedisk源码分析(由ccdeath完成)四Ring0级监控程序课题3.8Ring0监控程序PRMonitor源代码(ddk+sdk)课题要求:通过ssdthook实现对进程创建,注册表修改和内核模块加载的监控相关解决方案:偶写的Ring0监控程序PRMonitor源代码(ddk+sdk)(由xhackx完成)五学习驱动碰到难题解决经验与学习笔记分享课题3.*总结课题要求:亲身感受相关解决方案:驱动程序中几个常见例程读书笔记(由vbcs完成)过滤驱动中创建IRP时IO堆栈
11、单元的细节处理(由猪头三完成)六.经典驱动代码发布区课题要求:注明版权信息,还有链接信息相关解决方案:一份虚拟光驱的源码(由vbcs提供)七.驱动资源发布区codeproject驱动教程谢谢jingru提供待续.可以涉及网络驱动、文件系统过滤驱动、*驱动等领域是不是越来越有趣了.注:大家可以一起把上面的专题完成,挑自己感兴趣课题来完成,看看有什么不同的解决方案,即使出现相同的解决方案,也可以贴出你自己的想法.让看雪见证我们一起进步.祝大家新春快乐,好运连连.CCDeath2008.03.01真正的驱动入门(一)作 者: CCDeath时 间: 2007-12-07,23:13链 接: 【文章标
12、题】:真正的驱动入门()附小程序代码【文章作者】:CCDeath【下载地址】:自己搜索下载【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!【附件下载】:down-【详细过程】很多初学驱动入门比较难.最后发现“难”是难在配置方面和WDM型几个比较抽象的概念。偶学了有半个月吧,很多网上写的不全,终于了解比较简单的整个流程了.1.书籍推荐有个大侠推荐的.这些书籍可以从看雪、电骡、迅雷、驱网、得益网下得到.前提必须会点c语言、MFC框架测试的时候,弄一个比较漂亮的截面:-)windows2000内部揭密-这里面可以学到什么是IRP、内存管理、文件系统之类驱动模型设计-好详细的一本书.
13、windows2000xpwdm设备驱动程序设计-使用DS开发,无论如何使用里面的工具会更帅.说真的.DDK文档及DDK里面的例子DDK开发包-安装的时候要注意,一定把她及所在例子钩起来,不然你找不到DDK文档的.-人气有点低,不够还很很不错.,专业人士较多-人气很高,很热情,各个领域人的都有.2.虚拟机(VMWare等):建议装Windows2000.iso不然配置会出现很多的错误,同时候用softice或者windbg,避免OS蓝屏,把时间浪费在开机上.DriverStudio3.2:开发工具包.如果喜欢在DDK环境下,也可以利用这个开发包里面的一些工具:DriverMonitor、EAZ
14、DriverInstaller、softice、Windbg:中文教程较少.但是跟微软走,比较有保障.就怕他最后要收钱.双机调试.VC6.0+:这个要先安装,然后才安装DDK,这个顺序可不能乱.DDK:没得说.VC开发工具包含这个目录,才能弹出提示符号比如this-点这边才能弹出。在工具-选项-目录-H:WINDDK2600INCDDKWXP.有时候H:WINDDK2600INCDDK不能识别,不能this-VC助手:这个工具一定要装,很好用的。很快捷,掉渣.注意:如果配置上还有问题的话,百度将会是你最后的归宿.3.先解决简单概念问题后解决WDM模型的概念a.OS:时间分片,但是记得给每个线程
15、的时间CPU不一定相同.#include windows.h#include iostream.hvoid main()HANDLE hThread;hThread=CreateThread(NULL,0,ThreadProc,NULL,0,NULL);/不写ThreadProc了.懒CloseHandle(hThread);/一.关闭线程句柄,线程可没终止.2.主线程main对线程引用不感兴趣. 前为n=0./当执行CreateThread() n+1;hThread=CreateThread() n+1+1/所以现在计数可是n(n=0)+2=2;当关闭CloseHandle(hThread
16、)n=n-1;还有线程结束时n=n-1;/最后n=0,系统检测为,才会释放线程顺便提一下Sleep()函数:貌似很简单一个问题,睡觉谁不会呀.却十分体现出CPU分片的问题.Sleep(400),比如我们的hThread的时间是运行600毫秒,突然运行到300秒,来了个Sleep(400),过了之后,清醒过来,请问现在hThread还可以运行多少毫秒?是300秒?还是0秒?应该是0秒.在Sleep睡眠期间,CPU干什么呢?赶快从队列找一个优先级高线程的来玩玩b.有异步的地方,肯定需要同步的存在.宏观上是异步,但是执行同一种,同一时间,资源,就需要同步有很多种具体书籍-侯捷译。不知道是谁写的.:-
17、)。这时候什么信号量、互斥对象、事件将会是你的最爱void main()HANDLE hMutext=CreateMutex(NULL,truefalse,ccdeath);/true表示调用CreateMutex线程拥有所有权,即main()主线程拥有,/其他线称不可以CloseHanle(hMutex),只能创建之后都是设为已通知状态. /拥有者释放直接理解:事件为钥匙和要访问的资源为房间,更为简便.有信号(已通知状态):就是告诉线程,说偶(事件)这边有钱,大家(线程)快来抢钱.c.类型转换PVOID&IoctlBuffer(void); ULONGRegWord;(ULONG)Ioclt
18、Buffer()=?RegWord;-1.先PVOID=指针+void。先解决void转化(ULONG*)IocltBuffer()=RegWord;-2.接着解决指针转化-3.转化完之后.再进行一般化处理|-|int*p;-ULONG*IocltBuffer()|inti=5;-ULONGRegWord;|*p=i;-*IoCltBuffer()=RegWord;|-|*(ULONG*)IocltBuffer()=RegWord-4.这才是是正确的.我们看IocltBuffer()是个指针.d.类型定义,虽然看似简单.typedefNTSTATUS(*R)(KIrpI);-5NTSTATUS
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 驱动程序 设计 基础
限制150内