qqsniff.c
上传用户:leadtec
上传日期:2013-04-05
资源大小:10k
文件大小:6k
源码类别:

网络截获/分析

开发平台:

C/C++

  1. #include <windows.h>
  2. #include <commctrl.h>
  3. #include <winsock2.h>
  4. #include "qqsniffres.h"
  5. #pragma comment(lib,"ws2_32.lib")
  6. #pragma resource "C:\borland\bcc55\bin\qqsniff.RES"
  7. #define MAX_HOSTNAME_LAN 255
  8. #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
  9. #define MAX_ADDR_LEN 16
  10. char NumList[65535];
  11. struct ipheader {
  12. BYTE h_lenver; /* this means that each member is 4 bits */
  13. BYTE ip_tos;
  14. USHORT ip_len;
  15. USHORT ip_id;
  16. USHORT ip_off;
  17. BYTE ip_ttl;
  18. BYTE ip_p;
  19. USHORT ip_sum;
  20. DWORD ip_src;
  21. DWORD ip_dst;
  22. }; /* total ip header length: 20 bytes (=160 bits) */
  23. typedef struct udphdr {
  24. USHORT sport;
  25. USHORT dport;
  26. USHORT len;
  27. USHORT cksum;
  28. }UDP_HDR;
  29. static BOOL CALLBACK DialogFunc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam);
  30. BOOL InsertListViewItems(HWND hwndListView, char *srcip, char *dstip, char *Num)
  31. {
  32.  //set the number of items in the list
  33.  LVITEM lvi;
  34.  int idx=0;
  35.  lvi.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE;
  36.  lvi.state = 0;
  37.  lvi.stateMask = 0;
  38.  lvi.iItem = 0;
  39.  lvi.iSubItem = 0;
  40.  lvi.lParam = 0;
  41.  lvi.pszText = NULL;
  42.  //lvi.pszText = LPSTR_TEXTCALLBACK;
  43.  ListView_SetItemCount(hwndListView, 1);
  44.  ListView_InsertItem(hwndListView, &lvi);
  45.  ListView_SetItemText(hwndListView, idx, 0, srcip);
  46.  ListView_SetItemText(hwndListView, idx, 1, dstip);
  47.  ListView_SetItemText(hwndListView, idx, 2, Num);
  48.  return TRUE;
  49. }
  50. BOOL InitListView(HWND hwndListView)
  51. {
  52.  LV_COLUMN   lvColumn;
  53.  int         i;
  54.  char       szString[3][20] = {"From", "To", "Number"};
  55.  //empty the list
  56.  ListView_DeleteAllItems(hwndListView);
  57.  //initialize the columns
  58.  lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
  59.  lvColumn.fmt = LVCFMT_LEFT;
  60.  lvColumn.cx = 75;
  61.  for(i = 0; i < 3; i++)
  62.  {
  63.   lvColumn.pszText = szString[i];
  64.   ListView_InsertColumn(hwndListView, i, &lvColumn);
  65.  }
  66.  return TRUE;
  67. }
  68. DWORD WINAPI Sniff(LPVOID lparam)
  69. {
  70. HWND hListView=GetDlgItem((HWND)lparam,IDLIST);
  71. SOCKET sock;
  72. WSADATA wsd;
  73. DWORD dwBytesRet;
  74. DWORD optval = 1;
  75. BYTE *dataudp,*pUdpData;
  76. int QQ,iUdpDataLen,i;
  77. SOCKADDR_IN sa,saSource, saDest;
  78. struct hostent FAR * pHostent;
  79. char FAR name[MAX_HOSTNAME_LAN];
  80. char szSourceIP[MAX_ADDR_LEN],szDestIP[MAX_ADDR_LEN],Num[15],msg[50],RecvBuf[65535] = {0};
  81. struct udphdr *pUdpheader;
  82. struct ipheader *pIpheader;
  83. WSAStartup(MAKEWORD(2,1),&wsd);
  84. memset(NumList,0,65535);
  85. if ((sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP))==SOCKET_ERROR)exit(1);
  86. gethostname(name, MAX_HOSTNAME_LAN);
  87. pHostent = gethostbyname(name);
  88. sa.sin_family = AF_INET;
  89. sa.sin_port = htons(6000);
  90. memcpy(&sa.sin_addr.S_un.S_addr, pHostent->h_addr_list[0], pHostent->h_length);
  91. bind(sock, (SOCKADDR *)&sa, sizeof(sa));
  92. if ((WSAGetLastError())==10013)exit(1);
  93. WSAIoctl(sock, SIO_RCVALL, &optval, sizeof(optval), NULL, 0, &dwBytesRet, NULL, NULL);
  94. pIpheader = (struct ipheader *)RecvBuf;
  95. pUdpheader = (struct udphdr *) (RecvBuf+ sizeof(struct ipheader ));
  96. while (1)
  97. {
  98. memset(RecvBuf, 0, sizeof(RecvBuf));
  99. recv(sock, RecvBuf, sizeof(RecvBuf), 0);
  100. saSource.sin_addr.s_addr = pIpheader->ip_src;
  101. saDest.sin_addr.s_addr = pIpheader->ip_dst;
  102. strncpy(szSourceIP, inet_ntoa(saSource.sin_addr), MAX_ADDR_LEN);
  103. strncpy(szDestIP, inet_ntoa(saDest.sin_addr), MAX_ADDR_LEN);
  104. iUdpDataLen =(ntohs(pIpheader->ip_len)-(sizeof(struct ipheader)+sizeof(struct udphdr)));
  105. if((pIpheader->ip_p)==IPPROTO_UDP&&iUdpDataLen!=0)
  106. {
  107. pUdpData=(BYTE *) RecvBuf+sizeof(struct ipheader)+sizeof(struct udphdr);
  108. iUdpDataLen=ntohs(pIpheader->ip_len)-(sizeof(struct ipheader)+sizeof(struct udphdr));
  109. if(ntohs(pUdpheader->dport)==8000)
  110.         if(iUdpDataLen%4==0 && iUdpDataLen>0)
  111.             if(pUdpData[0]==0x02 && pUdpData[3]==0x00 && pUdpData[iUdpDataLen-1]==0x03)
  112.             {
  113.                 QQ = (pUdpData[7]&0xff);
  114.                 QQ = (QQ<<8) + (pUdpData[8]&0xff);
  115.                 QQ = (QQ<<8) + (pUdpData[9]&0xff);
  116.                 QQ = (QQ<<8) + (pUdpData[10]&0xff);
  117. wsprintf(Num,"%d",QQ);
  118. if(strstr(NumList,Num)==NULL){
  119. wsprintf(msg,"%s --> %s QQ: %sn",szSourceIP,szDestIP,Num);
  120. strcat(NumList,msg);
  121. InsertListViewItems(hListView,szSourceIP,szDestIP,Num);
  122. }
  123.             }
  124.   }
  125. }
  126. return TRUE;
  127. }
  128. BOOL CALLBACK MainDlgProc(HWND, UINT, WPARAM, LPARAM);
  129. HWND g_hWnd;
  130. HINSTANCE g_hInstance;
  131. int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
  132. {
  133. INITCOMMONCONTROLSEX icex;// Ensure that the common control DLL is loaded.
  134. icex.dwSize=sizeof(INITCOMMONCONTROLSEX);
  135. icex.dwICC=ICC_LISTVIEW_CLASSES;
  136. InitCommonControlsEx(&icex);
  137. g_hInstance=hInstance;
  138. return DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAINDIALOG), NULL, (DLGPROC)MainDlgProc);
  139. }
  140. BOOL CALLBACK MainDlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)        
  141. {        
  142. HANDLE g_hThread;
  143. HWND hListView,hStart,hStop;
  144. hStart=GetDlgItem(hDlg,IDSTART);
  145. hStop=GetDlgItem(hDlg,IDSTOP);
  146. switch (message)        
  147. {        
  148.            case WM_INITDIALOG:
  149. g_hWnd = hDlg;
  150. hListView = GetDlgItem(hDlg, IDLIST);
  151. EnableWindow(hStop,FALSE);
  152. InitListView(hListView);    
  153.            case WM_COMMAND:
  154. switch (LOWORD (wParam)){
  155. case IDSTART:
  156. EnableWindow(hStart,FALSE);
  157. EnableWindow(hStop,TRUE);
  158. g_hThread=CreateThread(NULL,0,Sniff,(LPVOID)hDlg,0,NULL);
  159. break;
  160. case IDSTOP:
  161. EnableWindow(hStart,TRUE);
  162. EnableWindow(hStop,FALSE);
  163. TerminateThread(g_hThread,1);
  164. break;
  165. case IDSAVE:
  166. {
  167. HGLOBAL hMem;
  168. LPTSTR pStr;
  169. hMem = GlobalAlloc(GHND | GMEM_SHARE, sizeof(NumList));
  170. pStr = GlobalLock(hMem);
  171. lstrcpy(pStr, NumList);
  172. GlobalUnlock(hMem);
  173. OpenClipboard(NULL);
  174. EmptyClipboard();
  175. SetClipboardData(CF_TEXT, hMem);
  176. CloseClipboard();
  177. GlobalFree(hMem);
  178. MessageBox(NULL,"Copy data to clipborad succesful,you can paste it!","Data copy",MB_OK);
  179. }
  180. break;
  181. }
  182. break;
  183.         /* By default, WM_CLOSE is equivalent to CANCEL */
  184. case WM_CLOSE:
  185. EndDialog(hDlg,0);
  186. WSACleanup();
  187. return TRUE;
  188. }
  189. return FALSE;
  190. }