当前位置: 技术问答>linux和unix
【高分】求如何监听本机的53端口
来源: 互联网 发布时间:2016-07-03
本文导语: 朋友让帮忙写一个程序,监听本机53端口的数据包,但是现在还不知道从哪下手,想请大家多多指点下 环境是linux,用c写。最好能有些例子给我参考 多谢大家了!!! | 把网卡设...
朋友让帮忙写一个程序,监听本机53端口的数据包,但是现在还不知道从哪下手,想请大家多多指点下
环境是linux,用c写。最好能有些例子给我参考 多谢大家了!!!
环境是linux,用c写。最好能有些例子给我参考 多谢大家了!!!
|
把网卡设置成混杂模式,混杂模式就是接收所有经过网卡的数据包,包括不是发给本机的包,即不验证MAC地址。普通模式下网卡只接收发给本机的包(包括广播包)传递给上层程序,其它的包一律丢弃。一般来说,混杂模式不会影响网卡的正常工作,多在网络监听工具上使用。然后就把所有收到的包根据端口过滤一下就好了,这个其实很多网络监听工具差不多,你可以找找看有没有源代码。
linux源代码的注释如下:
/**
* dev_set_promiscuity - update promiscuity count on a device
* @dev: device
* @inc: modifier
*
* Add or remove promsicuity from a device. While the count in the device
* remains above zero the interface remains promiscuous. Once it hits zero
* the device reverts back to normal filtering operation. A negative inc
* value is used to drop promiscuity on the device.
*/
设置网卡混杂模式的实现代码如下:
struct net_device *sniffer_dev = NULL;
int dev_flags = 0;
int init_module ( void ) /* 模块初始化 */
{
......
sniffer_dev = dev_get_by_name("eth0");
if (sniffer_dev != NULL)
{
dev_flags = 1;
dev_set_promiscuity(sniffer_dev, 1);
dev_put(sniffer_dev);
sniffer_dev = NULL;
}
......
return 0;
}
void cleanup_module(void)
{
......
if (dev_flags)
{
sniffer_dev = dev_get_by_name("eth0");
if (sniffer_dev != NULL)
{
dev_flags = 0;
dev_set_promiscuity(sniffer_dev, -1); /*注意此处的第二个参数*/
dev_put(sniffer_dev);
sniffer_dev = NULL;
}
}
......
}
linux源代码的注释如下:
/**
* dev_set_promiscuity - update promiscuity count on a device
* @dev: device
* @inc: modifier
*
* Add or remove promsicuity from a device. While the count in the device
* remains above zero the interface remains promiscuous. Once it hits zero
* the device reverts back to normal filtering operation. A negative inc
* value is used to drop promiscuity on the device.
*/
设置网卡混杂模式的实现代码如下:
struct net_device *sniffer_dev = NULL;
int dev_flags = 0;
int init_module ( void ) /* 模块初始化 */
{
......
sniffer_dev = dev_get_by_name("eth0");
if (sniffer_dev != NULL)
{
dev_flags = 1;
dev_set_promiscuity(sniffer_dev, 1);
dev_put(sniffer_dev);
sniffer_dev = NULL;
}
......
return 0;
}
void cleanup_module(void)
{
......
if (dev_flags)
{
sniffer_dev = dev_get_by_name("eth0");
if (sniffer_dev != NULL)
{
dev_flags = 0;
dev_set_promiscuity(sniffer_dev, -1); /*注意此处的第二个参数*/
dev_put(sniffer_dev);
sniffer_dev = NULL;
}
}
......
}
|
监听本机53端口,这是保留端口。做DNS的吧,你本机上肯定有进程在监听,不能在本机再监听了吧。
如果想监听,用sock_raw在其他机器上监听你这台主机的包呗,但是由于原始套接字不能区分端口,你只能截获所有的包,然后在内存里再去处理端口判断等。
|
http://www.35oe.com/article/show.asp?id=1216&page=1
这个是讲Linux系统下的网络监听技术,应该有所帮助
这个是讲Linux系统下的网络监听技术,应该有所帮助
|
|
用tcpdump吧,可以直接抓包的!