怎么获取客户端socket发包和接包的内容?如股票软件,聊天软件等
怎样可以截取客户端软件发送和接收包?
现在有个股票客户端软件 输入代码就可以得到股票信息
我怎样才能知道客户端发送的包和接收包的内容
有这样的代码或工具吗?
问题点数:0、回复次数:9Top
1 楼clicksoft(好啊)回复于 2005-04-04 14:36:19 得分 0
抓包软件啊Top
2 楼signoft(晴天)回复于 2005-04-04 15:05:01 得分 0
拦截别人的包有两种方式:
一、编写原始套接字,可以得到所有的连接的数据
二、使用Api Hook,挂接其他程序的收发函数,然后自己处理数据后再转发。这种方式你可以参照《windows核心编程》,网上也可以查找api hook找到资料Top
3 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-04-04 15:07:55 得分 0
snifferTop
4 楼jhonguy()回复于 2005-04-04 15:13:32 得分 0
可以用spi,相当于API Hook,把SPI的DLL替换成自己,你就能够在应用程序发包,收包前进行处理。Top
5 楼Caps77(厉兵秣马)回复于 2005-04-04 15:20:08 得分 0
http://www.cnpaf.net/2004/8-4/215738.html
下一个iris,抓取该端口的包,自己解析,如果加了密,可能就不容易了Top
6 楼keiy()回复于 2005-04-04 15:45:06 得分 0
我写的一个基与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();
}
Top
7 楼Practise_Think(时代“过客”)回复于 2005-04-04 19:05:54 得分 0
用RAW SOCKET吧,如果不是特别情况就不要替换ws2_32.dll了,搞这个东西比较麻烦,如果搞不好其他的网络程序可能运行不正常,要是只是用抓包这个功能的话就不用自己做工具了,直接在网上找一抓包工具,有些还附带有包分析功能很优秀的!!Top
8 楼somexing(somexing)回复于 2005-04-05 09:02:40 得分 0
直接用SnifferTop
9 楼goodheartppl(goodheart)回复于 2005-04-07 09:45:24 得分 0
一、编写原始套接字,可以得到所有的连接的数据
二、使用Api Hook,挂接其他程序的收发函数,然后自己处理数据后再转发。这种方式你可以参照
三、SNIFFER
四、替换WINDOWS的winsock2.dll ,然后所有的数据都可知道Top




