当前位置:   article > 正文

网络嗅探器和分析仪程序——第1部分_network-sniffer

network-sniffer

目录

介绍

第1部分:基于子网掩码的IP地址分析

提取给定IP地址的网络ID表单

获取可用主机的数量

地址总数

最大主机数

获取可用网络ID的数量

提取子网中的第一个IP

提取子网中的最后一个IP


介绍

在本文中,我将介绍我的程序(网络嗅探器和分析器),并通过逐步解释代码来向您展示该程序的机制。

注意:为了能够理解本文,您应该具备网络的一般知识和高级C#知识。

注意:为了充分解释该程序,我将文章分为几个部分。
每个部分都将包含程序中所用功能的完整说明。对于文章的每个部分,我将分别上传程序的一部分。在文章的最后一部分,我将上传该程序的最终版本,当然,在解释了背景和如何使用该程序之后。

文章顺序如下:

  1. 基于子网掩码的IP地址分析
  2. 扫描网络以获取所有可用设备
  3. Arp欺骗
  4. 监控通过特定设备浏览的网站

让我们开始吧!

1部分:基于子网掩码的IP地址分析

我们将首先获取计算机上所有可用的IP,然后我们将根据IP类确定此IP的适当子网掩码。我们还将提取此IP的互联网ID、可用主机的数量、可用网络ID的数量、该网络中的第一个IP和最后一个IP。首先,我们将为给定IP定义IP类。

通常,要确定IP类别,我们需要取IP中的第一个数字并分析其所属的范围。根据类的IP顺序如下表所示:

范围

子网掩码

A

1-126

\8

B

128-191

\16

C

192-223

\24

D

224-239

_

E

240-255

_

这可以按照以下代码完成:

  1. public enum IPClass { A, B, C, D, E, notDetected }
  2. IPClass getIPClass(string IP)
  3. {
  4. if (!string.IsNullOrEmpty(IP) && IP.Split('.').Length == 4 &&
  5. !string.IsNullOrEmpty(IP.Split('.').Last()))
  6. {
  7. string ipclassstr = IP.Split('.').First();
  8. int ipclasssnum = int.Parse(ipclassstr);
  9. if (0 <= ipclasssnum && ipclasssnum <= 126)
  10. {
  11. return IPClass.A;
  12. }
  13. if (128 <= ipclasssnum && ipclasssnum <= 191)
  14. {
  15. return IPClass.B;
  16. }
  17. if (192 <= ipclasssnum && ipclasssnum <= 223)
  18. {
  19. return IPClass.C;
  20. }
  21. if (224 <= ipclasssnum && ipclasssnum <= 239)
  22. {
  23. return IPClass.D;
  24. }
  25. if (240 <= ipclasssnum && ipclasssnum <= 255)
  26. {
  27. return IPClass.E;
  28. }
  29. }
  30. else return IPClass.notDetected;
  31. return IPClass.notDetected;
  32. }

和子网掩码:

  1. int getSubnetMaskBitsCount(string ip)
  2. {
  3. IPClass iPClass = getIPClass(ip);
  4. if (iPClass == IPClass.A)
  5. return 8;
  6. if (iPClass == IPClass.B)
  7. return 16;
  8. if (iPClass == IPClass.C)
  9. return 24;
  10. if (iPClass == IPClass.D)
  11. return 31;
  12. if (iPClass == IPClass.E)
  13. return 32;
  14. return -1;
  15. }

在下一步中,我们将提取给定 IP 的网络 ID、可用主机的数量、可用网络 ID 的数量、该网络的第一个IP和最后一个IP,这是基于当前子网掩码及其位数的灵活动态方式进行的。

提取给定IP地址的网络ID表单

找到默认掩码值后,我们将使用给定的IP地址执行操作以获取网络IP地址。
我们将以下IP为例:192.168.178.112”
IP中的第一个数字可以清楚地看出它属于C类,这意味着子网掩码为\24 255.255 .255 .0
我们现在将IP及其子网掩码转换为位,并通过AND操作符计算网络 id

  1. 11000000.10101000.10110010.01110000 (192.168.178.112)
  2. &
  3. 11111111.11111111.11111111.00000000 (255.255 .255 .0)
  4. ----------------------------------------------
  5. 11000000.10101000.10110010.00000000 (192.168.178.0)

这可以在代码中完成,如下所示:

  1. public string getNetID(string ipadresse, string subnetmask)
  2. {
  3. StringBuilder sb = new StringBuilder();
  4. string[] subMaskValues = subnetmask.Split('.');
  5. string[] subIpValues = ipadresse.Split('.');
  6. for (int i = 0; i < subMaskValues.Length; i++)
  7. {
  8. if (i == subMaskValues.Length - 1)
  9. sb.Append((int.Parse(subMaskValues[i]) &
  10. int.Parse(subIpValues[i])).ToString());
  11. else
  12. {
  13. int maskvalue = int.Parse(subMaskValues[i]);
  14. int ipvalue = int.Parse(subIpValues[i]);
  15. string str = ((maskvalue & ipvalue).ToString());
  16. str += ".";
  17. sb.Append(str);
  18. }
  19. }
  20. return sb.ToString();
  21. }

获取可用主机的数量

地址总数

我们可以使用以下公式计算子网中的地址总数:

TNOA( Total number of addresses) = (2^(32 - Current Subnetmask Bits Count))

最大主机数

网络和广播地址不能分配给网络上的主机。因此,您可以分配给主机的可用地址数是地址总数减去2 =(2^(32 -当前子网掩码位计数))-2

这可以在代码中完成,如下所示:

  1. int getHostcount(int Current_Subnetmask_Bits_Count)
  2. {
  3. double resultbits = Math.Max(Math.Pow(2,
  4. (32 - (Current_Subnetmask_Bits_Count))) - 2, 0);
  5. return (int)resultbits;
  6. }

获取可用网络ID的数量

我们可以使用以下公式计算子网中的网络ID数量:

(2^(IP CLass Standart Subnetmask Bits Count - Current Subnetmask Bits Count))

这可以在代码中完成,如下所示:

  1. int getNetcount(int IP_CLass_Standart_Subnetmask_Bits_Count,
  2. int Current_Subnetmask_Bits_Count)
  3. {
  4. double resultbits = Math.Max(
  5. Math.Pow(
  6. 2, Current_Subnetmask_Bits_Count -
  7. IP_CLass_Standart_Subnetmask_Bits_Count),
  8. 0);
  9. return (int)resultbits;
  10. }

提取子网中的第一个IP

首先,我们需要定义四个变量:

  • A. 对于给定的IP类标准子网掩码位数
  • B. 给定或当前子网掩码位数
  • C. 主机零件长度 = 32 - B
  • D. 子网部分 = B - A

1 :从给定的子网掩码中获取主机部分。

2 :将主机部分的最后一位更改为1

第 3 步:如果为D>0,则从子网掩码中获取子网部分,然后对提取的子网部分和IP地址中的等效位应用And操作。

第 4 步:将主机和子网部分转换为二进制。

5 :更换给定IP地址中的主机部分。

示例:地址192.168.178.112作为示例,我们采用子网掩码255.255.255.128 IP地址为192.168.178.112 =>IP类为C =>标准子网掩码为\24 255.255.255.0

步骤1:在给定的示例中将子网掩码转换为位以从中获取主机部分:

  1. 255 . 255 . 255 . 128
  2. 11111111.11111111.11111111.10000000
  3. the Subnet Part(First One) <_ ---------->host part(just the Zeros)

步骤 2:将主机部分的最后一位更改为1 => 0000001

步骤 3:如果为D>0,则从子网掩码中获取子网部分,然后对提取的子网部分和IP地址中的等效位应用And操作 =>子网部分位于索引上:25 = 1

  1. 192 . 168 . 178 . 112
  2. 11000000.10101000.10110010.01110000
  3. ->the equivalent Bit(the first one(0))
  4. so 1 & 0 = 0 => now we add the Host Part 0000001 =>00000001

步骤 4:将主机和子网部分转换为二进制 =>00000001 = 1

步骤 5:替换给定IP地址中的主机部分=>192.168.178.1

这可以在代码中完成,如下所示:

  1. public string getFirstIpAdresse(string ipadresse,
  2. int standard_subnet_mask_bits_count, int current_subnet_mask_bits_count,
  3. string current_subnet_mask_bits)
  4. {
  5. int hostlength = 32 - current_subnet_mask_bits_count;
  6. int subnet_length = current_subnet_mask_bits_count -
  7. standard_subnet_mask_bits_count;
  8. string hostpart = current_subnet_mask_bits.Substring
  9. (current_subnet_mask_bits_count, hostlength);
  10. string ip_bits = ip_to_bit_string(ipadresse);
  11. StringBuilder stringBuilder = new StringBuilder();
  12. for (int i = 0; i < hostpart.Length; i++)
  13. {
  14. if (i == hostpart.Length - 1) stringBuilder.Append("1");
  15. else stringBuilder.Append("0");
  16. }
  17. string net_id_plus_host = stringBuilder.ToString();
  18. if (subnet_length > 0)
  19. {
  20. string subnet_part = current_subnet_mask_bits.Substring
  21. (standard_subnet_mask_bits_count, subnet_length);
  22. string to_operat_ip_bits = ip_bits.Substring
  23. (standard_subnet_mask_bits_count, subnet_length);
  24. // var And_operation_result = Convert.ToByte(to_operat_ip_bits, 2) &
  25. // Convert.ToByte(subnet_part, 2);
  26. StringBuilder sb = new StringBuilder();
  27. for (int i = 0; i < subnet_part.Length; i++)
  28. sb.Append(Convert.ToUInt64(to_operat_ip_bits[i].ToString(), 2)
  29. & Convert.ToUInt64(subnet_part[i].ToString(), 2));
  30. for (int i = 0; i < hostpart.Length; i++)
  31. if (i == hostpart.Length - 1) sb.Append("1");
  32. else sb.Append("0");
  33. net_id_plus_host = sb.ToString();
  34. }
  35. //*****************
  36. int IPPartsLength = net_id_plus_host.Length / 8;
  37. string[] ipnewparts = new string[IPPartsLength];
  38. int j = 0;
  39. for (int i = 0; i < ipnewparts.Length; i++)
  40. {
  41. ipnewparts[i] = net_id_plus_host.Substring(j, 8);
  42. j = j + 8;
  43. }
  44. string[] ipparts = ipadresse.Split('.');
  45. j = ipparts.Length - 1;
  46. for (int i = ipnewparts.Length - 1; i >= 0; i--)
  47. {
  48. ipparts[j] = Convert.ToInt64(ipnewparts[i], 2).ToString();
  49. j--;
  50. }
  51. StringBuilder stringBuilder1 = new StringBuilder();
  52. for (int i = 0; i < ipparts.Length; i++)
  53. if (i == ipparts.Length - 1) stringBuilder1.Append(ipparts[i]);
  54. else stringBuilder1.Append(ipparts[i] + ".");
  55. return stringBuilder1.ToString();
  56. //*****************
  57. }

提取子网中的最后一个IP

要提取最后一个IP,我们遵循与第一个IP”相同的步骤,但我们更改了第二步,以便我们将所有主机位更改为1,除了我们保留为0的最后一个位和代码:

  1. public string getLastIpAdresse(string ipadresse,
  2. int standard_subnet_mask_bits_count, int current_subnet_mask_bits_count,
  3. string current_subnet_mask_bits)
  4. {
  5. int hostlength = 32 - current_subnet_mask_bits_count;
  6. int subnet_length = current_subnet_mask_bits_count -
  7. standard_subnet_mask_bits_count;
  8. string hostpart = current_subnet_mask_bits.Substring
  9. (current_subnet_mask_bits_count, hostlength);
  10. string ip_bits = ip_to_bit_string(ipadresse);
  11. StringBuilder stringBuilder = new StringBuilder();
  12. for (int i = 0; i < hostpart.Length; i++)
  13. {
  14. if (i == hostpart.Length - 1) stringBuilder.Append("0");
  15. else stringBuilder.Append("1");
  16. }
  17. string net_id_plus_host = stringBuilder.ToString();
  18. if (subnet_length > 0)
  19. {
  20. // string net_id_part = current_subnet_mask_bits.Substring
  21. // (standard_subnet_mask_bits_count, net_id_length).PadRight
  22. // (net_id_length + hostlength, '0');
  23. string subnet_part = current_subnet_mask_bits.Substring
  24. (standard_subnet_mask_bits_count, subnet_length);
  25. string to_operat_ip_bits = ip_bits.Substring
  26. (standard_subnet_mask_bits_count, subnet_length);
  27. // var And_operation_result = Convert.ToByte(to_operat_ip_bits, 2)
  28. // & Convert.ToByte(subnet_part, 2);
  29. StringBuilder sb = new StringBuilder();
  30. for (int i = 0; i < subnet_part.Length; i++)
  31. sb.Append(Convert.ToUInt64(to_operat_ip_bits[i].ToString(), 2)
  32. & Convert.ToUInt64(subnet_part[i].ToString(), 2));
  33. for (int i = 0; i < hostpart.Length; i++)
  34. if (i == hostpart.Length - 1) sb.Append("0");
  35. else sb.Append("1");
  36. net_id_plus_host = sb.ToString();
  37. }
  38. //*****************
  39. int IPPartsLength = net_id_plus_host.Length / 8;
  40. string[] ipnewparts = new string[IPPartsLength];
  41. int j = 0;
  42. for (int i = 0; i < ipnewparts.Length; i++)
  43. {
  44. ipnewparts[i] = net_id_plus_host.Substring(j, 8);
  45. j = j + 8;
  46. }
  47. string[] ipparts = ipadresse.Split('.');
  48. j = ipparts.Length - 1;
  49. for (int i = ipnewparts.Length - 1; i >= 0; i--)
  50. {
  51. ipparts[j] = Convert.ToInt64(ipnewparts[i], 2).ToString();
  52. j--;
  53. }
  54. StringBuilder stringBuilder1 = new StringBuilder();
  55. for (int i = 0; i < ipparts.Length; i++)
  56. if (i == ipparts.Length - 1) stringBuilder1.Append(ipparts[i]);
  57. else stringBuilder1.Append(ipparts[i] + ".");
  58. return stringBuilder1.ToString();
  59. //*****************
  60. }

https://www.codeproject.com/Articles/5344688/Network-Sniffer-and-Analyzer-Program-Part-1

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/162448
推荐阅读
相关标签
  

闽ICP备14008679号