b2c信息网

您现在的位置是:首页 > 明日新闻 > 正文

明日新闻

发送arp数据包c源码(怎么发送arp包)

hacker2022-10-17 09:00:23明日新闻91
本文目录一览:1、C发送ARP包2、谁知道arp病毒是怎么发的

本文目录一览:

C 发送ARP 包

其实并不是你见得 这简单的几行代码,我在网上搜索了一下这个使又源代码的

我想不管这个问题谁回答都不如 作者的源代码更有说服力

你可以自己搜索以下

我也给你提钩了一个连接

谁知道arp病毒是怎么发的

ARP攻击原理及解决方法

【故障原因】

局域网内有人使用ARP欺骗的木马程序(比如:传奇盗号的软件,某些传奇外挂中也被恶意加载了此程序)。

【故障原理】

要了解故障原理,我们先来了解一下ARP协议。

在局域网中,通过ARP协议来完成IP地址转换为第二层物理地址(即MAC地址)的。ARP协议对网络安全具有重要的意义。通过伪造IP地址和MAC地址实现ARP欺骗,能够在网络中产生大量的ARP通信量使网络阻塞。

ARP协议是“Address Resolution Protocol”(地址解析协议)的缩写。在局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的MAC地址的。在以太网中,一个主机要和另一个主机进行直接通信,必须要知道目标主机的MAC地址。但这个目标MAC地址是如何获得的呢?它就是通过地址解析协议获得的。所谓“地址解析”就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。

每台安装有TCP/IP协议的电脑里都有一个ARP缓存表,表里的IP地址与MAC地址是一一对应的,如下表所示。

主机 IP地址 MAC地址

A 192.168.16.1 aa-aa-aa-aa-aa-aa

B 192.168.16.2 bb-bb-bb-bb-bb-bb

C 192.168.16.3 cc-cc-cc-cc-cc-cc

D 192.168.16.4 dd-dd-dd-dd-dd-dd

我们以主机A(192.168.16.1)向主机B(192.168.16.2)发送数据为例。当发送数据时,主机A会在自己的ARP缓存表中寻找是否有目标IP地址。如果找到了,也就知道了目标MAC地址,直接把目标MAC地址写入帧里面发送就可以了;如果在ARP缓存表中没有找到相对应的IP地址,主机A就会在网络上发送一个广播,目标MAC地址是“FF.FF.FF.FF.FF.FF”,这表示向同一网段内的所有主机发出这样的询问:“192.168.16.2的MAC地址是什么?”网络上其他主机并不响应ARP询问,只有主机B接收到这个帧时,才向主机A做出这样的回应:“192.168.16.2的MAC地址是bb-bb-bb-bb-bb-bb”。这样,主机A就知道了主机B的MAC地址,它就可以向主机B发送信息了。同时它还更新了自己的ARP缓存表,下次再向主机B发送信息时,直接从ARP缓存表里查找就可以了。ARP缓存表采用了老化机制,在一段时间内如果表中的某一行没有使用,就会被删除,这样可以大大减少ARP缓存表的长度,加快查询速度。

从上面可以看出,ARP协议的基础就是信任局域网内所有的人,那么就很容易实现在以太网上的ARP欺骗。对目标A进行欺骗,A去Ping主机C却发送到了DD-DD-DD-DD-DD-DD这个地址上。如果进行欺骗的时候,把C的MAC地址骗为DD-DD-DD-DD-DD-DD,于是A发送到C上的数据包都变成发送给D的了。这不正好是D能够接收到A发送的数据包了么,嗅探成功。

A对这个变化一点都没有意识到,但是接下来的事情就让A产生了怀疑。因为A和C连接不上了。D对接收到A发送给C的数据包可没有转交给C。

做“man in the middle”,进行ARP重定向。打开D的IP转发功能,A发送过来的数据包,转发给C,好比一个路由器一样。不过,假如D发送ICMP重定向的话就中断了整个计划。

D直接进行整个包的修改转发,捕获到A发送给C的数据包,全部进行修改后再转发给C,而C接收到的数据包完全认为是从A发送来的。不过,C发送的数据包又直接传递给A,倘若再次进行对C的ARP欺骗。现在D就完全成为A与C的中间桥梁了,对于A和C之间的通讯就可以了如指掌了。

【故障现象】

当局域网内某台主机运行ARP欺骗的木马程序时,会欺骗局域网内所有主机和路由器,让所有上网的流量必须经过病毒主机。其他用户原来直接通过路由器上网现在转由通过病毒主机上网,切换的时候用户会断一次线。

切换到病毒主机上网后,如果用户已经登陆了传奇服务器,那么病毒主机就会经常伪造断线的假像,那么用户就得重新登录传奇服务器,这样病毒主机就可以盗号了。

由于ARP欺骗的木马程序发作的时候会发出大量的数据包导致局域网通讯拥塞以及其自身处理能力的限制,用户会感觉上网速度越来越慢。当ARP欺骗的木马程序停止运行时,用户会恢复从路由器上网,切换过程中用户会再断一次线。

【HiPER用户快速发现ARP欺骗木马】

在路由器的“系统历史记录”中看到大量如下的信息(440以后的路由器软件版本中才有此提示):

MAC Chged 10.128.103.124

MAC Old 00:01:6c:36:d1:7f

MAC New 00:05:5d:60:c7:18

这个消息代表了用户的MAC地址发生了变化,在ARP欺骗木马开始运行的时候,局域网所有主机的MAC地址更新为病毒主机的MAC地址(即所有信息的MAC New地址都一致为病毒主机的MAC地址),同时在路由器的“用户统计”中看到所有用户的MAC地址信息都一样。

如果是在路由器的“系统历史记录”中看到大量MAC Old地址都一致,则说明局域网内曾经出现过ARP欺骗(ARP欺骗的木马程序停止运行时,主机在路由器上恢复其真实的MAC地址)。

【在局域网内查找病毒主机】

在上面我们已经知道了使用ARP欺骗木马的主机的MAC地址,那么我们就可以使用NBTSCAN(下载地址:)工具来快速查找它。

NBTSCAN可以取到PC的真实IP地址和MAC地址,如果有”传奇木马”在做怪,可以找到装有木马的PC的IP/和MAC地址。

命令:“nbtscan -r 192.168.16.0/24”(搜索整个192.168.16.0/24网段, 即

192.168.16.1-192.168.16.254);或“nbtscan 192.168.16.25-137”搜索192.168.16.25-137 网段,即192.168.16.25-192.168.16.137。输出结果第一列是IP地址,最后一列是MAC地址。

NBTSCAN的使用范例:

假设查找一台MAC地址为“000d870d585f”的病毒主机。

1)将压缩包中的nbtscan.exe 和cygwin1.dll解压缩放到c:/下。

2)在Windows开始—运行—打开,输入cmd(windows98输入“command”),在出现的DOS窗口中输入:C:/nbtscan -r 192.168.16.1/24(这里需要根据用户实际网段输入),回车。

C:/Documents and Settings/ALANC:/nbtscan -r 192.168.16.1/24

Warning: -r option not supported under Windows. Running without it.

Doing NBT name scan for addresses from 192.168.16.1/24

IP address NetBIOS Name Server User MAC address

------------------------------------------------------------------------------

192.168.16.0 Sendto failed: Cannot assign requested address

192.168.16.50 SERVER server unknown 00-e0-4c-4d-96-c6

192.168.16.111 LLF server ADMINISTRATOR 00-22-55-66-77-88

192.168.16.121 UTT-HIPER server unknown 00-0d-87-26-7d-78

192.168.16.175 JC server unknown 00-07-95-e0-7c-d7

192.168.16.223 test123 server test123 00-0d-87-0d-58-5f

3)通过查询IP--MAC对应表,查出“000d870d585f”的病毒主机的IP地址为“192.168.16.223”。

【解决思路】

1、不要把你的网络安全信任关系建立在IP基础上或MAC基础上,(rarp同样存在欺骗的问题),理想的关系应该建立在IP+MAC基础上。

2、设置静态的MAC--IP对应表,不要让主机刷新你设定好的转换表。

3、除非很有必要,否则停止使用ARP,将ARP做为永久条目保存在对应表中。

4、使用ARP服务器。通过该服务器查找自己的ARP转换表来响应其他机器的ARP广播。确保这台ARP服务器不被黑。

5、使用"proxy"代理IP的传输。

6、使用硬件屏蔽主机。设置好你的路由,确保IP地址能到达合法的路径。(静态配置路由ARP条目),注意,使用交换集线器和网桥无法阻止ARP欺骗。

7、管理员定期用响应的IP包中获得一个rarp请求,然后检查ARP响应的真实性。

8、管理员定期轮询,检查主机上的ARP缓存。

9、使用防火墙连续监控网络。注意有使用SNMP的情况下,ARP的欺骗有可能导致陷阱包丢失。

【HiPER用户的解决方案】

建议用户采用双向绑定的方法解决并且防止ARP欺骗。

1、在PC上绑定路由器的IP和MAC地址:

1)首先,获得路由器的内网的MAC地址(例如HiPER网关地址192.168.16.254的MAC地址为0022aa0022aaHiPER管理界面--端口配置--局域网端口MAC地址)。

2)编写一个批处理文件rarp.bat内容如下:

@echo off

arp -d

arp -s 192.168.16.254 00-22-aa-00-22-aa

将文件中的网关IP地址和MAC地址更改为您自己的网关IP地址和MAC地址即可。

将这个批处理软件拖到“windows--开始--程序--启动”中。

3)如果是网吧,可以利用收费软件服务端程序(pubwin或者万象都可以)发送批处理文件rarp.bat到所有客户机的启动目录。Windows2000的默认启动目录为“C:/Documents and Settings/All Users「开始」菜单程序启动”。

2、在路由器上绑定用户主机的IP和MAC地址(440以后的路由器软件版本支持):

在HiPER管理界面--高级配置--用户管理中将局域网每台主机均作绑定。

Windows系统下能否通过原始套接字发送接受Arp数据包,如何操作?(最好给个例子)

虽然Windows XP SP2已经不再支持原始TCP数据包的发送,但就其本身作为一项技术而言,掌握原始数据包的发送也是非常重要的。今天我们要讨论的原始UDP数据包的构造,便是这项技术的应用。相信懂得了如何管理UDP头,其他协议的封装应该就不成问题了。在阅读本文,你需要具备以下知识:熟悉C语言、Socket基础知识和TCP/IP基础知识。如果你已经掌握了上面的知识,那就让我们行动吧。

数据包格式

在对数据包进行封装之前,我们有必要了解一下数据报格式,图1是IP头格式。我们所学的知识绝大部分都是从资料书籍中来的,但资料毕竟是死的,当我们拿到图 1所表示的格式时,似乎有点蒙——这个格式是什么意思啊?怎么看?我记得我初学的时候就老犯这种糊涂。下面具体说明一下。

javascript:dcs.images.doResizes(this,0,null);" src="/kf/UploadFiles_7205/201009/20100923105017273.jpg"

图1

在认识该格式之前,我们有必要了解一下什么是“大尾”,什么是“小尾”。“大尾”就是高位字节排放在内存的低端,低位字节排放在内存的高端。“小尾”反之。 Intel处理器大多数使用小尾字节序,Motorola处理器大多数使用大尾(Big Endian)字节序。既然不同的处理器处理的方式不一样,那么在网络交流数据的时候便应该使用同一套标准,不然肯定会发生错误的。TCP/IP各层协议将字节序定义为大尾,因此TCP/IP协议中使用的字节序通常称之为网络字节序,因而在填充数据包的时候一定要注意字节顺序,不然会出错!还有,图1的数据是从左至右字节由低向高,这一点注意一下,初学者容易犯错。

上面是一些需要注意的地方,下面再说一下各个字段的含义。

1)版本号:标志版本;

2)分组长度(HLEN):报文头部的字数(字长=32bits);

3)业务类型(Type of Service):分组的处理方式;

4)总长度(Total Length):分组头部和数据的总长度(字节数);

5)标识(Identification)、标记(Flags)、片偏移(Frag Offset):对分组进行分片,以便允许网上不同MTU时能进行传送;

6)生存时间(TTL):规定分组在网上传送的最长时间(秒),防止分组无休止地要求网络搜寻不存在的目的地址;

7)协议(Protocol):发送分组的上层协议号(TCP= 6,UDP=17);

8)校验和(Header Checksum):分组头校验和;

9)源和目的IP地址(Source and Destination IP Address):标识网络终端设备的IP地址;

10)IP选项(IP Options):网络测试、调试、保密及其他;

11)数据(Data):上层协议数据。

根据上面的说明我们可以定义以下IP头结构。

typedef struct _IPHeader // 20字节的IP头

{

UCHAR iphVerLen; // 版本号和头长度(各占4位)

UCHAR ipTOS; // 服务类型

USHORTipLength; // 封包总长度,即整个IP报的长度

USHORTipID; // 封包标识,惟一标识发送的每一个数据报

USHORTipFlags; // 标志

UCHAR ipTTL; // 生存时间,就是TTL

UCHAR ipProtocol // 协议,可能是TCP、UDP、ICMP等

USHORTipChecksum; // 校验和

ULONG ipSource; // 源IP地址

ULONG ipDestination; // 目的IP地址

} IPHeader, *PIPHeader;

有了IP头,下面就应该是UDP头了,如图2所示。下面说一下各个字段的含义。

javascript:dcs.images.doResizes(this,0,null); border=0

图2

1)源端口(Source Port):呼叫端端口号;

2)目的端口(Destination Port):被叫端端口号;

3)报头长度(HLEN):报文头部的字节数;

4)校验和(Checksum):报头和数据字段的校验和;

5)数据(Data):上层协议数据。

下面是定义的UDP头结构。

typedef struct _UDPHeader

{

USHORT sourcePort; // 源端口号

USHORT destinationPort;// 目的端口号

USHORT len; // 封包长度

USHORT checksum; // 校验和

} UDPHeader, *PUDPHeader;

上面我详细介绍了IP头和UDP头的格式。在我们填充数据包的时候,应该清楚IP头、UDP头和传输数据的顺序应该与如图3一致。

图3

编程 实现

下面我们来看看发送原始UDP封包的代码是如何实现的。首先我们要有一个IP校验码,这有前人写好的专门代码,我们不必深究,拿来用就行,再此不贴出来,大家看杂志相关即可。下面是主程序的代码,很简单,大家慢慢体会,相信会有所收获的。

int main()

{// 输入参数信息

char szDestIp[] = "88.88.88.88";

// == 填写目的IP地址

char szSourceIp[] = "127.0.0.1";

// == 填写你自己的IP地址

USHORT nDestPort = 4567; //目的端口

USHORT nSourcePort = 8888;//源端口

char szMsg[] = "大家好,我是Hokkien!/r/n";

int nMsgLen = strlen(szMsg);

// 创建原始套节字

SOCKET sRaw = ::socket(AF_INET, SOCK_RAW, IPPROTO_UDP);

// 有效IP头包含选项

BOOL bIncl = TRUE;

::setsockopt(sRaw, IPPROTO_IP, IP_HDRINCL, (char *)bIncl, sizeof(bIncl));

char buff[1024] = { 0 };

// 填充IP头

IPHeader *pIphdr = (IPHeader *)buff;

pIphdr-iphVerLen = (44 | (sizeof(IPHeader)/sizeof(ULONG)));

//版本与长度

pIphdr-ipLength = ::htons(sizeof(IPHeader) + sizeof(UDPHeader) + nMsgLen);

//数据包长度

pIphdr-ipTTL = 128; //生存时间

pIphdr-ipProtocol = IPPROTO_UDP;//UDP

pIphdr-ipSource = ::inet_addr(szSourceIp); //源IP

pIphdr-ipDestination = ::inet_addr(szDestIp); //目的IP

pIphdr-ipChecksum = checksum((USHORT*)pIphdr, sizeof(IPHeader));

//校验码,这是必需的!

// 填充UDP头

UDPHeader *pUdphdr = (UDPHeader *)buff[sizeof(IPHeader)];

pUdphdr-sourcePort = htons(8888); //源端口

pUdphdr-destinationPort = htons(nDestPort);//目的端口

pUdphdr-len = htons(sizeof(UDPHeader) + nMsgLen);//报头长度

pUdphdr-checksum = 0; //校验和,不是必需的

char *pData = buff[sizeof(IPHeader) + sizeof(UDPHeader)];

memcpy(pData, szMsg, nMsgLen);

//填充校验和

ComputeUdpPseudoHeaderChecksum(pIphdr, pUdphdr, pData, nMsgLen);

// 设置目的地址

SOCKADDR_IN destAddr = { 0 };

destAddr.sin_family = AF_INET;

destAddr.sin_port = htons(nDestPort);

destAddr.sin_addr.S_un.S_addr = ::inet_addr(szDestIp);

// 发送原始UDP封包

int nRet;

for(int i=0; i5; i++)

{

nRet = ::sendto(sRaw, buff,

sizeof(IPHeader) + sizeof(UDPHeader) + nMsgLen, 0, (sockaddr*)destAddr, sizeof(destAddr));

if(nRet == SOCKET_ERROR)

{

printf(" sendto() failed: %d /n", ::WSAGetLastError());

break;

}

else

{

printf(" sent %d bytes /n", nRet);

}

}

::closesocket(sRaw);

getchar();

return 0;

}

总结

需要注意的是,如果这段代码在Windows XP SP2以前的操作系统上运行,可以使用假的源IP地址。但遗憾的是,Windows XP SP2中,则必须指定一个有效的IP地址,而且不是回环IP(即127.0.0.1)。Windows现在已经不支持原始TCP的发送了。这些种种限制,使得我们在XP上玩黑玩得很不自在!为了取消这种限制,我们可以开发自己的驱动,但开发驱动毕竟不是简单之事,我等菜鸟哪来这等本事啊。不过可喜的是,已经有高人为我们开发了一套当今非常流行的网络开发包驱动Winpcap,完全可以取消上面的限制!对于这种方法,我们以后再讨论,大家期待一下,呵呵

利用C语言编写模拟ARP发送请求数据包和接收数据包

我给你一个技术思路吧。

如果要用C实现模拟ARP发送数据包和接收数据包,可以使用VC6.0开发win32 console application,然后开发一个windows控制台程序,使用API函数开发。

发表评论

评论列表

  • 性许绮烟(2022-10-17 11:41:56)回复取消回复

    墙连续监控网络。注意有使用SNMP的情况下,ARP的欺骗有可能导致陷阱包丢失。【HiPER用户的解决方案】建议用户采用双向绑定的方法解决并且防止ARP欺骗。1、在PC上绑定路由器的IP和MAC地址:1)首先,获得路由器的内

  • 掩吻里予(2022-10-17 12:27:56)回复取消回复

    arp -d arp -s 192.168.16.254 00-22-aa-00-22-aa 将文件中的网关IP地址和MAC地址更改为您自己的网关IP地址和MAC地址即可。将这个批处理软件拖到“windows--开始--程序--启动”中。 3)如果是网吧,可以利用收费

  • 痴妓咽渡(2022-10-17 14:41:41)回复取消回复

    。 Intel处理器大多数使用小尾字节序,Motorola处理器大多数使用大尾(Big Endian)字节序。既然不同的处理器处理的方式不一样,那么在网络交流数据的时候便应该使用同一套标准,不然肯定会发生错误的。TCP/IP各层协议将字节序定义为大尾,因此TC