打造自己的网络抓包工具

  1 // CaptureData.cpp : 定义控制台应用程序的入口点。
  2 //
  3
  4 #include "stdafx.h"
  5 #include <WinSock2.h>
  6 #include <filesystem>
  7 #include <mstcpip.h>//SIO_RCVALL头文件
  8
  9 #pragma comment(lib,"WS2_32.lib")//加载%system32 目录下的ws2_32.dll
 10 #define OK 0
 11 #define ERR -1
 12
 13 #define HOST_NAME_MAX 100
 14 #define MY_PORT 10000//大于1024,,以下的端口大部分被系统占用
 15 #define BUFF_LEN 65536//为啥是6结尾呢,
 16
 17 //收到的包,是网络字节序(大字节序)
 18 typedef struct IP_HEADER
 19 {
 20     char cVer : 4;//位域,char占8个比特位,这只要4个位的意思
 21     char cHeadLen : 4;
 22     char cTos;
 23     unsigned short usLen;
 24     unsigned short usIdent;
 25     unsigned short usFlag : 3;
 26     unsigned short usOffset : 13;
 27     char cTTL;
 28     char cProtocol;//用的什么协议
 29     unsigned short usChkSum;
 30     unsigned int uiSrcIp;
 31     unsigned int uiDstIp;
 32 }IP_HEADER_S;
 33
 34 void PrintData(char szBuf[], int iLen)
 35 {
 36     //printf("RCV:%s\n", szBuf);
 37     //打印16进制数据,可以看到内存是怎么存的,每个比特位是什么可以更清楚
 38     int i;
 39     IP_HEADER_S *pstHeader;
 40     SOCKADDR_IN stAddr = {};
 41     pstHeader = (IP_HEADER_S*)szBuf;
 42
 43     //只要什么包的意思,可以试试自己ping自己,能看到4进4出的数据
 44     if (pstHeader->cProtocol != IPPROTO_ICMP)return;
 45
 46     printf("RCV:");
 47     printf("Version:%d\n", pstHeader->cVer);
 48     printf("HeaderLen:%d\n", pstHeader->cHeadLen);
 49     printf("DataLen:%d\n", ntohs(pstHeader->usLen));//网络包的int转换
 50     printf("TTL:%d\n", pstHeader->cTTL);
 51     printf("FLAG_OFFSET:[%d,%d]\n", pstHeader->usFlag, pstHeader->usOffset);
 52     printf("Protocol:%d\n", pstHeader->cProtocol);
 53
 54     stAddr.sin_addr.s_addr = pstHeader->uiSrcIp;
 55     //inet_ntoa()//把in_addr转成字符串IP
 56     printf("Source IP:%s\n", inet_ntoa(stAddr.sin_addr));
 57
 58     stAddr.sin_addr.s_addr = pstHeader->uiDstIp;
 59     printf("Dest IP:%s\n", inet_ntoa(stAddr.sin_addr));
 60
 61     //for (i = 0; i < iLen; ++i)
 62     //{
 63     //    //一个字节的字符,asc范围是0x0 到 0xff
 64     //    printf("%x02x ", szBuf[i] & 0xff);
 65     //}
 66
 67     printf("\n");
 68 }
 69
 70 int CaptureData()
 71 {
 72     WSADATA stWsa;
 73     char szHostName[HOST_NAME_MAX] = {};
 74     HOSTENT *pHost;
 75     SOCKADDR_IN strAddr = { 0 };//抓包地址
 76     SOCKET iFd;
 77     int iRet;
 78     DWORD dwInBuff = 1;
 79     DWORD dwOutBuff;
 80     DWORD dwRet;
 81     char szBuf[BUFF_LEN] = { 0 };
 82
 83     //0x0202表示动态链接库的版本号
 84     if (WSAStartup(0x0202, &stWsa) != OK)//打开动态链接库,使网络函数可用
 85     {
 86         return ERR;
 87     }
 88
 89     //获取自己的ip地址,抓包发到这个ip地址的包
 90     //1获取主机名,2通过主机名获取ip
 91     if (gethostname(szHostName, HOST_NAME_MAX) != OK)
 92     {
 93         WSACleanup();
 94         return ERR;
 95     }
 96
 97     pHost = gethostbyname(szHostName);
 98
 99     printf("MYIP:%d.%d.%d.%d\n", pHost->h_addr_list[0][0] & 0xff, pHost->h_addr_list[0][1] & 0xff, pHost->h_addr_list[0][2] & 0xff, pHost->h_addr_list[0][3] & 0xff);//& 0xff的作用对ip地址转%d的int后的前面部分无用字节去掉
100
101     strAddr.sin_family = AF_INET;
102     strAddr.sin_addr.s_addr = *(unsigned long*)pHost->h_addr;//对字符数字强制转换
103     strAddr.sin_port = htons(MY_PORT);
104
105     //SOCK_RAW 抓取底层数据包(原始数据流)
106     iFd = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
107     if (iFd < 0)
108     {
109         WSACleanup();
110         return ERR;
111     }
112
113     if (bind(iFd, (SOCKADDR*)&strAddr, sizeof(SOCKADDR)) != OK)
114     {
115         WSACleanup();
116         closesocket(iFd);
117         return ERR;
118     }
119
120     //定义收包的规则
121     iRet = WSAIoctl(iFd, SIO_RCVALL, &dwInBuff, sizeof(dwInBuff), &dwOutBuff, sizeof(dwOutBuff), &dwRet, NULL, NULL);
122     if (iRet != OK)
123     {
124         WSACleanup();
125         closesocket(iFd);
126         return ERR;
127     }
128
129     while (true)
130     {
131         memset(szBuf, 0, BUFF_LEN);
132
133         iRet = recv(iFd, szBuf, BUFF_LEN, 0);//返回接收数据的长度
134         if (iRet < 0)
135         {
136             break;
137         }
138         else
139         {
140             PrintData(szBuf, iRet);
141         }
142     }
143
144
145
146     closesocket(iFd);
147     WSACleanup();
148     return 0;
149 }
150
151 int _tmain(int argc, _TCHAR* argv[])
152 {
153     CaptureData();
154     system("pause");
155     return 0;
156 }
时间: 2024-10-12 00:07:27

打造自己的网络抓包工具的相关文章

HttpWatch网络抓包工具的使用

HttpWatch网络抓包工具是专为IE浏览器集成的一款网络拽包工具. 是一款强大的网页数据分析软件,是最好用的抓包工具,httpwatch可以抓到上传视屏图片的包,一般的抓包软件是抓不到的.打开IE浏览器,选择工具“再选择“HttpWatch Professional”即可.建议用专业版进行网络数据抓取. 网络爬虫是捜索引擎抓取系统的重要组成部分.爬虫技术可以应用在很多方面,当然是好的方面.用HttpWatch结合网络爬虫技术就可以很轻松的实现网络数据的抓取. 然后实现一些应用. (1)下载H

网络抓包工具Charles的介绍与使用

在复杂的App开发过程中,我们会涉及各种复杂的网络操作,各种API的调用和数据接收.如果我们只是通过控制台来查看网络的输入输出,就会非常麻烦.在Mac上有一款非常优秀的网络抓包工具--Charles,在iOS开发中也是常常用到.今天我们就来介绍如何安装使用Charles.关于Charles安装包.破解包和证书我已经上传至网盘:http://pan.baidu.com/s/1numMoTr    .大家可以下载直接安装.操作步骤如下: (1)直接安装dmg文件,安装过程很简单,就不赘述了.由于Ch

网络抓包工具-Wireshark学习资料

wireshark一个非常牛逼的网络抓包工具.转载一系列博文 一站式学习Wireshark(一):Wireshark基本用法 一站式学习Wireshark(二):应用Wireshark观察基本网络协议 一站式学习Wireshark(三):应用Wireshark IO图形工具分析数据流 一站式学习Wireshark(四):网络性能排查之TCP重传与重复ACK 一站式学习Wireshark(五):TCP窗口与拥塞处理 一站式学习Wireshark(六):狙击网络高延时点 一站式学习Wireshark

对几款网络抓包工具的评测

对几款网络抓包工具的评测 by 拉登哥哥 最近在写个CMD远控 写着写着 想在服务端上做点手脚 都知道杀软误报 特别是黑软大部分都报毒 但实际上是正常的 对此可能部分人并不装杀软 基本上靠自己分析软件是否安全 1 低级点的 用相关工具 检测不能真的完全保证程序无毒  也没啥技术含量 原因是 可能你正在检测时 后门没激活(比如 我设置晚上12点才向外连接等) 你在白天或其它时间检测我的工具 可能没发现任何异常 晚上你开工具做事的时候 后门也跟着激活了 哈哈 这方法 实际中还真有人这么看 以前某个木

网络抓包工具 Fiddler

网络抓包工具 Fiddler 下载网址 http://www.telerik.com/fiddler 简单介绍 Fiddler是一个http协议调试代理工具,它能够记录并检查全部你的电脑和互联网之间的http通讯,设置断点.查看全部的"进出"Fiddler的数据(指cookie,html,js,css等文件,这些都能够让你胡乱改动的意思). Fiddler 要比其它的网络调试器要更加简单.由于它不只暴露http通讯还提供了一个用户友好的格式. 能够在调试HTTP中使用.也能够用来进行爬

iOS系统设备网络抓包工具介绍:越狱和不越狱的办法

对终端进行抓包是客户端测试中的一种重要手段.本文主要介绍了ios设备(iphone.ipad和ipodtouch)的几种常用的抓包方法. 一.准备条件 需要进行抓包的设备必须经过root,俗称越狱,主要利用redsn0w和各种iOSFirmwares进行,如越狱不用更换固件版本,只需使用 redsn0w安装Cydia即可,网上有详细教程,此处省略.安装完毕,在3G或WiFi环境下启动Cydia,确认身份为“开发者”,如下图. 通过Cydia源,用户可以下载和安装比appstore更高权限的软件,

模仿Wireshark网络抓包工具实现---c++

最近在用Wireshark抓包工具的时候,老感觉这东西用起来很简单,功能强大,所以想了解他的实现原理,我就自己好奇写了一个实现基本功能的demo吧. 其实叫抓包工具,其实就是抓取流经自己网卡的所有ip包,我们能够按照ip包的协议解析不就行了. 实现的核心在这里: 1 //创建SOCKET 2 sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP); 3 if (sock == INVALID_SOCKET) 4 { 5 cout << WSAGetLastEr

Wireshark 网络抓包工具Wireshark的使用

阅读目录 wireshark介绍 wireshark不能做的 wireshark VS Fiddler 同类的其他工具 什么人会用到wireshark wireshark 开始抓包 wireshark 窗口介绍 wireshark 显示过滤 保存过滤 过滤表达式 封包列表(Packet List Pane) 封包详细信息 (Packet Details Pane) wireshark与对应的OSI七层模型 TCP包的具体内容 实例分析TCP三次握手过程 wireshark介绍 wireshark

网络抓包工具的使用

随着时代的发展,网络显得越来越重要了,很多信息的交互,都通过网络来进行了.比如说,各种类似于"俺来也"的app需要将信息传送到后台.再比如,我们大多时候需要借助形如"乐动力","悦跑圈"等工具将数据传送到后台,进而同步到微信等社交平台.网络信息交互的频繁,让网络技术变得更加重要. 既然数据都是以包的形式进行传送的,我们能不能通过模拟别人或者app通过模拟数据包的形式,传递任意我们想传送的数据呢?理论上是可行的.但是,事实上,由于很多软件加密机制的