using System;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Windows.Forms;
[StructLayout(LayoutKind.Explicit)]
public struct IPHeader
{
[FieldOffset(0)] public byte ip_verlen;
[FieldOffset(1)] public byte ip_tos;
[FieldOffset(2)] public ushort ip_totallength;
[FieldOffset(4)] public ushort ip_id;
[FieldOffset(6)] public ushort ip_offset;
[FieldOffset(8)] public byte ip_ttl;
[FieldOffset(9)] public byte ip_protocol;
[FieldOffset(10)] public ushort ip_checksum;
[FieldOffset(12)] public uint ip_srcaddr;
[FieldOffset(16)] public uint ip_destaddr;
}
public class RawSocket
{
private bool error_occurred;//是否产生错误
public bool KeepRunning;//是否继续进行
private static int len_receive_buf;//得到的数据流的长度
byte [] receive_buf_bytes;//收到的字节
private Socket socket = null; //声明套接字
const int SIO_R = unchecked((int)0x98000001);
const int SIO_1=unchecked((int)0x98000002);
const int SIO_2=unchecked((int)0x98000003);
public RawSocket()//构造函数
{
error_occurred=false;
len_receive_buf = 4096;
receive_buf_bytes = new byte[len_receive_buf];
}
public void CreateAndBindSocket(string IP)//建立并绑定套接字
{
socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
socket.Blocking = false;//置socket非阻塞状态
socket.Bind(new IPEndPoint(IPAddress.Parse(IP), 0));
if (SetSocketOption()==false) error_occurred=true;
}
public void Shutdown()
{
if(socket != null)
{
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
}
private bool SetSocketOption()
{
bool ret_value = true;
try
{
socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, 1);
byte []IN = new byte[4]{1, 0, 0, 0};
byte []OUT = new byte[4];
int ret_code = socket.IOControl(SIO_R, IN, OUT);//低级别操作模式
ret_code = OUT[0] + OUT[1] + OUT[2] + OUT[3];//把4个8位字节合成一个32位整数
System.Windows.Forms.MessageBox.Show(ret_code.ToString());
if(ret_code != 0) ret_value = false;
}
catch(SocketException)
{
ret_value = false;
}
return ret_value;
}
public bool ErrorOccurred
{
get
{
return error_occurred;
}
}
//解析接收的数据包,形成PacketArrivedEventArgs时间数据类对象,并引发PacketArrival事件
unsafe private void Receive(byte [] buf, int len)
{
byte temp_protocol=0;
uint temp_version=0;
uint temp_ip_srcaddr=0;
uint temp_ip_destaddr=0;
short temp_srcport=0;
short temp_dstport=0;
IPAddress temp_ip;
//return;
PacketArrivedEventArgs e=new PacketArrivedEventArgs();
fixed(byte *fixed_buf = buf)
{
IPHeader * head = (IPHeader *) fixed_buf;
e.HeaderLength=(uint)(head->ip_verlen & 0x0F) << 2;
temp_protocol = head->ip_protocol;
switch(temp_protocol)
{
case 1: e.Protocol="ICMP:"; break;
case 2: e.Protocol="IGMP:"; break;
case 6: e.Protocol="TCP:"; break;
case 17: e.Protocol="UDP:"; break;
default: e.Protocol= "UNKNOWN"; break;
}
temp_version =(uint)(head->ip_verlen & 0xF0) >> 4;
e.IPVersion = temp_version.ToString();
temp_ip_srcaddr = head->ip_srcaddr;
temp_ip_destaddr = head->ip_destaddr;
temp_ip = new IPAddress(temp_ip_srcaddr);
e.OriginationAddress =temp_ip.ToString();
temp_ip = new IPAddress(temp_ip_destaddr);
e.DestinationAddress = temp_ip.ToString();
temp_srcport = *(short *)&fixed_buf[e.HeaderLength];
temp_dstport = *(short *)&fixed_buf[e.HeaderLength+2];
e.OriginationPort=IPAddress.NetworkToHostOrder(temp_srcport).ToString();
e.DestinationPort=IPAddress.NetworkToHostOrder(temp_dstport).ToString();
// if(e.DestinationAddress!="211.87.212.116"||int.Parse(e.DestinationPort)>1000)
// {
// return;
// }
e.PacketLength =(uint)len;
e.MessageLength =(uint)len - e.HeaderLength;
e.ReceiveBuffer=buf;
//把buf中的IP头赋给PacketArrivedEventArgs中的IPHeaderBuffer
Array.Copy(buf,0,e.IPHeaderBuffer,0,(int)e.HeaderLength);
//把buf中的包中内容赋给PacketArrivedEventArgs中的MessageBuffer
Array.Copy(buf,(int)e.HeaderLength,e.MessageBuffer,0,(int)e.MessageLength);
}
//引发PacketArrival事件
OnPacketArrival(e);
}
public void Run()
{
IAsyncResult ar = socket.BeginReceive(receive_buf_bytes, 0, len_receive_buf, SocketFlags.None, new AsyncCallback(CallReceive), this);
}
private void CallReceive(IAsyncResult ar)
{
int received_bytes;
received_bytes = socket.EndReceive(ar);
Receive(receive_buf_bytes, received_bytes);
if (KeepRunning) Run();
}
public class PacketArrivedEventArgs : EventArgs
{
public PacketArrivedEventArgs()
{
this.protocol = "";
this.destination_port = "";
this.origination_port = "";
this.destination_address = "";
this.origination_address = "";
this.ip_version = "";
this.total_packet_length =0;
this.message_length =0;
this.header_length =0;
this.receive_buf_bytes=new byte[len_receive_buf];
this.ip_header_bytes=new byte[len_receive_buf];
this.message_bytes=new byte[len_receive_buf];
}
public string Protocol
{
get {return protocol;}
set {protocol=value;}
}
public string DestinationPort
{
get {return destination_port;}
set {destination_port=value;}
}
public string OriginationPort
{
get {return origination_port;}
set {origination_port=value;}
}
public string DestinationAddress
{
get {return destination_address;}
set {destination_address=value;}
}
public string OriginationAddress
{
get {return origination_address;}
set {origination_address=value;}
}
public string IPVersion
{
get {return ip_version;}
set {ip_version=value;}
}
public uint PacketLength
{
get {return total_packet_length;}
set {total_packet_length=value;}
}
public uint MessageLength
{
get {return message_length;}
set {message_length=value;}
}
public uint HeaderLength
{
get {return header_length;}
set {header_length=value;}
}
public byte [] ReceiveBuffer
{
get {return receive_buf_bytes;}
set {receive_buf_bytes=value;}
}
public byte [] IPHeaderBuffer
{
get {return ip_header_bytes;}
set {ip_header_bytes=value;}
}
public byte [] MessageBuffer
{
get {return message_bytes;}
set {message_bytes=value;}
}
private string protocol;
private string destination_port;
private string origination_port;
private string destination_address;
private string origination_address;
private string ip_version;
private uint total_packet_length;
private uint message_length;
private uint header_length;
private byte []receive_buf_bytes = null;
private byte []ip_header_bytes = null;
private byte []message_bytes = null;
}
public delegate void PacketArrivedEventHandler(
Object sender, PacketArrivedEventArgs args);
public event PacketArrivedEventHandler PacketArrival;
protected virtual void OnPacketArrival(PacketArrivedEventArgs e)
{
if (PacketArrival != null)
{
PacketArrival(this, e);
}
}
}
}
相关推荐
C#实现抓包实例(附完整源码)
C#实现抓包实例(附完整源码)
C#派生类中如何定义属性控制基类事件,通过派生类属性直接操作基类事件
写代码的时候遇到了这个问题,论坛里大牛给出了解决方法。 我原来的想法,创建一个属性返回基类的事件,但是不行。 解决办法: public event PacketArrivalEventHandler OnPacketArrial { add { _device.OnPacketArrival += value; } remove { _device.OnPac
C#.Net正则表达式网络爬虫实战:抓取百度百家文章列表
C#(发音为 “C Sharp”)是一种由微软开发的现代、类型安全的面向对象编程语言。它简洁、优雅,并具备强大的功能。C#的基本语法包括了变量声明、循环控制、条件判断等编程基础概念。让我们快速回顾一些关键的语法点:");开发者也可以创建自己的异常类,以支持特定的异常处理需求。自定义异常类通常继承自类,并提供构造函数和额外的属性,以便提供更多的错误信息。try在上面的代码中,我们定义了一个类,并在Main方法中抛出了这个异常。
[计算机网络原理]c#实现网络抓包及协议分析
文章目录主界面设计(随意)抓包代码展示 主界面设计(随意) 抓包代码 public partial class MainWindow : Form { private CaptureDeviceList devices; //接口列表 public static string[] name = new string[100]; //接口名称 public static int Selectid=-1;
Lucene实现的网页抓取与模拟搜索引擎教程
Apache Lucene是一个开源的全文检索引擎工具包,它提供了一整套用于实现搜索引擎的API,使得开发者可以方便地构建自己的搜索引擎。Lucene不依赖于任何特定的编程语言,可以运行在Java、C#、Python、PHP等多种语言环境中。中文分词是一种将连续的中文文本切分成词序列的技术。中文分词系统通常会使用一些算法来判断可能的切分点,常见的算法包括基于规则的分词、基于统计的分词以及基于理解的分词等。在结果较多时,需要提供分页功能,方便用户浏览。
C#刷网工具:代码、数据库及脚本实现详解
C#刷网工具项目起源于网络数据处理和自动化测试领域的需求,旨在提供一种高效、稳定且易于维护的方式来处理网络请求和数据交互。该工具不仅需要支持多种网络协议,如HTTP、FTP等,还需具备一定的数据解析能力和用户自定义脚本执行能力。
C#抓取网页内容的函数的代码
将写代码过程比较好的代码段备份一次,如下代码是关于C#抓取网页内容的函数的代码,应该能对大伙有较大用途。 private byte[] GetURLContents(string url){ var content = new MemoryStream(); var webReq = (HttpWebRequest)WebRequest.Create(url); ...
C# WinForm应用中的微秒级时间戳展示技术
在项目开发过程中,文件结构、配置管理及部署维护是确保项目成功的关键步骤。这一章将详细介绍如何组织项目文件、优化配置以及如何部署和维护项目。
C#抓取网页数据
string tempurl = "xxxx"; //需要请求的页面url HttpWebRequest webr = (HttpWebRequest)WebRequest.Create(tempurl);//创建请求 string paramStr = "xxx"; //需要传参 byte[] paramByte = Encoding.UTF8.GetBytes(paramSt...
多线程邮箱抓取工具MailCrawler的原理与实践
邮箱格式规则,其中username可包含字母、数字、点号、下划线和连字符;domain可包含字母、数字、点号和连字符。正则表达式基础:通过正则表达式来定义符合邮箱格式规范的字符串模式,包括对用户名、符号、域名等部分的精确匹配。代码实现逻辑:C#实现邮箱格式验证,使用方法,传入定义好的正则表达式和待验证的邮箱字符串,返回验证结果。高级验证技巧:通过添加否定前瞻和否定后顾断言,以及使用回溯引用和条件断言,实现更高级的邮箱地址格式验证规则。
c#抓包项目源码
c#抓包项目源码
探索未来网络爬虫的新境界 - 深入解析AbotX
探索未来网络爬虫的新境界 - 深入解析AbotX 在数字化时代,数据是驱动洞察与创新的燃料。当涉及高效、智能地从网页中提取信息时,AbotX以其强大功能脱颖而出,成为了C#开发者不可或缺的工具箱之一。让我们一同揭开这个开源宝藏项目的神秘面纱。 项目介绍 AbotX,一个基于C#构建的强大网页爬虫框架,它继承了[Abot C# Web Crawler Framework]的优秀基因,并在此基础上进行...
自编写C#Fiddler抓包源码
测试前请修改 CaptureConfiguration.CaptureDomain = "www.baidu.com";//捕捉域
Cefsharp抓取拼多多每日关键词
最近业余时间都在学习Cefsharp实现本地客户端,发现Cefsharp可以很方便的爬取一些网站的信息,于是就一些爬取过程做一下记录。拼多多商品搜索的链接是:拼多多,我们在CefSharp发起请求时加上log打印相关的请求信息,经过分析log,发现这条有关键字的信息是在一次MimeType为json的HTTP资源请求。代码段和日志如下 使用我上传的资源下载器也可以加载到对应的json文件.使用CefSharp结合vue3实现简单URL资源下载器-C#文档类资源-优快云下载 获取关键
c#网络数据包监控软件
c#网络数据包监控软件,bin/debug/sniff.exe(以管理员身份运行)
C# 实现 http协议抓包
根据http协议完善的抓包源码,代码通俗易懂,适合初学者入手
C# 解决“请求被中止: 未能创建 SSL/TLS 安全通道”的问题
最近在开发项目的时候,使用爬虫抓取网络数据的时候,当请求Web数据时,碰到了“请求被中止: 未能创建 SSL/TLS 安全通道”的问题,尝试过很多网上的方法,例如添加证书等都没有用。最后在GitHub上面找到了解决方案,地址:https://github.com/paypal/TLS-update/blob/master/net/TlsCheck特意记录下来,希望对碰到类似的问题的...
Unity Shader Graph 2D - Procedural程序化图形转动的环状六边形
Hexagon又称六边形,在游戏中是十分常见的基础形状,本文将使用程序化的六边形来制作多个环状六边形叠加的转动动画效果,实践Unity Shader Graph中的常用节点功能。
c# 使用 HttpWebRequest模拟登陆(附带验证码)
在C#中,可以使用HttpWebRequest进行相关的模拟登陆,登陆后进行相关的操作,比如抓取数据,页面分析,制作相关登陆助手等等。 先说下流程 1.使用httpwebrequest先进入你要登录的网站,获取cookie 2.使用第一步获取的cookie到验证码的网页将验证码下载下来。 3.使用Post数据 发送至网站。如果有cookie则继续保存。 4.使用第三步的cookie登陆相
RC电路(一):微分|积分
的取值不同,会导致输出波形和输入波形之间的关系也不同,由此也会产生不同的应用。输出为0,随着电容充满电,运放-输入端得到的分压为正最大值,可等效成一个电压源,且电压不可突变,此时电流反向为最大值,开始充电时的容抗为0,电压不可突变则电压差为0,运放。开始充电时的容抗为0,电压不可突变则电压差为0,运放。输入端得到的分压也不可突变,随着电容放完电,于是。,因电容上电压不能突变(来不及充电,相当于短路,由上分析可得积分运算电路中,输出为运放的负最大峰值,随着电容充满电,输出为运放的正最大峰值,随着电容放完电,
LangChain与SkillLite集成:AI Agent安全沙箱实践
在AI与自动化技术领域,安全沙箱是实现可信计算的核心机制。其原理是通过资源隔离与权限控制,构建受限的执行环境。技术价值在于平衡功能开放性与系统安全性,尤其适用于处理用户提交的非受信代码或敏感数据。典型应用场景包括AI插件系统、在线代码评测平台等。本文以LangChain框架与SkillLite沙箱的深度集成为例,详解如何通过命名空间隔离、cgroups限制等机制,为AI Agent赋予安全执行动态技能的能力。其中涉及的关键技术点包括Python运行时隔离、动态资源配额管理,以及如何防范Shell注入等常见攻
765



被折叠的 条评论
为什么被折叠?



