黑客防线,在攻与防的对立统一中寻求突破!2001年创刊的黑客技术专业刊物!

设为首页
收藏本站
联系我们
网站导航

黑客文章 - 黑客编程 - 浏览 - 原始套接字透析之综合实例:网络黑手

原始套接字透析之综合实例:网络黑手

黑客 发布日期:2008-10-26 0:03:46 共有 396 人次浏览
原始套接字透析之综合实例:网络黑手

为了给本系列文章一个具体的实例,笔者编写了"网络黑手"这样一个免费软件。它是一种融合了目前许多类似工具软件功能的具有超强攻击/侦听能力的流氓软件,并可能将成为又一个臭名昭著的破坏性工具,它的功能包括:

  1. 检测本地网络适配器列表并选择一个工作适配器;

  2. 检测局域网内指定IP范围内所有节点的IP地址、MAC地址信息,并列表显示;
  
  3. 监听局域网上某节点的所有收发信息;

  4. 剪断局域网上某机器与网关的联络,从而让其不能上网;

  5. 不停向局域网内某台主机发送ARP报文,让其不断提示"IP冲突",烦恼不已。

  如果你所在的局域网内有人使用此软件攻击你的计算机,你将变得痛苦不堪。所以,笔者不得不声明的是编写本软件的目的不在于要荼毒生灵、贻害人间,而仅仅是为了本系列教程教学和广大读者掌握黑客攻防技术的需要。任何个人或组织使用本软件进行破坏行为,都应受到道德的谴责或可能的法律制裁。

  尽管如此,为了防范于未然,笔者在研制"网络黑手"这一毒药的同时,也精心研制了其相应的解药――"网络黑手终结者",这一软件也是免费的。在你的网络内,如果有谁使用了"网络黑手",你将可以用"网络黑手终结者"直接终结之!

  点击此处下载网络黑手

  网络黑手程序的运行最好先安装winpcap,请在此地址下载:http://www.winpcap.org/。

  1、网络黑手的实现

  网络黑手0.1版(限于时间的原因,在本教程中我们给出的仅仅是一个教学版本,所以版本号仅为0.1),其界面如下:


  界面的左上角用于设置监控的目标范围(IP地址,如192.168.1.1~192.168.1.254,只能输入与本机处于同一子网的IP地址)、选择本地网卡(对于安装了多块网卡的用户),按钮"开始"用于启动监控和其他操作,启动成功后"开始"按钮会变为"停止"。

  界面的左下角列出活动的与本机处于同一子网机器的主机名、IP地址、MAC地址,在相应的主机上双击"Sniffer"和"ARP欺骗"项目可以启动和停止对该主机的嗅探和ARP欺骗(会切断该机的外网出口)。

  与之对应的数据结构为:

typedef struct tagHostList
{
 unsigned long ip;
 char mac[6];
 bool sniffer;
 bool arpCheat;
 bool ipConflict;
} HostList;


  界面的右边即为监控到报文的源IP地址、目的IP地址、协议、源端口号、目的端口号以及报文的长度,而表格的最后一行将对应显示相关IP报文的数据。为了简化软件的设计和减少程序对内存的占用,在Sniffer时,实际缓存的数据包MAX_PACKET最大为30,超过的会自动被覆盖。

  与之对应的数据结构为:

typedef struct tagPacketList
{
 unsigned long srcIp;
 unsigned long desIp;
 unsigned char protocol;
 unsigned long srcPort;
 unsigned long desPort;
 unsigned long len;
 char data[256];
}PacketList;


  我们需要在对话框的初始化函数中构造上述界面中的表格项目,相关源代码如下:

BOOL CNetHackerDlg::OnInitDialog()
{
 CDialog::OnInitDialog();
 // IDM_ABOUTBOX must be in the system command range.
 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
 ASSERT(IDM_ABOUTBOX < 0xF000);

 CMenu* pSysMenu = GetSystemMenu(FALSE);
 if (pSysMenu != NULL)
 {
  CString strAboutMenu;
  strAboutMenu.LoadString(IDS_ABOUTBOX);
  if (!strAboutMenu.IsEmpty())
  {
   pSysMenu->AppendMenu(MF_SEPARATOR);
   pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  }
 }

 // Set the icon for this dialog. The framework does this automatically
 // when the application's main window is not a dialog
 SetIcon(m_hIcon, TRUE); // Set big icon
 SetIcon(m_hIcon, FALSE); // Set small icon

 // TODO: Add extra initialization here
 int i=0;
 //…

 m_hostList.Create(CRect(12,115,435,466),this, 1000,WS_BORDER |WS_VISIBLE |WS_VSCROLL|WS_CHILD);
 m_hostList.SetScrollRange(1,0,351);
 m_hostList.EnableScrollBar(ESB_ENABLE_BOTH);

 m_hostList.SetCols (5);
 m_hostList.SetRows (256);
 for (i = 0; i < 256; i ++)
 {
  m_hostList.SetRowHeight (i, 13);
  for(int j =0;j<5;j++)
  {
   m_hostList.SetAlignment(i,j,DT_CENTER);
  }
 }

 m_hostList.SetColWidth (0, 100);
 m_hostList.SetColWidth (1, 130);
 m_hostList.SetColWidth (2, 50);
 m_hostList.SetColWidth (3, 55);
 m_hostList.SetColWidth (4, 70);

 m_hostList.SetText (0,0,"IP地址");
 m_hostList.SetText (0,1,"MAC地址");
 m_hostList.SetText (0,2,"Sniffer");
 m_hostList.SetText (0,3,"ARP欺骗");
 m_hostList.SetText (0,4,"报告IP冲突");

 m_packetList.Create(CRect(444,26,768,466),this, 1000);
 m_packetList.SetCols (6);
 m_packetList.SetRows (31);
 for (i = 0; i < 30; i ++)
 {
  m_packetList.SetRowHeight (i, 13);
  for(int j =0;j<6;j++)
  {
   m_packetList.SetAlignment(i,j,DT_CENTER);
  }
 }
 m_packetList.SetRowHeight (i, 47);

 m_packetList.SetColWidth (0, 75);
 m_packetList.SetColWidth (1, 75);
 m_packetList.SetColWidth (2, 32);
 m_packetList.SetColWidth (3, 45);
 m_packetList.SetColWidth (4, 55);
 m_packetList.SetColWidth (5, 40);
 m_packetList.SetText (0,0,"源IP");
 m_packetList.SetText (0,1,"目的IP");
 m_packetList.SetText (0,2,"协议");
 m_packetList.SetText (0,3,"源端口");
 m_packetList.SetText (0,4,"目的端口");
 m_packetList.SetText (0,5,"长度");
 m_packetList.JoinCells (30,0,30,5);

 mailDlg = this;
 return TRUE; // return TRUE unless you set the focus to a control
}


  右边表格中最后的一行是多列合并的结果,完成此合并的代码为:

int XTable::JoinCells (int startRow, int startCol, int endRow, int endCol)
{
 if (startRow < 0 || startRow >= rows) return -1;
 if (endRow < 0 || startRow >= rows) return -1;

 if (startCol < 0 || startCol >= cols) return -1;
 if (endCol < 0 || endCol >= cols) return -1;

 if (startRow > endRow || startCol > endCol) return -1;

 for (int i = startRow; i <= endRow; i++)
 {
  for (int j = startCol; j <=endCol; j++)
  {
   cells [i * cols + j].SetSpan(0,0);
  }
 }
 cells [startRow * cols + startCol].SetSpan(endRow - startRow+1, endCol - startCol+1);
 return 0;
}


  其"反函数"为:

int XTable::UnjoinCells (int row, int col)
{
 if (row < 0 || row >= this->rows) return -1;
 if (col < 0 || col >= this->cols) return -1;

 if (cells [row * cols + col].rowSpan <= 1 && cells [row * cols + col].colSpan <= 1 )
  return -1;

 for (int i = row; i <= row + cells [row * cols + col].rowSpan; i++)
 {
  for (int j = col; j <= cells [row * cols + col].colSpan; j++)
  {
   cells[i*cols+j] = defaultCell;
   cells [i * cols + j].SetSpan(1,1);
  }
 }
 return 0;
}


  程序中的IDC_ADAPTERLIST_COMBO控件用于提供用户选择本地适配器,获得本地适配器列表的代码如下(也处于对话框的初始化函数中):

char errbuf[PCAP_ERRBUF_SIZE];
/* 取得列表 */
if (pcap_findalldevs(&alldevs, errbuf) == - 1)
{
 AfxMessageBox("获得网卡列表失败!\n");
 GetDlgItem(IDC_STARTSTOP_BUTTON)->EnableWindow(FALSE);
}

/* 输出列表 */
for (d = alldevs; d; d = d->next)
{
 CString str(d->name);
 if (str.Find("\\Device\\NPF_Generic", 0) == - 1)
  m_adapterList.AddString(str);
}
所属分类: 黑客编程     网摘收藏: Google 雅虎 百度 POCO 365key 和讯 天极