即时修改TCP封包内容

Dreaerkj 2015-04-17 10:52:24
搜了好几天了,没找到合适的例子,NDIS 、HOOK SOCKET API、 WINPCAP都可以 谁有例子参考下
...全文
475 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
江南小鱼 2015-04-19
  • 打赏
  • 举报
回复
引用 4 楼 q1272394719 的回复:
[quote=引用 3 楼 wyd1520 的回复:] C#搞不了这东西 。只能C++。
C++代码有吗 [/quote] 不懂,度娘了下,顺便哥也了解了解 你瞧瞧,是否对你有帮助。 最简单的TCP网络封包解包
足球中国 2015-04-19
  • 打赏
  • 举报
回复
在wsasend下断,在内存处做修改就可以了。 技术上难度是很简单。但TM的分析包是蛋疼的事情。
john_QQ:2335298917 2015-04-17
  • 打赏
  • 举报
回复
顶,等待大神
暈哥 2015-04-17
  • 打赏
  • 举报
回复
给你一个Sniffer的完整代码,基于winpcap抓包统计吞吐量的Demo; 如果涉及数据包加密,服务器验证,需要做的工作还很多。

using System;
using System.Net;
using System.Net.Sockets;
using System.Net.NetworkInformation;
using System.Runtime.InteropServices;
using System.Collections.Concurrent;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using SharpPcap;
using SharpPcap.WinPcap;
using PacketDotNet;
using Demo.STP.Sniff.Packets;

namespace Demo.STP.Sniff
{
	/// <summary>
	/// 嗅探器,提供原始数据源
	/// </summary>
	public sealed class Sniffer
	{
		#region Instance
		private static readonly Lazy<Sniffer> _lazy =
			new Lazy<Sniffer>(() => new Sniffer());

		public static Sniffer Instance
		{
			get { return _lazy.Value; }
		}

		private Sniffer() { }
		#endregion Instance

		#region Init
		/// <summary>
		/// 初始化嗅探器
		/// </summary>
		/// <param name="ipAddress">需拦截网卡所配IP</param>
		/// <param name="filter">数据包过滤规则</param>
		public void Init(string ipAddress, string filter = "")
		{
			var network = Demo.STP.Common.NetHelper.GetNetwork(ipAddress);
			if (network == null)
				throw new ArgumentException(string.Format("Invalid IPAddress {0}.", ipAddress));

			this._currentDevice = WinPcapDeviceList.Instance.Where(deviceItem => 
				string.Equals(network.Name, deviceItem.Interface.FriendlyName, StringComparison.OrdinalIgnoreCase))
				.FirstOrDefault();

			if (this._currentDevice == null)
				throw new ArgumentException("无法从WinPcap找到对应网卡.");

			this._currentDevice.OnPacketArrival += device_OnPacketArrival;
			this._currentDevice.Open(DeviceMode.Normal);
			this._currentDevice.Filter = filter;
		}

		private void device_OnPacketArrival(object sender, CaptureEventArgs e)
		{
			this._packetQueue.Enqueue(e.Packet);
		}
		#endregion Init

		#region Start Hook
		/// <summary>
		/// 启动嗅探器
		/// </summary>
		public void StartHook()
		{
			if (this._currentDevice == null)
				throw new ArgumentException("请先初始化嗅探器.");

			KeepHook = true;
			this._currentDevice.StartCapture();

			RawCapture rawCapture = null;

			Task.Factory.StartNew(() =>
			{
				while (KeepHook)
				{
					if (this._packetQueue.IsEmpty)
					{
						//理论上能轻松应对所有终端
						//如果吞吐量达不到要求,请删除Sleep,但会占用一个核心的全部时间
						Thread.Sleep(10);
						continue;
					}
					if (this._packetQueue.TryDequeue(out rawCapture))
					{
						var basePacket = this.AnalysisPacket(rawCapture);
						if (basePacket.HasValue)
						{
							OnPacketArrival(new PacketArrivedEventArgs { BasePacket = basePacket.Value });
						}
					}
				}
			}, TaskCreationOptions.LongRunning);
		}
		#endregion Start Hook

		#region Stop Hook
		/// <summary>
		/// 停止嗅探器
		/// </summary>
		public void StopHook()
		{
			if (this._currentDevice == null) return;

			KeepHook = false;

			if (this._currentDevice.Started)
				this._currentDevice.StopCapture();

			this._currentDevice.OnPacketArrival -= device_OnPacketArrival;
			this._currentDevice.Close();
		}
		#endregion Stop Hook

		#region 解析数据包
		private Nullable<IPBasePacket> AnalysisPacket(RawCapture rawCapture)
		{
            try
            {
                var rawPacket = rawCapture.ParseRawPacket();
                var ipPacket = rawPacket.ExtractTragetPacket<IpPacket>();
                if (ipPacket == null)
                    return null;

                EnumIPProtocol targetProtocol;
                var parseFlag = Enum.TryParse(ipPacket.Protocol.ToString(), true, out targetProtocol);
                if (!parseFlag)
                    return null;

                IPBasePacket basePacket = new IPBasePacket();
                basePacket.Protocol = targetProtocol;
                basePacket.IPVersion = ipPacket.Version.ToString();
                basePacket.SourceIP = ipPacket.SourceAddress.ToString();
                basePacket.TargetIP = ipPacket.DestinationAddress.ToString();

                dynamic tcp_udp_Packet = rawPacket.ExtractTragetPacket<TcpPacket>();
                if (tcp_udp_Packet == null)
                    tcp_udp_Packet = rawPacket.ExtractTragetPacket<UdpPacket>();

                if (tcp_udp_Packet != null)
                {
					if (tcp_udp_Packet.PayloadData == null)
						return null; 

                    basePacket.SourcePort = tcp_udp_Packet.SourcePort;
                    basePacket.TargetPort = tcp_udp_Packet.DestinationPort;

                    //basePacket.PacketLength = (uint)tcp_udp_Packet.Bytes.Length;
                    //basePacket.HeaderLength = (uint)tcp_udp_Packet.Header.Length;
                    //basePacket.MessageLength = (uint)tcp_udp_Packet.PayloadData.Length;

                    //basePacket.PacketBuffer = tcp_udp_Packet.Bytes;
                    //basePacket.HeaderBuffer = tcp_udp_Packet.Header;
                    //basePacket.MessageBuffer = tcp_udp_Packet.PayloadData;
                    
                    basePacket.MessageLength = (uint)tcp_udp_Packet.PayloadData.Length;
                    basePacket.MessageBuffer = tcp_udp_Packet.PayloadData;
                }

                return basePacket;
            }
            catch
            { 
                return null; 
            }
		}
		#endregion 解析数据包

		#region PacketArrival Event
		public event EventHandler<PacketArrivedEventArgs> PacketArrival;

		internal void OnPacketArrival(PacketArrivedEventArgs e)
		{
			if (PacketArrival != null)
			{
				PacketArrival(this, e);
			}
		}

		public bool IsMonitorEmpty
		{
			get { return PacketArrival == null; }
		}
		#endregion PacketArrival Event

		#region Fields & Propertys
		public bool KeepHook { get; private set; }
		private WinPcapDevice _currentDevice;
		private ConcurrentQueue<RawCapture> _packetQueue = new ConcurrentQueue<RawCapture>();
		#endregion Fields & Propertys
	}

	public class PacketArrivedEventArgs : EventArgs
	{
		public IPBasePacket BasePacket { get; set; }
	}
}

Dreaerkj 2015-04-17
  • 打赏
  • 举报
回复
引用 3 楼 wyd1520 的回复:
C#搞不了这东西 。只能C++。
C++代码有吗
本拉灯 2015-04-17
  • 打赏
  • 举报
回复
C#搞不了这东西 。只能C++。
编程有钱人了 2015-04-17
  • 打赏
  • 举报
回复
高大上的问题啊,等高手
  • 打赏
  • 举报
回复
太高端了,完全不懂…… @本拉灯 该你出场了
泡泡龙 2015-04-17
  • 打赏
  • 举报
回复
用fiddlercore试试
Dreaerkj 2015-04-17
  • 打赏
  • 举报
回复
不修改HOSTS把指定域名转向到Ip可以不
by_封爱 版主 2015-04-17
  • 打赏
  • 举报
回复
啥意思???不太明白? 是你玩网游的时候 你打开一个点卷 然后截取 然后包里的元宝+1W 然后停止截取 然后把这个重新无限发送给服务器? 还是 元宝+1 你修改成1000 之后 替换原来的数据 发给服务器? 以前是有三剑客的 eg+wpe+ccp 可以搞你想要的.. 不过代码就不知道了...不是单纯的修改就可以吧 还需要代理什么什么的...
园区网络安全设计全文共9页,当前为第1页。园区网络安全设计全文共9页,当前为第1页。园区网络安全设计 园区网络安全设计全文共9页,当前为第1页。 园区网络安全设计全文共9页,当前为第1页。 网络防火墙部署 网络系统建设不但要考虑系统整体可靠性,对于网络系统整体安全性也成为系统建设重要考虑点。 在核心交换机上层部署防火墙安全设备,来提高整个网络系统安全性能。防火墙能将内网与不安全的外部网络环境隔离开。防火墙具有能三层到四层的防护功能。网络层防火墙可视为一种 IP 封包过滤器,运作在底层的 TCP/IP 协议堆栈上。我们可以以枚举的方式,只允许符合特定规则的封包通过,其余的一概禁止穿越防火墙。这些规则通常可以经由管理员定义或修改。应用层防火墙是在 TCP/IP 堆栈的"应用层"上运作,您使用浏览器时所产生的数据流或是使用 FTP 时的数据流都是属于这一层。应用层防火墙可以拦截进出某应用程序的所有封包,并且封锁其他的封包(通常是直接将封包丢弃)。理论上,防火墙四层防护可以完全阻绝外部的数据流进到受保护的机器里。 防火墙借由监测所有的封包并找出不符规则的内容,可以防范电脑蠕虫或是木马程序的快速蔓延。防火墙支持外部攻击防范、内网安全、流量监控、邮件过滤、网页过滤、应用层过滤等功能,能够有效的保证网络的安全。防火墙可对连接状态过程和异常命令进行检测;提供多种智能分析和管理手段,支持邮件告警,支持多种日志,提供网络管理监控,协助网络管理员完成网络的安全管理;支持多种VPN业务,如GRE VPN 、IPSec VPN、L2TP VPN及SSL VPN等,可以构建多种形式的VPN;提供基本的路由能力,支持RIP/OSPF/BGP/路由策略及策略路由;支持丰富的QoS特性。 在防火墙上推荐部署如下安全控制策略: 防火墙设置为默认拒绝工作方式,保证所有的数据包,如果没有明确的规则允许通过,全部拒绝以保证安全; 在两台防火墙上设定严格的访问控制规则,配置只有规则允许的IP地址或者用户能够访问数据中心中的指定的资源,严格限制网络用户对服务器的资源,以避免网络用户可能会对服务器的攻击、非授权访问以及病毒的传播,保护服务器中的核心数据信息资产; 配置防火墙防DOS/DDOS功能,对Land、Smurf、Fraggle、Ping of Death、Tear Drop、SYN Flood、ICMP Flood、UDP Flood等拒绝服务攻击进行防范,可以实现对各种拒绝服务攻击的有效防范,保证网络带宽; 配置防火墙全面攻击防范能力,包括ARP欺骗攻击的防范,提供ARP主动反向查询、TCP报文标志位不合法攻击防范、超大ICMP报文攻击防范、地址/端口园区网络安全设计全文共9页,当前为第2页。园区网络安全设计全文共9页,当前为第2页。扫描的防范、ICMP重定向或不可达报文控制功能、Tracert报文控制功能、带路由记录选项IP报文控制功能等,全面防范各种网络层的攻击行为; 园区网络安全设计全文共9页,当前为第2页。 园区网络安全设计全文共9页,当前为第2页。 根据需要,配置IP/MAC绑定功能,对能够识别MAC地址的主机进行链路层控制,实现只有IP/MAC匹配的用户才能访问数据中心的服务器; 其他可选策略: 可以启动防火墙身份认证功能,通过内置数据库或者标准Radius属性认证,实现对用户身份认证后进行资源访问的授权,进行更细粒度的用户识别和控制; 根据需要,在防火墙上设置流量控制规则,实现对服务器访问流量的有效管理,有效的避免网络带宽的浪费和滥用,保护关键服务器的网络带宽; 根据应用和管理的需要,设置有效工作时间段规则,实现基于时间的访问控制,可以组合时间特性,实现更加灵活的访问控制能力; 在防火墙上进行设置告警策略,利用灵活多样的告警响应手段(E-mail、日志、SNMP 陷阱等),实现攻击行为的告警,有效监控网络应用; 启动防火墙日志功能,利用防火墙的日志记录能力,详细完整的记录日志和统计报表等资料,实现对网络访问行为的有效的记录和统计分析。 IPS部署 现在,各种蠕虫、间谍软件、网络钓鱼等应用层威胁和EMAIL、移动代码结合,形成复合型威胁,使威胁更加危险和难以抵御。这些威胁直接攻击服务器和应用,给业务带来了重大损失;攻击终端用户计算机,给用户带来信息风险甚至财产损失;对网络基础设施进行DoS/DDoS攻击,造成基础设施的瘫痪;更有甚者,像电驴、BT等P2P应用和MSN、QQ等即时通信软件的普及,宝贵的带宽资源被业务无关流量浪费,形成巨大的资源损失。 入侵防护系统 (IPS) 倾向于提供主动防护,其设计宗旨是预先对入侵活动和攻击性网络流量进行拦截,避免其造成损失,而不是简单地在恶意流量传送时或传送后才发出警报。IPS是通过直接嵌入到网络流量中实现这一功能

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧