一个刚接触几天驱动编程菜鸟对驱动的理解.
2008-11-20 23:16
344 查看
为了需要.这一星期以来天天啃驱动代码.看大概原理.把人累得不行了.说一下子对驱动编程一点点的理解.其实似乎对它有个大概的认识了.首先,我们都知道win32程序都要调用一些API.win32程序一般都是调用user32.dll...等等一些dll里的函数的.就打个比方要调用CreateFile这个函数来创建一个文件.看看win32程序的创建这个文件的工作流程.win32->kernel32.dll->ntdll.dll->ntkrnlpa.exe 就差不多把这个创建文件的工作完成了.win32程序调用的CreateFile接口放在kernel32.dll里面.然而kernel32.dll接到这个创建文件的指令之后它也没有去实施.而是继续转发给ntdll.dll这个ntdll.dll就是"城里城外看SSDT"里说的城门.以前傻傻的有些不太理解.当ntdll.dll接到指令之后就调用NtCreateFile了.但是他还是没有去直接执行创建文件的任务.而是进了ring0的门了而已.剩下的操作就是给ntkrnlpa.exe里去执行了.ntkrnlpa.exe是一个内核程序.它接收到NtCreateFile的指令之后就去查找相应的服务号(这个服务号到底是什么我也不知道,希望有人知道可以跟我说下好吗?)完成操作.这就是win32程序创建一个文件的大概流程. 对于驱动也就没那么麻烦了.而是一步就到ntdll.dll的门口了.接着就直接进到ntkrnlpa.exe操作内核了.杀软HOOK的了就是Nt系列的函数完成它们所谓的主动防御.直接进入内核了就天下第一了.但是关键点就是杀软把你扼杀在摇篮里面.你还没成为英雄.刚出生时就把你Kill掉了.很郁闷.其他的不说了.用win32的眼光看看驱动吧...
首先声明一个函数原形.这个函数是NTDDK.h里面的.我们现在win32下.不是驱动.typedef unsigned long NTSTATUS; //NTSTATUS 的定义.在win32下可以理解成void或者int之类的吧
typedef NTSTATUS (__stdcall *pZwCreateFile)( //ZwCreateFile跟NtCreateFile是一样.哪个更底层我觉得应该是NtCreateFile.但是我们在ntdll.dll中调用就不管了.在这个文件里面他们俩的地址是一样的. OUT PHANDLE FileHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, IN PLARGE_INTEGER AllocationSize OPTIONAL, IN ULONG FileAttributes, IN ULONG ShareAccess, IN ULONG CreateDisposition, IN ULONG CreateOptions, IN PVOID EaBuffer OPTIONAL, IN ULONG EaLength);
HINSTANCE hNtDll = LoadLibrary ("NTDLL"); //加载ntdll.dll if (!hNtDll) return 0;pZwCreateFile ZwCreateFile = (ZWCREATEFILE)GetProcAddress ("NTDLL","ZwCreateFile"); //获取NtCreateFile地址 有了函数原形有了函数地下跟用普通win32程序也就没什么区别了...其实要想在win32下在直接调用稍微底层的一些函数还有好多东西要定义.比如像UNICODE_STRING 的原型.等等之类的..但是要想在win32下感觉感觉这些函数也是没办法的事.至少对有些免杀比较有效果.像驱动程序中的派遣例程之内的我感觉有些像windows中的消息机制一样...呵呵..还在学习当中.自己blog东西太少了.写着自己玩玩.希望不会误人子弟. 看了驱动之后...感觉微软有毛病.把什么都包装起来.还得一层层的转下去.保护得也太厉害了.有句话说得真没错.没有微软硬件也不会发展得如此之快.微软让一台5000RMB的电脑变成了只值2000RMB.而Linux让2000RMB的电脑变成了5000RMB的东西..呵呵...的确有些像.而且还很像...
首先声明一个函数原形.这个函数是NTDDK.h里面的.我们现在win32下.不是驱动.typedef unsigned long NTSTATUS; //NTSTATUS 的定义.在win32下可以理解成void或者int之类的吧
typedef NTSTATUS (__stdcall *pZwCreateFile)( //ZwCreateFile跟NtCreateFile是一样.哪个更底层我觉得应该是NtCreateFile.但是我们在ntdll.dll中调用就不管了.在这个文件里面他们俩的地址是一样的. OUT PHANDLE FileHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, IN PLARGE_INTEGER AllocationSize OPTIONAL, IN ULONG FileAttributes, IN ULONG ShareAccess, IN ULONG CreateDisposition, IN ULONG CreateOptions, IN PVOID EaBuffer OPTIONAL, IN ULONG EaLength);
HINSTANCE hNtDll = LoadLibrary ("NTDLL"); //加载ntdll.dll if (!hNtDll) return 0;pZwCreateFile ZwCreateFile = (ZWCREATEFILE)GetProcAddress ("NTDLL","ZwCreateFile"); //获取NtCreateFile地址 有了函数原形有了函数地下跟用普通win32程序也就没什么区别了...其实要想在win32下在直接调用稍微底层的一些函数还有好多东西要定义.比如像UNICODE_STRING 的原型.等等之类的..但是要想在win32下感觉感觉这些函数也是没办法的事.至少对有些免杀比较有效果.像驱动程序中的派遣例程之内的我感觉有些像windows中的消息机制一样...呵呵..还在学习当中.自己blog东西太少了.写着自己玩玩.希望不会误人子弟. 看了驱动之后...感觉微软有毛病.把什么都包装起来.还得一层层的转下去.保护得也太厉害了.有句话说得真没错.没有微软硬件也不会发展得如此之快.微软让一台5000RMB的电脑变成了只值2000RMB.而Linux让2000RMB的电脑变成了5000RMB的东西..呵呵...的确有些像.而且还很像...
相关文章推荐
- 菜鸟理解关于数据驱动和关键字驱动区别
- 一个老菜鸟所理解的UX及产品流
- 一个在黑客界引起轰动的菜鸟教材---跟我学编程系列
- 对于一个女孩子来说,刚刚接触编程,真的像天书!
- 一个老菜鸟所理解的UX及产品流
- 一个真·菜鸟理解的springmvc工作原理
- Java怎么把输入的字符转换成16进制 菜鸟一个才刚刚接触Java没多久
- 菜鸟编程 一个练习
- 对linux驱动编程中的“信号量”和“自旋锁”的一些理解
- 求助:一个C语言编程的菜鸟问题
- 理解Node.js事件驱动编程
- 一个菜鸟的编程路
- ASP编程菜鸟易犯的一个错误
- Java菜鸟编程 String类的一些方法和一个练习
- 理解Node.js事件驱动编程
- 菜鸟发问,请各位不吝赐教啊! 关于一个简单的程序的理解问题
- Understanding Unix/Linux Programming-事件驱动编程:编写一个视频游戏
- 菜鸟接触sora学编程点滴1
- 一个ANDROID开发菜鸟的BUNDLE与MAP理解
- 一个老菜鸟所理解的UX及产品流