本来是截取网卡数据的,现改NDIS求教 ( 积分: 200 )

  • 主题发起人 主题发起人 sim_might
  • 开始时间 开始时间
S

sim_might

Unregistered / Unconfirmed
GUEST, unregistred user!
有内部局域网,通过一台网关上网,网关双网卡,一接内网一接MODLE。
现在需要在网关上运行程序,实时(预计每10秒刷一次)监视每台计算机通过网关和外网通信的数据流量,还要对流量设限。我现在已经对每台主机建立了IP和的MAC对应表。
先准备用NDIS来做,用NDIS需要驱动,(packet.sys,packete.dll),NDIS 驱动能在那里弄到?Delphi能做NDIS吗,如果能做有现成的申明头文件吗??NDIS可以过滤数据包,但被过滤的包是直接丢包吗??
以上每个问题50分,另外50分给UP的兄弟.
 
有内部局域网,通过一台网关上网,网关双网卡,一接内网一接MODLE。
现在需要在网关上运行程序,实时(预计每10秒刷一次)监视每台计算机通过网关和外网通信的数据流量,还要对流量设限。我现在已经对每台主机建立了IP和的MAC对应表。
先准备用NDIS来做,用NDIS需要驱动,(packet.sys,packete.dll),NDIS 驱动能在那里弄到?Delphi能做NDIS吗,如果能做有现成的申明头文件吗??NDIS可以过滤数据包,但被过滤的包是直接丢包吗??
以上每个问题50分,另外50分给UP的兄弟.
 
安装一个代理软件就可以了.
 
不能用其他人的代理来做,自己编码实现
 
如果你不是想自己写NDIS,就用KingSocket吧,URL http://www.mycodes.net/down.asp?id=4906&no=1
 
NDIS 驱动能在那里弄到?
我没有找到,需要自己写。下DDK。
Delphi能做NDIS吗,如果能做有现成的申明头文件吗??
没有相应的头文件,DELPHI也是可以写的,但恐怕还没有人写过这方面的东西。
NDIS可以过滤数据包,但被过滤的包是直接丢包吗??
处理是你自己的事情,你可以保存下来,修改之后再发送。也可以直接丢弃。
还有,并不是所有的包都是能过滤的,丢包是正常的!
 
不好意思,可能是我没说清楚,楼上的兄弟,我现在就是需要DDK开发包.没有头文件用VC的来翻译也行.丢包已经解决了。DELPHIBBS上已经有兄弟做过NDIS了。这也间接回答了我一个问题。[:)].你知道那里能弄到DDK吗???
 
VCKBASE驱动开发工具
 
VCKBASE驱动开发工具?好就去找.
对了,再问个问题,NDIS是否必须要SP2的支持?
 
从没有听说需要,不知道!
 
NDIS是微软WDM驱动的一种,目前只能用DDK来开发,Delphi是不能用来开发DNSI驱动的。我认为NDIS是微软windows构架中最成功,也是最复杂的分层驱动模型。从本人涉及过的NDIS开发来看,目前在这一层的拦截和过滤主要有两个方向,基于NDIS HOOK和基于NDIS miniport and protocol。前者主要是类似于我们win32层常用的api hook技术,利用微软未公开函数ntquerysysteminfomation得到微软的NDIS接口驱动“NDIS.SYS”的基地址,然后挂接它的接口函数,如下是部分代码片断:

if(GetNdisModuleAddress() && m_NdisBaseAddress != NULL)
{
if(HookFunction(m_NdisBaseAddress, "NdisRegisterProtocol", HookNdisRegisterProtocol
, (ULONG*)&m_pNdisRegisterProtocol) == NULL
)
dprintf(("Hook NdisRegisterProtocol Failure/n"));

if(HookFunction(m_NdisBaseAddress, "NdisDeregisterProtocol", HookNdisDeregisterProtocol
, (ULONG*)&m_pNdisDeregisterProtocol) == NULL
)
dprintf(("Hook NdisDeregisterProtocol Failure/n"));

if(HookFunction(m_NdisBaseAddress, "NdisOpenAdapter", HookNdisOpenAdapter
, (ULONG*)&m_pNdisOpenAdapter) == NULL
)
dprintf(("Hook NdisOpenAdapter Failure/n"));
}


//
// Hook 一个系统函数
// 参数:
// pBaseAddress: 要Hook函数所在文件在内存映象的基地址,比如NDIS.SYS的基地址
// Name: 要Hook的函数名
// InFunc: 自己的函数地址
// OutFunc: Hook后保存系统的函数地址
// 返回值:
// NULL: Hook失败
// Not NULL: 返回系统函数地址,与*OutFunc相同
//
//
PVOID HookFunction(PVOID pBaseAddress, PCSTR Name, PVOID InFunc, ULONG* OutFunc)
{
PIMAGE_DOS_HEADER pDosHeader = NULL;
PIMAGE_NT_HEADERS pNtHeader = NULL;
PIMAGE_DATA_DIRECTORY pDirectory = NULL;
PIMAGE_EXPORT_DIRECTORY pExports = NULL;
ULONG nSize, Address, i;
PULONG pFunctions = NULL;
PSHORT pOrdinals = NULL;
PULONG pNames = NULL;
PVOID pFunction = NULL;
ULONG Ordinal = 0;

if(pBaseAddress == NULL)
return NULL;

pDosHeader = (PIMAGE_DOS_HEADER)pBaseAddress;
pNtHeader = (PIMAGE_NT_HEADERS)((PCHAR)pBaseAddress + pDosHeader->e_lfanew);
pDirectory = pNtHeader->OptionalHeader.DataDirectory + IMAGE_DIRECTORY_ENTRY_EXPORT;

nSize = pDirectory->Size;
Address = pDirectory->VirtualAddress;

pExports = (PIMAGE_EXPORT_DIRECTORY)((PCHAR)pBaseAddress + Address);

pFunctions = (PULONG)((PCHAR)pBaseAddress + pExports->AddressOfFunctions);
pOrdinals = (PSHORT)((PCHAR)pBaseAddress + pExports->AddressOfNameOrdinals);
pNames = (PULONG)((PCHAR)pBaseAddress + pExports->AddressOfNames);

for(i = 0; i < pExports->NumberOfNames; i++)
{
Ordinal = pOrdinals;
if(pFunctions[Ordinal] < Address || pFunctions[Ordinal] >= Address + nSize)
{
if(strcmp((PSTR)((PCHAR)pBaseAddress + pNames), Name) == 0)
{
pFunction = (PCHAR)pBaseAddress + pFunctions[Ordinal];
*OutFunc = (ULONG)pFunction;
DisableProtection();
pFunctions[Ordinal] = (ULONG)((ULONG)InFunc - (ULONG)pBaseAddress);
EnableProtection();
break;
}
}
}

return pFunction;
}
 
基于后者的ndis,你可以看看微软的ddk例子中著名的“passthru”代码。
你要的程序实现起来非常简单,当然前提是你要熟悉驱动开发。如果你们的项目外包的话,可以给我写信,end_sub@hotmail.com
 
TO 爱元元的哥哥:
是一个限流和流量监视的东东.外包的话就要做成DLL给我们用.不过老板抠得要死,估计就算外包也只得几百千把块钱..
 
呵呵,第一次听说NDIS想用DELPHI来开发的。
安装一个DDK吧,2K,XP的ddk不同,可以在网上找找。
DDK里面就有NDIS的驱动例子,可以看一看,不过它的例子是什么事也不作的!!!
 
老板终于愿意出500了,有兄弟能干吗??
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部