怎么获取客户端socket发包和接包的内容?如股票软件,聊天软件等 怎样可以截取客户端软件发送和接收包?现在有个股票客户端软件 输入代码就可以得到股票信息我怎样才能知道客户端发送的包和接收包的内容有这样的代码或工具吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 拦截别人的包有两种方式:一、编写原始套接字,可以得到所有的连接的数据二、使用Api Hook,挂接其他程序的收发函数,然后自己处理数据后再转发。这种方式你可以参照《windows核心编程》,网上也可以查找api hook找到资料 可以用spi,相当于API Hook,把SPI的DLL替换成自己,你就能够在应用程序发包,收包前进行处理。 http://www.cnpaf.net/2004/8-4/215738.html下一个iris,抓取该端口的包,自己解析,如果加了密,可能就不容易了 我写的一个基与console的抓包程序,供参考:#include <winsock2.h>#include <ws2tcpip.h>#include <windows.h>typedef struct _TCP { WORD SrcPort; // 源端口 WORD DstPort; // 目的端口 DWORD SeqNum; // 顺序号 DWORD AckNum; // 确认号 BYTE DataOff; // TCP头长 BYTE Flags; // 标志(URG、ACK等) WORD Window; // 窗口大小 WORD Chksum; // 校验和 WORD UrgPtr; // 紧急指针 } TCP;typedef TCP *LPTCP;typedef TCP UNALIGNED * ULPTCP;typedef struct _IP { union { BYTE Version; // 版本 BYTE HdrLen; // IHL }; BYTE ServiceType; // 服务类型 WORD TotalLen; // 总长 WORD ID; // 标识 union{ WORD Flags; // 标志 WORD FragOff; // 分段偏移 }; BYTE TimeToLive; // 生命期 BYTE Protocol; // 协议 WORD HdrChksum; // 头校验和 DWORD SrcAddr; // 源地址 DWORD DstAddr; // 目的地址 BYTE Options; // 选项 } IP;typedef IP * LPIP;char *GetProtocolTxt(BYTE p){switch (p) { case IPPROTO_IP: return "IPPROTO_IP:"; case IPPROTO_ICMP: return "IPPROTO_ICMP:"; case IPPROTO_IGMP: return "IPPROTO_IGMP:"; case IPPROTO_GGP: return "IPPROTO_GGP:"; case IPPROTO_TCP: return "IPPROTO_TCP:"; case IPPROTO_PUP: return "IPPROTO_PUP:"; case IPPROTO_UDP: return "IPPROTO_UDP:"; case IPPROTO_IDP: return "IPPROTO_IDP:"; case IPPROTO_IPV6: return "IPPROTO_IPV6:"; case IPPROTO_ND: return "IPPROTO_ND:"; case IPPROTO_ICLFXBM: return "IPPROTO_ICLFXBM:"; case IPPROTO_RAW: return "IPPROTO_RAW:"; case IPPROTO_MAX: return "IPPROTO_MAX:"; case IPPORT_ECHO: return "IPPORT_ECHO:"; case IPPORT_DISCARD: return "IPPORT_DISCARD:"; case IPPORT_SYSTAT: return "IPPORT_SYSTAT:"; case IPPORT_DAYTIME: return "IPPORT_DAYTIME:"; case IPPORT_NETSTAT: return "IPPORT_NETSTAT:"; case IPPORT_FTP: return "IPPORT_FTP:"; case IPPORT_TELNET: return "IPPORT_TELNET:"; case IPPORT_SMTP: return "IPPORT_SMTP:"; case IPPORT_TIMESERVER: return "IPPORT_TIMESERVER:"; case IPPORT_NAMESERVER: return "IPPORT_NAMESERVER:"; case IPPORT_WHOIS: return "IPPORT_WHOIS:"; case IPPORT_MTP: return "IPPORT_MTP:"; case IPPORT_TFTP: return "IPPORT_TFTP:"; case IPPORT_FINGER: return "IPPORT_FINGER:"; case IPPORT_TTYLINK: return "IPPORT_TTYLINK:"; case IPPORT_SUPDUP: return "IPPORT_SUPDUP:"; case IPPORT_EXECSERVER: return "IPPORT_EXECSERVER:"; case IPPORT_LOGINSERVER: return "IPPORT_LOGINSERVER:"; case IPPORT_CMDSERVER: return "IPPORT_CMDSERVER:"; case IPPORT_EFSSERVER: return "IPPORT_EFSSERVER:"; case IPPORT_RESERVED: return "IPPORT_RESERVED:"; case IMPLINK_IP: return "IMPLINK_IP:"; case IMPLINK_LOWEXPER: return "IMPLINK_LOWEXPER:"; default: return "UNNOW"; }}#define TRACE printf#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)void main(){ // 检查 Winsock 版本号,WSAData为WSADATA结构对象 WSADATA wsaData; SOCKET sock ; int flag=true; char LocalName[100]; hostent *pHost; SOCKADDR_IN addr_in; char RecvBuf[4096]; #define BUFFER_SIZE 4096 IP ip; TCP tcp; WSAStartup(MAKEWORD(2, 2),&wsaData); // 创建原始套接字 sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); // 设置IP头操作选项,其中flag 设置为ture,亲自对IP头进行处理 setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag)); // 获取本机名 gethostname((char*)LocalName, sizeof(LocalName)-1); // 获取本地 IP 地址 pHost = gethostbyname((char*)LocalName); // 填充SOCKADDR_IN结构 addr_in.sin_addr = *(in_addr *)pHost->h_addr_list[0]; //IP addr_in.sin_family = AF_INET; addr_in.sin_port = htons(57274); // 把原始套接字sock 绑定到本地网卡地址上 bind(sock, (PSOCKADDR)&addr_in, sizeof(addr_in)); // dwValue为输入输出参数,为1时执行,0时取消 DWORD dwValue = 1; // 设置 SOCK_RAW 为SIO_RCVALL,以便接收所有的IP包。其中SIO_RCVALL // 的定义为: #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1) ioctlsocket(sock, SIO_RCVALL, &dwValue); // 前面的工作基本上都是对原始套接字进行设置,在将原始套接字设置完毕,使其能按预期目的工作时,就可以通过recv()函数从网卡接收数据了,接收到的原始数据包存放在缓存RecvBuf[]中,缓冲区长度BUFFER_SIZE定义为65535。然后就可以根据前面对IP数据段头、TCP数据段头的结构描述而对捕获的数据包进行分析: int i,j; unsigned char c; while (true) { // 接收原始数据包信息 memset( RecvBuf,0x0,BUFFER_SIZE); int ret = recv(sock, RecvBuf, BUFFER_SIZE, 0); if (ret > 0) { // 对数据包进行分析,并输出分析结果 ip = *(IP*)RecvBuf; tcp = *(TCP*)(RecvBuf + ip.HdrLen); if (ip.DstAddr!=0xffffffffu)// if (ip.DstAddr==0x7200A8C0u)// if (ip.SrcAddr ==0x7200A8C0u) { TRACE("协议: %s\n",GetProtocolTxt(ip.Protocol)); TRACE("IP源地址: %s\n",inet_ntoa(*(in_addr*)&ip.SrcAddr)); TRACE("IP目标地址: %s\n",inet_ntoa(*(in_addr*)&ip.DstAddr)); TRACE("TCP源端口号: %d\n",tcp.SrcPort); TRACE("TCP目标端口号:%d\n",tcp.DstPort); TRACE("数据包长度: %d\n",ntohs(ip.TotalLen)); TRACE("长度:%x %x %x %x\n",ip.HdrLen,tcp.DataOff,sizeof(ip),sizeof(tcp)); TRACE("长度:%d %d %d %d\n\n",ip.HdrLen,tcp.DataOff,sizeof(ip),sizeof(tcp)); printf("0000:"); for(i=0;i<ntohs(ip.TotalLen);i++) { printf("%02x ", (unsigned char )RecvBuf[i]); if ((i+1)%16==0) { putchar(' '); for(j=0;j<16;j++) { c= RecvBuf[i-(15-j)]; if (isprint(c)) putchar(c); else putchar('.'); } printf("\n%04x:",i+1); } } if (((i=ntohs(ip.TotalLen)%16))!=0) { for(j=0;j<16-i;j++) printf(" "); putchar(' '); for(j=0;j<i;j++) { c= RecvBuf[ntohs(ip.TotalLen)-i+j]; if (isprint(c)) putchar(c); else putchar('.'); } } printf("\n"); } } } getchar();} 用RAW SOCKET吧,如果不是特别情况就不要替换ws2_32.dll了,搞这个东西比较麻烦,如果搞不好其他的网络程序可能运行不正常,要是只是用抓包这个功能的话就不用自己做工具了,直接在网上找一抓包工具,有些还附带有包分析功能很优秀的!! 一、编写原始套接字,可以得到所有的连接的数据二、使用Api Hook,挂接其他程序的收发函数,然后自己处理数据后再转发。这种方式你可以参照三、SNIFFER四、替换WINDOWS的winsock2.dll ,然后所有的数据都可知道 要将一个图形自动旋转和移动到另一个图形中,用什么方法比较好?谢谢! ATL 框架中的 一个小问题, 找不到定义 关于内存释放的问题? 如何显示gif之类的动画图片 一个关于CList的奇怪问题 我想阅读C++类库源代码。有阅读经验的朋友能给此建议吗? 请看看调用函数为什么没有得到值? C++编写求一幅图像矩阵熵的代码,大侠们帮帮改改吧 如果我把套接字的端口号,设为0有什么意思? 如何实现抓取标准usb设备的某一个消息呢? 用WinInet internetsession类下载网页,网页是gzip格式,网页内容出现怪码如何解决??? 如何计算在指定CDC中显示的字符串的宽度??
一、编写原始套接字,可以得到所有的连接的数据
二、使用Api Hook,挂接其他程序的收发函数,然后自己处理数据后再转发。这种方式你可以参照《windows核心编程》,网上也可以查找api hook找到资料
#include <ws2tcpip.h>
#include <windows.h>
typedef struct _TCP {
WORD SrcPort; // 源端口
WORD DstPort; // 目的端口
DWORD SeqNum; // 顺序号
DWORD AckNum; // 确认号
BYTE DataOff; // TCP头长
BYTE Flags; // 标志(URG、ACK等)
WORD Window; // 窗口大小
WORD Chksum; // 校验和
WORD UrgPtr; // 紧急指针
} TCP;
typedef TCP *LPTCP;
typedef TCP UNALIGNED * ULPTCP;typedef struct _IP {
union {
BYTE Version; // 版本
BYTE HdrLen; // IHL
};
BYTE ServiceType; // 服务类型
WORD TotalLen; // 总长
WORD ID; // 标识
union{ WORD Flags; // 标志
WORD FragOff; // 分段偏移
};
BYTE TimeToLive; // 生命期
BYTE Protocol; // 协议
WORD HdrChksum; // 头校验和
DWORD SrcAddr; // 源地址
DWORD DstAddr; // 目的地址
BYTE Options; // 选项
} IP;
typedef IP * LPIP;
char *GetProtocolTxt(BYTE p)
{switch (p)
{
case IPPROTO_IP:
return "IPPROTO_IP:";
case IPPROTO_ICMP:
return "IPPROTO_ICMP:";
case IPPROTO_IGMP:
return "IPPROTO_IGMP:";
case IPPROTO_GGP:
return "IPPROTO_GGP:";
case IPPROTO_TCP:
return "IPPROTO_TCP:";
case IPPROTO_PUP:
return "IPPROTO_PUP:";
case IPPROTO_UDP:
return "IPPROTO_UDP:";
case IPPROTO_IDP:
return "IPPROTO_IDP:";
case IPPROTO_IPV6:
return "IPPROTO_IPV6:";
case IPPROTO_ND:
return "IPPROTO_ND:";
case IPPROTO_ICLFXBM:
return "IPPROTO_ICLFXBM:";
case IPPROTO_RAW:
return "IPPROTO_RAW:";
case IPPROTO_MAX:
return "IPPROTO_MAX:";
case IPPORT_ECHO:
return "IPPORT_ECHO:";
case IPPORT_DISCARD:
return "IPPORT_DISCARD:";
case IPPORT_SYSTAT:
return "IPPORT_SYSTAT:";
case IPPORT_DAYTIME:
return "IPPORT_DAYTIME:";
case IPPORT_NETSTAT:
return "IPPORT_NETSTAT:";
case IPPORT_FTP:
return "IPPORT_FTP:";
case IPPORT_TELNET:
return "IPPORT_TELNET:";
case IPPORT_SMTP:
return "IPPORT_SMTP:";
case IPPORT_TIMESERVER:
return "IPPORT_TIMESERVER:";
case IPPORT_NAMESERVER:
return "IPPORT_NAMESERVER:";
case IPPORT_WHOIS:
return "IPPORT_WHOIS:";
case IPPORT_MTP:
return "IPPORT_MTP:";
case IPPORT_TFTP:
return "IPPORT_TFTP:";
case IPPORT_FINGER:
return "IPPORT_FINGER:";
case IPPORT_TTYLINK:
return "IPPORT_TTYLINK:";
case IPPORT_SUPDUP:
return "IPPORT_SUPDUP:";
case IPPORT_EXECSERVER:
return "IPPORT_EXECSERVER:";
case IPPORT_LOGINSERVER:
return "IPPORT_LOGINSERVER:";
case IPPORT_CMDSERVER:
return "IPPORT_CMDSERVER:";
case IPPORT_EFSSERVER:
return "IPPORT_EFSSERVER:";
case IPPORT_RESERVED:
return "IPPORT_RESERVED:";
case IMPLINK_IP:
return "IMPLINK_IP:";
case IMPLINK_LOWEXPER:
return "IMPLINK_LOWEXPER:";
default:
return "UNNOW";
}
}#define TRACE printf#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)void main()
{
// 检查 Winsock 版本号,WSAData为WSADATA结构对象
WSADATA wsaData;
SOCKET sock ;
int flag=true;
char LocalName[100];
hostent *pHost;
SOCKADDR_IN addr_in;
char RecvBuf[4096];
#define BUFFER_SIZE 4096
IP ip;
TCP tcp;
WSAStartup(MAKEWORD(2, 2),&wsaData);
// 创建原始套接字
sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
// 设置IP头操作选项,其中flag 设置为ture,亲自对IP头进行处理
setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag));
// 获取本机名
gethostname((char*)LocalName, sizeof(LocalName)-1);
// 获取本地 IP 地址
pHost = gethostbyname((char*)LocalName);
// 填充SOCKADDR_IN结构
addr_in.sin_addr = *(in_addr *)pHost->h_addr_list[0]; //IP
addr_in.sin_family = AF_INET;
addr_in.sin_port = htons(57274);
// 把原始套接字sock 绑定到本地网卡地址上
bind(sock, (PSOCKADDR)&addr_in, sizeof(addr_in));
// dwValue为输入输出参数,为1时执行,0时取消
DWORD dwValue = 1;
// 设置 SOCK_RAW 为SIO_RCVALL,以便接收所有的IP包。其中SIO_RCVALL
// 的定义为: #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
ioctlsocket(sock, SIO_RCVALL, &dwValue); // 前面的工作基本上都是对原始套接字进行设置,在将原始套接字设置完毕,使其能按预期目的工作时,就可以通过recv()函数从网卡接收数据了,接收到的原始数据包存放在缓存RecvBuf[]中,缓冲区长度BUFFER_SIZE定义为65535。然后就可以根据前面对IP数据段头、TCP数据段头的结构描述而对捕获的数据包进行分析:
int i,j;
unsigned char c;
while (true)
{
// 接收原始数据包信息
memset( RecvBuf,0x0,BUFFER_SIZE);
int ret = recv(sock, RecvBuf, BUFFER_SIZE, 0);
if (ret > 0)
{
// 对数据包进行分析,并输出分析结果
ip = *(IP*)RecvBuf;
tcp = *(TCP*)(RecvBuf + ip.HdrLen);
if (ip.DstAddr!=0xffffffffu)
// if (ip.DstAddr==0x7200A8C0u)
// if (ip.SrcAddr ==0x7200A8C0u)
{
TRACE("协议: %s\n",GetProtocolTxt(ip.Protocol));
TRACE("IP源地址: %s\n",inet_ntoa(*(in_addr*)&ip.SrcAddr));
TRACE("IP目标地址: %s\n",inet_ntoa(*(in_addr*)&ip.DstAddr));
TRACE("TCP源端口号: %d\n",tcp.SrcPort);
TRACE("TCP目标端口号:%d\n",tcp.DstPort);
TRACE("数据包长度: %d\n",ntohs(ip.TotalLen));
TRACE("长度:%x %x %x %x\n",ip.HdrLen,tcp.DataOff,sizeof(ip),sizeof(tcp));
TRACE("长度:%d %d %d %d\n\n",ip.HdrLen,tcp.DataOff,sizeof(ip),sizeof(tcp)); printf("0000:");
for(i=0;i<ntohs(ip.TotalLen);i++)
{
printf("%02x ", (unsigned char )RecvBuf[i]);
if ((i+1)%16==0)
{
putchar(' ');
for(j=0;j<16;j++)
{
c= RecvBuf[i-(15-j)];
if (isprint(c))
putchar(c);
else
putchar('.'); }
printf("\n%04x:",i+1);
}
}
if (((i=ntohs(ip.TotalLen)%16))!=0)
{
for(j=0;j<16-i;j++)
printf(" ");
putchar(' ');
for(j=0;j<i;j++)
{
c= RecvBuf[ntohs(ip.TotalLen)-i+j];
if (isprint(c))
putchar(c);
else
putchar('.'); }
}
printf("\n");
}
}
}
getchar();}
二、使用Api Hook,挂接其他程序的收发函数,然后自己处理数据后再转发。这种方式你可以参照
三、SNIFFER
四、替换WINDOWS的winsock2.dll ,然后所有的数据都可知道