易语言教程_易语言源码_易语言写挂_易语言论坛_看流星社区

 找回密码
 注册
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
赞助广告位 请点击这里联系站长 QQ20209081
赞助广告位 请点击这里联系站长 QQ20209081
赞助广告位 请点击这里联系站长 QQ20209081
查看: 2112|回复: 2

一个汇编版的NDIS驱动程序模板

[复制链接]
发表于 2011-8-11 09:16:25 | 显示全部楼层 |阅读模式
;   写驱动程序已经很久了,但我一直用汇编来写驱动程序,原因是我不喜欢DDK,因为DDK和汇编一样,不是象VC,C#那样的“可视化”的开发工具,
;DDK和汇编一样看不见结构或对象的成员,也看不到各种函数的原型,这些东西和各种常量定义还必须去查看相关的包含文件,不仅如此,DDK还会
;“自作聪明”地把很多垃圾代码加到我的驱动里,虽然没有影响驱动程序的功能,但是还是不爽,不如直接用汇编,生成的驱动程序是什么样的自己
;心里有数。其实这也怪不得MS,它不想大家了解它的操作系统核心技术,但是又不得不开放一些技术细节给大家写驱动,所以只有提高门槛,搞出这
;么一个变态的DDK来吓走很多人,它的目的也就达到了,就是让尽可能少的人了解它的核心技术。能够跨过DDK这道槛的,必定不是一般的高手。呵呵!

;   很多书都建议写驱动最好不用汇编,因为写出来的程序不可移植,但是我不这么认为,因为现在90%的人写出的驱动都是在PC上运行的,没有必要
;为了这10%而放弃这么好的汇编语言。而且计算机都是相通的,如果你会写PC下的驱动了,再写MAC下的驱动不就容易多了吗?

;   这是一个标准的legacy驱动程序,虽然编译时用WDM的方法编译,它有Unload,Read,Write例程,而且还用NDIS HOOK来部分实现了防火墙的功能。
;NDIS HOOK技术被广泛应用于瑞星、江民、天网等众多流行的防火墙里,它的原理是使用NdisRegisterProtocol()注册假协议来获取系统的协议链地址,
;再搜索这个单向协议链,找到TCPIP协议的NDIS_OPEN_BLOCK(NDIS_BINDING_HANDLE)结构,里面就有TCPIP协议的各种派发函数地址,比如SEND在结构
;偏移30H的地方,RECV在结构偏移40H的地方,还有其他很多重要的函数地址都在这个表里。把表里的地址替换成我们的函数地址,就可以拦截操作系统
;收发的所有数据包了。本驱动只是实现了嗅探数据包的功能,还没有实现拦截恶意数据包的功能,如果想实现这个功能,在_Write函数、_mySend函数、
;_myRecv函数里加些代码,使它们配合完成拦截数据包的功能。本驱动如果IoAttachDevice其他驱动,可以改成过滤器;做些修改,还可以实现更多功能,
;可以用来过滤缓冲区溢出攻击包,也可以用来定制自己的SQL INJECTION防护网。

;   本驱动嗅探数据包的流程是这样的:当系统收发数据包时,被_mySend或_myRecv拦截,这两个函数就用NdisSetEvent()置位一个RING3事件(这个事
;件在DriverEntry里建立,在RING3里打开),这样在RING3应用层的WaitForSingleObject()因为事件被置位而返回,于是RING3代码用ReadFile()读取数
;据包的内容,判断是放行还是拦截,再用WriteFile来通知驱动做相应的操作。当然为了提高效率,不是每个数据包都提示RING3应用程序该不该放行,
;有些可以直接在RING0驱动里判断的就不必传到RING3去判断了。处于RING3的代码大概是这样的:

;#include "stdafx.h"
;#include "windows.h"
;#include "stdlib.h"


;int _tmain(int argc, _TCHAR* argv[])
;{
;   HANDLE hdrv=CreateFile("////.//NDISDRV",0xc0000000,0,0,3,0,0);
;   HANDLE hEvent=OpenEvent(0x100000,0,"Send3Event"); //注意Send3Event必须和驱动里的名字对应
;   //HANDLE hEvent=OpenEvent(0x100000,0,"Recv3Event"); //注意Recv3Event必须和驱动里的名字对应
;
;   int dwTempVar=1;char szTempBuffer[0x800];
;   while(dwTempVar)
;   {
;     WaitForSingleObject(hEvent,-1);   
;     ReadFile(hdrv,szTempBuffer,0x800,(LPDWORD)&dwTempVar,0);
;   }
;
;   return 0;
;}

;把下面的代码保存到ndisdrv.asm里,在MASM32 6.14及以上的编译器里编译:
;ml /c /coff /Cp ndisdrv.asm
;link /subsystem:native /driver:wdm /release /align:16 /base:0x10000 /out:ndisdrv.sys ndisdrv.obj
;由于驱动程序涉及的知识太广而深奥了,本文难免有错漏的地方,希望大家指出,以免一错再错,误导别人。
;下面是驱动的代码:

游客,如果您要查看本帖隐藏内容请回复
发表于 2012-4-29 08:46:02 | 显示全部楼层
看看那。。。。。。。。。
发表于 2013-9-28 17:06:35 | 显示全部楼层
自由自在的生活,无忧无虑的看帖。辛苦了。
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|看流星社区  |网站地图

GMT+8, 2018-8-21 10:48 易语言论坛 易语言导航

Powered by 看流星社区 X3.2

©2011-2016 最好的辅助编程技术论坛

快速回复 返回顶部 返回列表