137_原始套接字_发送UDP数据,模仿他人飞秋给另一个飞秋客户端发送信息

本文介绍了如何通过原始套接字在TCP/IP协议栈中修改MAC、IP和UDP包头,以模仿飞秋应用,实现从一个飞秋客户端向另一个发送信息的功能。重点涉及设置目的MAC地址、源IP和目的IP、源端口和目的端口,以及UDP伪头部的IP地址。
摘要由CSDN通过智能技术生成

需要修改地方:

组MAC包中的目的mac(发送目标人的mac)
组IP包中的源IP(伪装他人的IP)、目的IP(发送目标人的IP)
组UDP包【头部】的目的端口(伪装他人的port)、源端口(发送目标人的port)
组UDP包中的【伪头部】中的源IP(伪装他人的IP)、目的IP(发送目标人的IP)

#if 1//--------------模仿其他人IP给另外一个人发送UDP信息------完成-飞秋和飞秋通信-端口都是2425----------//
        //----------源IP修改、MAC不动-----目标IP修改、MAC修改(更改成目标设备的信息)---//
        
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Net; using System.Net.Sockets; using System.Threading; namespace WindowsFormsApplication2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private int port = 49151; private UdpClient udpclient; delegate void AppendString(sendData sendDatas);//添加用户列表委托 AppendString appendString; delegate void AppendStrings(string text);//添加广播消息委托 AppendStrings appendStrings; delegate void AppendStringGB(sendData text);//添加私人消息委托 AppendStringGB appendStringGB; public sendData sendDatas = new sendData(); IPHostEntry myentry; IPAddress myIp; Thread MyRecData; private void Form1_Load(object sender, EventArgs e) { udpclient = new UdpClient(port); myentry = Dns.GetHostEntry(Dns.GetHostName()); IPselect(); sendDatas.fromIP = myIp; sendDatas.toIP = IPAddress.Parse("255.255.255.255"); sendDatas.content = ""; appendString = new AppendString(AppString); appendStrings = new AppendStrings(AppStrings); appendStringGB = new AppendStringGB(AppStringGB); MyRecData = new Thread(new ThreadStart(RecData)); MyRecData.IsBackground = true; MyRecData.Start(); States(); } /// <summary> /// 广播本机IP /// </summary> public void States() { IPEndPoint iep = new IPEndPoint(IPAddress.Broadcast, port); byte[] sen = Class2.senDataToByte(sendDatas); udpclient.Send(sen, sen.Length, iep); } /// <summary> /// 获取本机IP /// </summary> public void IPselect()//查找本机第一个IP地址 { string strHostName; strHostName = Dns.GetHostName(); Console.WriteLine("本机名:{0}", strHostName); IPHostEntry ipEntry = Dns.GetHostEntry(strHostName); IPAddress[] ipAdd = ipEntry.AddressList; foreach (IPAddress ip in ipAdd) { if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) { myIp = ip; return; } } } /// <summary> /// 私聊消息写入消息框 /// </summary> /// <param name="text"></param> private void AppString(sendData sendDatas) { int i = forms(sendDatas.fromIP); if (arryFrom[i].Forms.InvokeRequired == true) { arryFrom[i].Forms.Invoke(appendString, sendDatas); } else { arryFrom[i].Forms.textBox1.AppendText("信息来自"+sendDatas.fromIP+":\r\n"+sendDatas.content + "\r\n"); } } /// <summary> /// 广播消息写入 /// </summary> /// <param name="text"></param> private void AppStringGB(sendData text) { if (textBox1.InvokeRequired == true) { this.Invoke(appendStringGB, text); } else { textBox1.AppendText("消息来自"+text.fromIP+":\r\n"+text.content+"\r\n"); } } /// <summary> /// 判断接收的私聊消息是否有窗体,有就反回是哪个窗体。没有就创建一个窗体反悔集合最后一个索引 /// </summary> /// <param name="sens"></param> /// <returns></returns> public int forms(IPAddress sens) { int f = 0; foreach (ArraysForm af in arryFrom) { if(sens.Equals(af.ToIp)) { return f; } f++; } MethodInvoker mi = new MethodInvoker(this.PerChat);//使用MethodInvoker委托跨线程访问 this.BeginInvoke(mi); Thread.Sleep(100); return arryFrom.Count-1; } /// <summary> /// 添加发言者的IP到用户列表有的将不添加 /// </summary> /// <param name="text"></param> private void AppStrings(string text) { foreach(string str in listBox1.Items) { if(str.Equals(text)) { return; } } if (listBox1.InvokeRequired == true)//使用委托跨线程访问 { this.Invoke(appendStrings, text); } else { listBox1.Items.Add(text); States(); } } sendData sendsa; /// <summary> /// 接收广播消息 /// </summary> private void RecData() { IPEndPoint remote = null; while (true) { try { byte[] bytes = udpclient.Receive(ref remote); sendsa = Class2.byteTosendData(bytes); AppStrings(sendsa.fromIP.ToString()); string str = sendsa.content; string form = sendsa.fromIP.ToString(); if (str != ""&&sendsa;.toIP.Equals(IPAddress.Parse("255.255.255.255"))) { AppStringGB(sendsa); } if(sendsa.toIP.Equals(myIp)) { AppString(sendsa); } } catch(Exception e) { //MessageBox.Show(e.Message); break; } } } private void button1_Click(object sender, EventArgs e) { Sees(); } /// <summary> /// 广播消息 /// </summary> public void Sees() { UdpClient myUdpClient = new UdpClient(); try { sendData sens = new sendData(); IPEndPoint iep = new IPEndPoint(IPAddress.Broadcast, port); sens.fromIP = myIp; sens.toIP = IPAddress.Parse("255.255.255.255"); sens.content = textBox2.Text; byte[] bytes = Class2.senDataToByte(sens); myUdpClient.Send(bytes, bytes.Length, iep); textBox2.Clear(); myUdpClient.Close(); } catch { MessageBox.Show("发送失败!"); } finally { myUdpClient.Close(); } } /// <summary> /// 关闭窗口 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Form1_FormClosing(object sender, FormClosingEventArgs e) { udpclient.Close(); } /// <summary> /// 双击用户可以私聊 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void listBox1_DoubleClick(object sender, EventArgs e) { sendsa.fromIP = IPAddress.Parse(listBox1.Text); PerChat(); } /// <summary> /// 右键点击聊天可以私聊 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void 发送消息ToolStripMenuItem_Click(object sender, EventArgs e) { sendsa.fromIP = IPAddress.Parse(listBox1.Text); PerChat(); } public static List<ArraysForm> arryFrom = new List<ArraysForm>();// 装私聊窗口的集合 PersonalChat[] perChat=new PersonalChat[100];//私聊窗口数组 ArraysForm aForm;//私聊窗体类,包含聊天对象IP和窗体 int index = 0; /// <summary> /// 新建私聊窗口窗口, /// </summary> public void PerChat() { sendData preChatsenData = new sendData(); preChatsenData.fromIP = myIp; preChatsenData.toIP = sendsa.fromIP; preChatsenData.content = ""; perChat[index] = new PersonalChat(preChatsenData); perChat[index].Show(); aForm = new ArraysForm(perChat[index], preChatsenData.fromIP); arryFrom.Add(aForm); index++; } /// <summary> /// Enter发送消息 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void textBox2_KeyDown(object sender, KeyEventArgs e) { //if (e.KeyData == (Keys.Enter | Keys.Control)) //{ // textBox2.AppendText("\r\n"); //} if(e.KeyData==Keys.Enter) { Sees(); } } /// <summary> /// 发送完消息清空textBox /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void textBox2_KeyUp(object sender, KeyEventArgs e) { if (e.KeyData == Keys.Enter) { textBox2.Clear(); } } } }
本文章将介绍如何使用RawSocket(原始套接字)开发网络嗅探器: 首先我们得了解什么是套接字,这个我就不多说,自己百度,百度百科比我说的好。 那么什么又是原始套接字呢,常用的套接字分为 SOCK_STREAM(流套接字) 用于TCPXY通讯。 SOCK_DGRAM(数据报套接字) 同于UDPXY通讯。 那么原始呢,他则是和名字一样原始套接字;举例:要想用流套接字进行一次TCP的发包,那么直接连接上对方服务器然后用Send就可以发送指定的内容,但其实发送数据并不止你的那些内容,有一些东西是流套接字会给你自动补上的。TCP是属于IPXY的一个子XY,那么要发送一个TCP数据包就得加上(以太网XY报头这个先不提),IPXY的报头,和TCPXY报头,这些东西流套接字都会帮你处理,而原始套接字则不会(当然也可以设置让原始套接字构造IP报头)。原始套接字他有更多的用途,但相对来说也比流套接字或数据报套接字麻烦。 原始套接字还可以设置成允许接收本地所有的套接字数据。那么我们就利用这个功能来做嗅探器! 首先:1.使用  WSAStartup (合并短整数 (2, 2), WSADATA)  来初始化Winsocket服务 其参数有2个  第一个 (短整数型/双字节型):wVersionRequired  这个参数表明使用的winsock版本号,高位指定修订版本号,低位指定主版本号。第二个参数 WSADATA类型 用于接收Winsocket细节东西,咱不用管它。 //下面就不说那么详细了,源码里面全是注释,自己看。 2.然后使用socket (#AF_INET, #SOCK_RAW, #IPPROTO_IP)  来创建一个套接字   第一个参数应该是表明Internet地址格式反正只能固定这个,仅仅支持这个  参数2:表明要创建的是一个原始套接字,参数3:指定IPXY  IPXY包括其子XY TCP UDP 等。成功返回套接字句柄 3.  bind (s, addr, sizeof (addr))  将套接字绑定至指定网卡,参数1=套接字句柄    参数2为一个addr结构的值,该值表明要绑定的网卡IP及端口号 4.  ioctlsocket (Socket, 2550136833, 1) 将套接字的模式改变为允许接收所有数据 顺利完成上面的操作后咱就可以用Recv来接收数据包了,只要不断的调用Recv就OK。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扳手的海角

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值