有关C#开发抓取、分析网络数据包的代码段

C# 异步多线程 sharpPcap 抓包 需要在电脑上安装Winpcap 阅读详情

 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);  
  }  
  }  
  }  
  }  

逆向实战:从网络封包分析到通用发包Call的定位与调用 网络通信是客户端与服务器交互的基础,其核心在于数据封包的组装与发送。理解封包结构与发送原理,是掌握网络编程、游戏安全及自动化测试的关键技术。通过分析网络协议和系统API调用,可以定位到负责组包和发包的核心函数(发包Call),这不仅能深化对程序底层机制的认识,还具有极高的工程实践价值。在游戏辅助、自动化工具及安全测试等场景中,掌握通用发包Call的逆向与调用技术,能实现精准的功能模拟与逻辑控制。本文以经典案例为引,深入探讨了如何结合动态调试、网络监控等工具,完成对发包Call的定位、参数分析与稳定调用,其中 阅读详情

相关推荐

C#实现抓包实例(附完整源码)

C#实现抓包实例(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 765

C#派生类中如何定义属性控制基类事件,通过派生类属性直接操作基类事件

写代码的时候遇到了这个问题,论坛里大牛给出了解决方法。 我原来的想法,创建一个属性返回基类的事件,但是不行。 解决办法: public event PacketArrivalEventHandler OnPacketArrial { add { _device.OnPacketArrival += value; } remove { _device.OnPac

忆_碎碎念 1173

C#.Net正则表达式网络爬虫实战:抓取百度百家文章列表

C#(发音为 “C Sharp”)是一种由微软开发的现代、类型安全的面向对象编程语言。它简洁、优雅,并具备强大的功能。C#的基本语法包括了变量声明、循环控制、条件判断等编程基础概念。让我们快速回顾一些关键的语法点:");开发者也可以创建自己的异常类,以支持特定的异常处理需求。自定义异常类通常继承自类,并提供构造函数和额外的属性,以便提供更多的错误信息。try在上面的代码中,我们定义了一个类,并在Main方法中抛出了这个异常。

weixin_35364187的博客 740

[计算机网络原理]c#实现网络抓包及协议分析

文章目录主界面设计(随意)抓包代码展示 主界面设计(随意) 抓包代码 public partial class MainWindow : Form { private CaptureDeviceList devices; //接口列表 public static string[] name = new string[100]; //接口名称 public static int Selectid=-1;

qq_43587354的博客 4861

Lucene实现的网页抓取与模拟搜索引擎教程

Apache Lucene是一个开源的全文检索引擎工具包,它提供了一整套用于实现搜索引擎的API,使得开发者可以方便地构建自己的搜索引擎。Lucene不依赖于任何特定的编程语言,可以运行在Java、C#、Python、PHP等多种语言环境中。中文分词是一种将连续的中文文本切分成词序列的技术。中文分词系统通常会使用一些算法来判断可能的切分点,常见的算法包括基于规则的分词、基于统计的分词以及基于理解的分词等。在结果较多时,需要提供分页功能,方便用户浏览。

weixin_35835018的博客 509

C#刷网工具:代码、数据库及脚本实现详解

C#刷网工具项目起源于网络数据处理和自动化测试领域的需求,旨在提供一种高效、稳定且易于维护的方式来处理网络请求和数据交互。该工具不仅需要支持多种网络协议,如HTTP、FTP等,还需具备一定的数据解析能力和用户自定义脚本执行能力。

weixin_29025501的博客 1060

C#抓取网页内容的函数的代码

将写代码过程比较好的代码段备份一次,如下代码是关于C#抓取网页内容的函数的代码,应该能对大伙有较大用途。 private byte[] GetURLContents(string url){ var content = new MemoryStream(); var webReq = (HttpWebRequest)WebRequest.Create(url); ...

dengcu8401的博客 215

C# WinForm应用中的微秒级时间戳展示技术

在项目开发过程中,文件结构、配置管理及部署维护是确保项目成功的关键步骤。这一章将详细介绍如何组织项目文件、优化配置以及如何部署和维护项目。

weixin_29717341的博客 1202

C#抓取网页数据

string tempurl = "xxxx"; //需要请求的页面url HttpWebRequest webr = (HttpWebRequest)WebRequest.Create(tempurl);//创建请求 string paramStr = "xxx"; //需要传参 byte[] paramByte = Encoding.UTF8.GetBytes(paramSt...

320

多线程邮箱抓取工具MailCrawler的原理与实践

邮箱格式规则,其中username可包含字母、数字、点号、下划线和连字符;domain可包含字母、数字、点号和连字符。正则表达式基础:通过正则表达式来定义符合邮箱格式规范的字符串模式,包括对用户名、符号、域名等部分的精确匹配。代码实现逻辑:C#实现邮箱格式验证,使用方法,传入定义好的正则表达式和待验证的邮箱字符串,返回验证结果。高级验证技巧:通过添加否定前瞻和否定后顾断言,以及使用回溯引用和条件断言,实现更高级的邮箱地址格式验证规则。

weixin_29363791的博客 804

c#抓包项目源码

c#抓包项目源码

探索未来网络爬虫的新境界 - 深入解析AbotX

探索未来网络爬虫的新境界 - 深入解析AbotX 在数字化时代,数据是驱动洞察与创新的燃料。当涉及高效、智能地从网页中提取信息时,AbotX以其强大功能脱颖而出,成为了C#开发者不可或缺的工具箱之一。让我们一同揭开这个开源宝藏项目的神秘面纱。 项目介绍 AbotX,一个基于C#构建的强大网页爬虫框架,它继承了[Abot C# Web Crawler Framework]的优秀基因,并在此基础上进行...

gitblog_00020的博客 826

自编写C#Fiddler抓包源码

测试前请修改 CaptureConfiguration.CaptureDomain = "www.baidu.com";//捕捉域

Cefsharp抓取拼多多每日关键词

最近业余时间都在学习Cefsharp实现本地客户端,发现Cefsharp可以很方便的爬取一些网站的信息,于是就一些爬取过程做一下记录。拼多多商品搜索的链接是:拼多多,我们在CefSharp发起请求时加上log打印相关的请求信息,经过分析log,发现这条有关键字的信息是在一次MimeType为json的HTTP资源请求。代码段和日志如下 使用我上传的资源下载器也可以加载到对应的json文件.使用CefSharp结合vue3实现简单URL资源下载器-C#文档类资源-优快云下载 获取关键

lightjia的博客 837

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特意记录下来,希望对碰到类似的问题的...

a261505的博客 4750

Unity Shader Graph 2D - Procedural程序化图形转动的环状六边形

Hexagon又称六边形,在游戏中是十分常见的基础形状,本文将使用程序化的六边形来制作多个环状六边形叠加的转动动画效果,实践Unity Shader Graph中的常用节点功能。

Giver的博客 1928

c# 使用 HttpWebRequest模拟登陆(附带验证码)

在C#中,可以使用HttpWebRequest进行相关的模拟登陆,登陆后进行相关的操作,比如抓取数据,页面分析,制作相关登陆助手等等。 先说下流程 1.使用httpwebrequest先进入你要登录的网站,获取cookie 2.使用第一步获取的cookie到验证码的网页将验证码下载下来。 3.使用Post数据 发送至网站。如果有cookie则继续保存。 4.使用第三步的cookie登陆相

1010

RC电路(一):微分|积分

的取值不同,会导致输出波形和输入波形之间的关系也不同,由此也会产生不同的应用。输出为0,随着电容充满电,运放-输入端得到的分压为正最大值,可等效成一个电压源,且电压不可突变,此时电流反向为最大值,开始充电时的容抗为0,电压不可突变则电压差为0,运放。开始充电时的容抗为0,电压不可突变则电压差为0,运放。输入端得到的分压也不可突变,随着电容放完电,于是。,因电容上电压不能突变(来不及充电,相当于短路,由上分析可得积分运算电路中,输出为运放的负最大峰值,随着电容充满电,输出为运放的正最大峰值,随着电容放完电,

既有随处可栖的江湖,也有追风逐梦的骁勇! 1万+

LangChain与SkillLite集成:AI Agent安全沙箱实践

在AI与自动化技术领域,安全沙箱是实现可信计算的核心机制。其原理是通过资源隔离与权限控制,构建受限的执行环境。技术价值在于平衡功能开放性与系统安全性,尤其适用于处理用户提交的非受信代码或敏感数据。典型应用场景包括AI插件系统、在线代码评测平台等。本文以LangChain框架与SkillLite沙箱的深度集成为例,详解如何通过命名空间隔离、cgroups限制等机制,为AI Agent赋予安全执行动态技能的能力。其中涉及的关键技术点包括Python运行时隔离、动态资源配额管理,以及如何防范Shell注入等常见攻

weixin_34189116的博客 405
上一篇: 关于c#实现影音嗅探的问题(转)
下一篇: C#正则表达式整理备忘 转载(http://www.cnblogs.com/KissKnife/archive/2008/03/23/1118423.html)
cuoban
博客等级 码龄24年 239粉丝 13原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值