authentication.cpp
上传用户:heseme
上传日期:2009-12-23
资源大小:228k
文件大小:30k
开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "authentication.h"
  3. #include "outnat.h"
  4. #include "ip.h"
  5. #include "Page4.h"
  6. #include "Page5.h"
  7. #include <stdio.h>
  8. #include <io.h>
  9. #include "Struct.h"
  10. #define   ETH_HEAD    14
  11. #define   IP_HEAD     20
  12. #define   TIMEOUT      2
  13. #define   MAX_RIP     20
  14. extern HANDLE global_handle;
  15. OVERLAPPED   OverLappedread_auth,*lpOverLappedread;
  16. extern BYTE SpecialBuffer[1500],SpecialBuffer1[1500],SpecialBuffer2[1500];
  17. extern BOOL  ACK,ACK1,Flag2;
  18. extern ServiceManageData TheServiceManageData;
  19. extern UserVerifyData  TheUserVerifyData;
  20. extern LogManage TheLogManage;
  21. extern BYTE INNO,OUTNO;
  22. extern USHORT logType;
  23. extern HWND myhWnd1;
  24. int count2=0;
  25. DWORD  tempack,tempseq;
  26. BOOL   Flag1=0;
  27. BOOL openfile1=1,openfile2=1;
  28. int tempcount1=0,tempcount2=0;
  29. int len1,len2;
  30. char URLBlockMsg[4096],ContentFilterMsg[4096];
  31. Hash hashtab;
  32. VOID WINAPI WriteCompletionRoutineZJ(DWORD dwErrorCode, 
  33.    DWORD dwNumberOfBytesTransferred, 
  34.    LPOVERLAPPED pOverlapped);
  35. VOID WINAPI WriteCompletionRoutineXZ(DWORD dwErrorCode, 
  36.    DWORD dwNumberOfBytesTransferred, 
  37.    LPOVERLAPPED pOverlapped);
  38. char pat1[20][20],Host[250];
  39. struct LogView1  TheLogView;
  40. struct UserAuth  UserList[4096];
  41. struct IPAddr    mask;
  42. struct IPPacketHead*  pIPPacketHead;
  43. struct TCPPacketHead* pTCPPacketHead;
  44. struct URLBlockLogMsg URLBlockLog;     //URL阻断的日志
  45. struct FilterLogMsg   ContentFilterLog;//内容过滤的日志
  46. FILE   *URLBlockLogFile,*AuthLogFile,*FilterLogFile;
  47. int    i1=0,i2=0,i3=0,Count[20],HValueKeyWord[20],count=0,timer=0;
  48. static int count1=0;
  49. unsigned int IP[MAX_RIP];
  50. BYTE SourceIPFlag[4096];//为0,不在表中;1,在表中,未验证;2,验证通过。
  51. /*void Init()
  52. {
  53. }*/
  54. BOOL ProtoMain(BYTE* pdata)
  55. {
  56. // struct IPPacketHead*  pIPPacketHead;
  57. // struct TCPPacketHead* pTCPPacketHead;
  58. char* buf,*pAuthorization,pszCode[32], pszText[32],*pBegin;
  59. int   Index=0;
  60. BOOL  ok;
  61. int x;
  62. unsigned int tempIP;
  63. ACK1=0;
  64. mask.AddrByte[0]=255;
  65. mask.AddrByte[1]=255;
  66. mask.AddrByte[2]=255;
  67. mask.AddrByte[3]=0;
  68. // buf=(char *)pdata;
  69. if (pdata[0]==1)
  70. return TRUE;
  71. pIPPacketHead=(struct IPPacketHead*)(pdata+16);
  72. if (ACK1==1)
  73. {
  74. TRACE(_T("ID=:%x n"),pIPPacketHead->Id);
  75. ACK1=0;
  76. }/**/
  77. pTCPPacketHead=(struct TCPPacketHead*)(pdata+36);
  78. // GetHost((char *)(pdata+2));
  79. // if ((swaps(pTCPPacketHead->DestPort)!=80)&&(pdata[1]==(INNO-0x30)))
  80. // return TRUE;
  81. //    
  82. // int tempIPP=swapl(pIPPacketHead->SourIP);
  83. if ((pdata[0]==0)&&(pdata[1]==INNO-0x30))
  84. {
  85. if (pIPPacketHead->Proto!=6)
  86. return TRUE;
  87. if (swaps(pTCPPacketHead->DestPort)!=80)
  88. return TRUE;
  89. char *tempp;
  90. if (!(tempp=strstr((char *)(pdata+56),"GET ")))
  91. return TRUE;
  92. GetHost((char *)(pdata+56));
  93. ok=Authentication(pdata+2);
  94. if (!ok)
  95. {
  96. pdata[0]=1;
  97. return FALSE;
  98. }
  99. // strcat(Host,"rn");
  100. if ((TheServiceManageData.FilterAndBlock&2)==0)
  101.     Flag1=FALSE;
  102. else
  103.     Flag1=URLBlock((char *)(pdata+56));//URL阻断
  104. // Flag1 = FALSE;
  105.     if (Flag1==FALSE)
  106. {
  107. if (count1==MAX_RIP)
  108. return TRUE;
  109. if (strstr(TheServiceManageData.NoFilterURLList,Host))//&&Host[0]
  110. {
  111. memcpy((void *)&tempIP,(void *)&pIPPacketHead->DestIP,4);
  112. for (x=0;x<count1;x++)
  113. {
  114. if (tempIP==IP[x])
  115. {
  116. x=24;
  117. }
  118. }
  119. if (x!=24)
  120. {
  121. IP[count1]=tempIP;
  122. count1++;
  123. }
  124. }
  125.             return TRUE;
  126. }
  127. else
  128. {
  129. tempseq=pTCPPacketHead->SeqNo;
  130. tempack=pTCPPacketHead->AckNo;
  131. SendRToServer(pdata+2);
  132. SendAutheMsg((char *)(pdata+2),1);
  133. // if (pTCPPacketHead->Flag==0x11)
  134. // {
  135. //     SendRes(pdata);
  136. // SendACK(pdata);
  137. // ACK1=1;
  138. // }
  139. ACK=1;
  140. ACK1=1;
  141. memcpy((void *)&URLBlockLog.SourIP,(void *)&pIPPacketHead->SourIP,4);
  142.      memcpy((void *)&URLBlockLog.DestIP,(void *)&pIPPacketHead->DestIP,4);
  143.      URLBlockLog.SourPort=swaps(pTCPPacketHead->SourPort);
  144.      URLBlockLog.DestPort=swaps(pTCPPacketHead->DestPort);
  145.       GetLocalTime(&(URLBlockLog.Time));
  146. URLBlockLog.Block='Y';
  147. i1++;
  148. // return FALSE;
  149. }
  150. }
  151. if ((pdata[0]==0)&&(pdata[1]==OUTNO-0x30))
  152. {
  153.      if ((TheServiceManageData.FilterAndBlock&1)==0)
  154.      return TRUE;
  155. // GetHost((char *)(pdata+2));
  156. TRACE(_T("HI beginn"));
  157.     ContentFilter((char *)(pdata+2));
  158. TRACE(_T("HI endn"));
  159. SystemLog();
  160.     return TRUE;
  161. }
  162. SystemLog();
  163.     return FALSE;
  164. }
  165. WORD swaps(WORD net)
  166. {
  167. WORD lo,hi;
  168. WORD host;
  169. lo=net&0xff;
  170. hi=net&0xff00;
  171. lo=lo<<8;
  172. hi=hi>>8;
  173. host=hi|lo;
  174. return host;
  175. }
  176. DWORD swapl(DWORD net)
  177. {
  178. DWORD b1,b2,b3,b4;
  179. DWORD host;
  180. b1=net&0xff;
  181. b2=net&0xff00;
  182. b3=net&0xff0000;
  183. b4=net&0xff000000;
  184. b1=b1<<24;
  185. b2=b2<<8;
  186. b3=b3>>8;
  187. b4=b4>>24;
  188. host=b1|b2|b3|b4;
  189. return host;
  190. }
  191. void SendAutheMsg(char* pdata, int Flag)
  192. {
  193. // struct IPPacketHead*  pIPPacketHead;
  194. // struct TCPPacketHead* pTCPPacketHead;
  195. struct EtherPacketHead* pEtherPacketHead;
  196. struct EtherAddr* tempEther=new EtherAddr;
  197. struct IPAddr* tempIP=new IPAddr;
  198. WORD   tempPort;
  199. DWORD  tempNO;
  200. int    TCPLen;
  201. WORD   Ttlen;
  202. char   len[1600];
  203. int    length;
  204. // DWORD   nbyteWrite;
  205. // if (Flag==1)
  206. //     SendRToServer((BYTE *)pdata);
  207. pEtherPacketHead=(struct EtherPacketHead*)(pdata);
  208. pIPPacketHead=(struct IPPacketHead*)(pdata+14);
  209. pTCPPacketHead=(struct TCPPacketHead*)(pdata+34);
  210. memcpy((void *)tempEther,(void *)&pEtherPacketHead->DestEther,6);
  211. memcpy((void *)&pEtherPacketHead->DestEther,(void *)&pEtherPacketHead->SourEther,6);
  212. memcpy((void *)&pEtherPacketHead->SourEther,(void *)tempEther,6);
  213. memcpy((void *)tempIP,(void *)&pIPPacketHead->SourIP,4);
  214. memcpy((void *)&pIPPacketHead->SourIP,(void *)&pIPPacketHead->DestIP,4);
  215. memcpy((void *)&pIPPacketHead->DestIP,(void *)tempIP,4);
  216. delete tempEther;
  217. delete tempIP;
  218. tempPort=pTCPPacketHead->DestPort;
  219. pTCPPacketHead->DestPort=pTCPPacketHead->SourPort;
  220. pTCPPacketHead->SourPort=tempPort;
  221. tempNO=swapl(pTCPPacketHead->SeqNo);
  222. // tempNO=pTCPPacketHead->SeqNo;
  223. pTCPPacketHead->SeqNo=pTCPPacketHead->AckNo;
  224. TCPLen=swaps(pIPPacketHead->TtlLen)-40;
  225. // TCPLen = 0-56;
  226. pTCPPacketHead->AckNo=swapl(tempNO+TCPLen);
  227. // pTCPPacketHead->AckNo=tempNO+TCPLen;
  228. if (Flag2==1)
  229. {
  230. pTCPPacketHead->Flag=0x19;
  231. // Flag2=0;
  232. }
  233. else
  234.     pTCPPacketHead->Flag=0x18;//
  235. // pTCPPacketHead->WndSize=0x00;
  236. memset(pdata+54,0,1000-54);
  237. /* pIPPacketHead->TtlLen=swaps(40);
  238. pIPPacketHead->ChkSum=0;
  239. pIPPacketHead->ChkSum=GetCksum((USHORT *)(pdata+16), 20);
  240. pTCPPacketHead->ChkSum=0;
  241. GetTCPCksum((BYTE *)(pdata+2), 0);
  242. pdata[0]=1;
  243. // memset(&OverLappedread_auth,0,sizeof(OVERLAPPED));
  244. // lpOverLappedread=&OverLappedread_auth;
  245. length=WriteFile(global_handle,pdata,56,&nbyteWrite,NULL);
  246. length=GetLastError();*/
  247. if (Flag==0)
  248. {
  249. strcpy(pdata+54,"HTTP/1.1 401 Access DeniedrnTOP FireWall  Content-type: image/jpegrnWWW-Authenticate: basic realm="JutAg"rnContent-length: 30rnrn");//身份验证
  250.      strcpy(len, "HTTP/1.1 401 Access DeniedrnTOP FireWall  Content-type: image/jpegrnWWW-Authenticate: basic realm="JutAg"rnContent-length: 30rnrn");
  251. }
  252. else
  253. {
  254. strcpy(pdata+54,"HTTP/1.1 200 OKrnContent-type: image/jpegrnContent-length: 120rnrn<html><head></head><body><form><input type='button' name='WindowButton'value='OK'onclick='Refresh()'></form></body></html>");
  255.     strcpy(len,"HTTP/1.1 200 OKrnContent-type: image/jpegrnContent-length: 120rnrn<html><head></head><body><form><input type='button' name='WindowButton'value='OK'onclick='Refresh()'></form></body></html>");
  256. pTCPPacketHead->Flag=0x22;
  257. }
  258. // strcpy(pdata+54,"HTTP/1.1 401 UnauthorizedrnContent-type: image/jpegrnWWW-Authenticate: basic realm="JutAg"rnContent-length: 30rnrn");//身份验证
  259. // strcpy(len, "HTTP/1.1 401 UnauthorizedrnContent-type: image/jpegrnWWW-Authenticate: basic realm="JutAg"rnContent-length: 30rnrn");
  260. // pdata[0]=0;
  261. Ttlen=(WORD)(strlen(len));
  262. Ttlen+=40;
  263. pIPPacketHead->TtlLen=swaps(Ttlen);
  264. // pTCPPacketHead->Flag=0x18;
  265. pIPPacketHead->ChkSum=0;
  266. pIPPacketHead->ChkSum=GetCksum((USHORT *)(pdata+14), 20);
  267. pTCPPacketHead->ChkSum=0;
  268. GetTCPCksum((BYTE *)(pdata), 0);
  269. // WriteBuffer((BYTE *)pdata);
  270. }
  271. void Unbase64(char* pszText, char* pszCode)
  272. {
  273. int nLen, i;
  274. BYTE bySixBits0, bySixBits1, bySixBits2, bySixBits3, c;
  275. nLen = strlen(pszCode);
  276. for(i=0; i<nLen; )
  277. {
  278. bySixBits0 = GetSixBits(pszCode, i);
  279. if(i<nLen)
  280. bySixBits1 = GetSixBits(pszCode, i);
  281. if(i<nLen)
  282. bySixBits2 = GetSixBits(pszCode, i);
  283. if(i<nLen)
  284. bySixBits3 = GetSixBits(pszCode, i);
  285. c = bySixBits0<<2 | bySixBits1>>4; 
  286. *pszText = c; 
  287. pszText++;
  288. c = bySixBits1<<4 | bySixBits2>>2;
  289. *pszText = c; 
  290. pszText++;
  291. c = bySixBits2<<6 | bySixBits3;
  292. *pszText = c;
  293. pszText++;
  294. }
  295. *pszText = NULL;
  296. }
  297. BYTE GetSixBits(char* pszStr, int& i)
  298. {
  299. char c;
  300. while(1)
  301. {
  302. if(i>=strlen(pszStr))break;
  303. c = pszStr[i++];
  304. if(isupper(c)) return c-'A';
  305. else if(islower(c)) return c-'a'+26;
  306. else if(isdigit(c)) return c-'0'+52;
  307. else if(c=='+') return 62;
  308. else if(c=='/') return 63;
  309. else if(c=='=') return 0;
  310. }
  311. return 0;
  312. }
  313. int SearchSourceIP(struct IPPacketHead* pIPHead)
  314. {
  315. //struct IPAddr* tempIPAddr=new IPAddr;
  316. int  index;
  317. //memcpy((void *)tempIPAddr,(void *)&pIPHead->SourIP,4);
  318. index=((pIPHead->SourIP.AddrByte[2])&(255-mask.AddrByte[2]))*256
  319.  +((pIPHead->SourIP.AddrByte[3])&(255-mask.AddrByte[3]));
  320. if (UserList[index].PassTimes==0)
  321. {
  322. SourceIPFlag[index]=0;
  323. // delete tempIPAddr;//jl1106
  324. return index;
  325. }
  326. if ((UserList[index].PassTimes)&1==1)
  327. {
  328. SourceIPFlag[index]=2;
  329. // delete tempIPAddr;//jl1106
  330. return index;
  331. }
  332. SourceIPFlag[index]=1;
  333. // delete tempIPAddr;//jl1106
  334. return index;
  335. }
  336. void SendRToServer(BYTE* buf)
  337. {
  338. int    TCPLen;
  339. DWORD  tempNO;
  340. struct IPPacketHead  *pIPHead;
  341. struct TCPPacketHead *pTCPHead;
  342. struct EtherPacketHead* pEtherPacketHead,*pEtherHead;
  343. // SpecialBuffer=new BYTE[56];
  344. memcpy(SpecialBuffer+2,buf,54);
  345. pEtherPacketHead=(struct EtherPacketHead*)(buf);
  346. pIPPacketHead=(struct IPPacketHead*)(buf+14);
  347. pTCPPacketHead=(struct TCPPacketHead*)(buf+34);
  348. pEtherHead=(struct EtherPacketHead*)(SpecialBuffer+2);
  349. pIPHead=(struct IPPacketHead*)(SpecialBuffer+16);
  350. pTCPHead=(struct TCPPacketHead*)(SpecialBuffer+36);
  351. SpecialBuffer[0]=1;
  352. // SpecialBuffer[1]=2;
  353. memset(SpecialBuffer+56,0,1500-56);
  354. /* memcpy((void *)&pEtherHead->DestEther,(void *)&pEtherPacketHead->SourEther,6);
  355. memcpy((void *)&pEtherHead->SourEther,(void *)&pEtherPacketHead->DestEther,6);
  356. memcpy((void *)&pIPHead->SourIP,(void *)&pIPPacketHead->DestIP,4);
  357. memcpy((void *)&pIPHead->DestIP,(void *)&pIPPacketHead->SourIP,4);
  358. pTCPHead->SourPort=pTCPPacketHead->DestPort;
  359. pTCPHead->DestPort=pTCPPacketHead->SourPort;*/
  360. pIPHead->TtlLen=swaps(40);
  361. pTCPHead->AckNo=tempack;
  362. pTCPHead->SeqNo=tempseq;
  363. /* tempNO=swapl(pTCPPacketHead->SeqNo);
  364. pTCPHead->SeqNo=pTCPPacketHead->AckNo;
  365. TCPLen=swaps(pIPPacketHead->TtlLen)-40;
  366. pTCPHead->AckNo=swapl(tempNO+TCPLen);*/
  367. pTCPHead->Flag=0x04;
  368. // pTCPHead->WndSize=0;
  369. pIPHead->ChkSum=0;
  370. pIPHead->ChkSum=GetCksum((USHORT *)(SpecialBuffer+16), 20);
  371. pTCPHead->ChkSum=0;
  372. GetTCPCksum((SpecialBuffer+2), 0);
  373. ACK=1;
  374. // delete []SpecialBuffer;//jl1106
  375. }
  376. BOOL URLBlock(char *buffer)
  377. {
  378. char *pBegin,ch;
  379. // struct IPAddr Host,URL;
  380. // memset(Host,0,250);
  381. if (pBegin=strstr(buffer,"Host: "))
  382. {
  383. // GetHost(buffer);
  384. memcpy(URLBlockLog.URL,Host,250);
  385. if (strstr(TheServiceManageData.BlockURLList,Host))
  386. return TRUE;
  387. return FALSE;
  388. }
  389. return FALSE;
  390. }
  391. void ContentFilter(char *buffer)
  392. {
  393. struct IPPacketHead* pIPHead;
  394. struct TCPPacketHead* pTCPHead;
  395. struct EtherPacketHead* pEtherHead;
  396. int    length;
  397. int    len=0;
  398. pIPHead=(struct IPPacketHead*)(buffer+14);
  399. pTCPHead=(struct TCPPacketHead*)(buffer+34);
  400. length=swaps(pIPHead->TtlLen)-40;
  401. if (pIPHead->Proto!=6)
  402. return;
  403. if ((TheServiceManageData.TranProtocal&1)==0)//不进行TCP
  404. return;
  405. if (swaps(pTCPHead->SourPort)!=80)
  406. return;
  407. if ((TheServiceManageData.Port&1)==0)//不进行HTTP
  408. return;
  409. /* if (pTCPHead->AckNo==pTCPHead->SeqNo)
  410. {
  411. memset(buffer,0,54);
  412. return;
  413. }
  414. */
  415. if (length>10)
  416. {
  417. int tempIP,y=0;
  418. memcpy((void *)&tempIP,(void *)&pIPPacketHead->SourIP,4);
  419. TRACE(pat1[0]);
  420. TRACE(_T("count1=%dn"),count1);
  421. for (y=0;y<count1;y++)
  422. {
  423. if(count1==1)
  424. TRACE(_T("Y=%d,count1=%dn"),y,count1);
  425. if (tempIP==IP[y])
  426. return;
  427. }
  428. SearchFilter(buffer+54,length);
  429. if ((Count[0]==0)&&(Count[1]==0)&&(Count[2]==0))
  430. return;
  431. memcpy((void *)&ContentFilterLog.SourIP,(void *)&pIPPacketHead->SourIP,4);
  432. memcpy((void *)&ContentFilterLog.DestIP,(void *)&pIPPacketHead->DestIP,4);
  433. ContentFilterLog.SourPort=swaps(pTCPPacketHead->SourPort);
  434. ContentFilterLog.DestPort=swaps(pTCPPacketHead->DestPort);
  435. GetLocalTime(&(ContentFilterLog.Time));
  436. if (Count[0]!=0)
  437. strcpy(ContentFilterLog.KeyWord[0],pat1[0]);
  438. if (Count[1]!=0)
  439. strcpy(ContentFilterLog.KeyWord[1],pat1[1]);
  440. if (Count[2]!=0)
  441. strcpy(ContentFilterLog.KeyWord[2],pat1[2]);
  442. // if (Count[0]+Count[2]+Count[3]!=0)
  443. i2++;
  444. memset(Count,0,80);
  445. }
  446. return;
  447. }
  448. void SearchFilter(char *text,int len)
  449. {
  450. int y,z,count=0,hashval=0,comp=0;
  451. char temp[4];
  452. for (z=0; z<len; z++)
  453. {
  454. if (text[z]=='<')
  455. comp=1;
  456. if (comp==1)
  457. {
  458.     if ((text[z]==' ')||(text[z]==13)||(text[z]==10))
  459. {
  460.     if (count<8)
  461. {
  462.         hashval+=count;
  463.         hashtab.pois[hashval][hashtab.number[hashval]]=z-count;
  464.         hashtab.number[hashval]++;
  465. }
  466. hashval=0;
  467.         count=0;
  468.     comp=0;
  469. }
  470.     else
  471. {
  472. //     temp[count]=text[z];
  473.     hashval+=(text[z]&95);
  474.     count++;
  475. }
  476. }
  477. }
  478. for (int Loop1=0;Loop1<count2;Loop1++)
  479. {
  480. for (y=0; y<hashtab.number[HValueKeyWord[Loop1]]; y++)
  481. {
  482. z=0;
  483. while (z<7)
  484. {
  485. if ((text[hashtab.pois[HValueKeyWord[Loop1]][y]+z]&95)!=(pat1[0][z]&95))
  486. z=9;
  487. z++;
  488. }
  489. if (z!=10)
  490. {
  491. Count[Loop1]++;
  492. temp[0]=text[hashtab.pois[HValueKeyWord[Loop1]][y]+1];
  493. temp[1]=text[hashtab.pois[HValueKeyWord[Loop1]][y]+2];
  494. text[hashtab.pois[HValueKeyWord[Loop1]][y]+1]=text[hashtab.pois[HValueKeyWord[Loop1]][y]+3];
  495. text[hashtab.pois[HValueKeyWord[Loop1]][y]+2]=text[hashtab.pois[HValueKeyWord[Loop1]][y]+4];
  496. text[hashtab.pois[HValueKeyWord[Loop1]][y]+3]=temp[0];
  497. text[hashtab.pois[HValueKeyWord[Loop1]][y]+4]=temp[1];
  498. }
  499. }
  500. }
  501. /* for (y=0; y<hashtab.number[474]; y++)
  502. {
  503. z=0;
  504. while (z<7)
  505. {
  506. if ((text[hashtab.pois[474][y]+z]&95)!=(pat1[1][z]&95))
  507. z=9;
  508. z++;
  509. }
  510. if (z!=10)
  511. {
  512. Count[1]++;
  513. temp[0]=text[hashtab.pois[474][y]+1];
  514. temp[1]=text[hashtab.pois[474][y]+2];
  515. text[hashtab.pois[474][y]+1]=text[hashtab.pois[474][y]+3];
  516. text[hashtab.pois[474][y]+2]=text[hashtab.pois[474][y]+4];
  517. text[hashtab.pois[474][y]+3]=temp[0];
  518. text[hashtab.pois[474][y]+4]=temp[1];
  519. }
  520. }
  521. for (y=0; y<hashtab.number[504]; y++)
  522. {
  523. z=0;
  524. while (z<7)
  525. {
  526. if ((text[hashtab.pois[504][y]+z]&95)!=(pat1[2][z]&95))
  527. z=9;
  528. z++;
  529. }
  530. if (z!=10)
  531. {
  532. Count[2]++;
  533. temp[0]=text[hashtab.pois[504][y]+1];
  534. temp[1]=text[hashtab.pois[504][y]+2];
  535. text[hashtab.pois[504][y]+1]=text[hashtab.pois[504][y]+3];
  536. text[hashtab.pois[504][y]+2]=text[hashtab.pois[504][y]+4];
  537. text[hashtab.pois[504][y]+3]=temp[0];
  538. text[hashtab.pois[504][y]+4]=temp[1];
  539. }
  540. }
  541. }*/
  542. return;
  543. }
  544. void SetTimeout()
  545. {
  546. for (int i=0; i<4096; i++)
  547. {
  548. if (SourceIPFlag[i]==2)
  549. {
  550.     UserList[i].PassTimes+=8;
  551.     if ((UserList[i].PassTimes&56)>>3==TheUserVerifyData.timeRefesh)//判断是否超时;
  552. {
  553.     UserList[i].PassTimes=0;//如超时将该项清0;
  554. SourceIPFlag[i]=0;
  555. }
  556. }
  557. }
  558. if (timer==TheUserVerifyData.timeRefesh)
  559. {
  560. count1=0;
  561. timer=0;
  562. }
  563. else
  564. {
  565. timer++;
  566. }
  567. }
  568. void TimeBeginThread()
  569. {
  570. while(1)
  571. {
  572. Sleep(60000);
  573. SetTimeout();
  574. }
  575. }
  576. void SendRes(BYTE *buf)
  577. {
  578. int    TCPLen;
  579. DWORD  tempNO;
  580. struct IPPacketHead  *pIPHead;
  581. struct TCPPacketHead *pTCPHead;
  582. struct EtherPacketHead* pEtherPacketHead,*pEtherHead;
  583. // SpecialBuffer=new BYTE[56];
  584. memcpy(SpecialBuffer1+2,buf,54);
  585. pEtherPacketHead=(struct EtherPacketHead*)(buf);
  586. pIPPacketHead=(struct IPPacketHead*)(buf+14);
  587. pTCPPacketHead=(struct TCPPacketHead*)(buf+34);
  588. pEtherHead=(struct EtherPacketHead*)(SpecialBuffer1+2);
  589. pIPHead=(struct IPPacketHead*)(SpecialBuffer1+16);
  590. pTCPHead=(struct TCPPacketHead*)(SpecialBuffer1+36);
  591. SpecialBuffer1[0]=1;
  592. // SpecialBuffer1[1]=2;
  593. memset(SpecialBuffer1+56,0,1500-56);
  594. /* memcpy((void *)&pEtherHead->DestEther,(void *)&pEtherPacketHead->SourEther,6);
  595. memcpy((void *)&pEtherHead->SourEther,(void *)&pEtherPacketHead->DestEther,6);
  596. memcpy((void *)&pIPHead->SourIP,(void *)&pIPPacketHead->DestIP,4);
  597. memcpy((void *)&pIPHead->DestIP,(void *)&pIPPacketHead->SourIP,4);
  598. pTCPHead->SourPort=pTCPPacketHead->DestPort;
  599. pTCPHead->DestPort=pTCPPacketHead->SourPort;*/
  600. pIPHead->TtlLen=swaps(40);
  601. tempNO=swapl(pTCPPacketHead->SeqNo);
  602. // pTCPHead->SeqNo=pTCPPacketHead->AckNo;
  603. // tempNO=pTCPPacketHead->SeqNo;
  604. // pTCPPacketHead->SeqNo=pTCPPacketHead->AckNo;
  605. TCPLen=swaps(pIPPacketHead->TtlLen)-40;
  606. // TCPLen = 0-56;
  607. pTCPHead->SeqNo=swapl(tempNO+TCPLen);
  608. // pTCPHead->SeqNo=pTCPPacketHead->SeqNo;
  609. // pTCPPacketHead->AckNo=swapl(tempNO+TCPLen);
  610. /* tempNO=swapl(pTCPPacketHead->SeqNo);
  611. pTCPHead->SeqNo=pTCPPacketHead->AckNo;
  612. TCPLen=swaps(pIPPacketHead->TtlLen)-40;
  613. pTCPHead->AckNo=swapl(tempNO+TCPLen);*/
  614. /* if (pTCPPacketHead->Flag==0x11)
  615.     pTCPHead->Flag=0x10;
  616. else*/
  617. pTCPHead->Flag=0x11;
  618. // pTCPHead->WndSize=0;
  619. pIPHead->ChkSum=0;
  620. pIPHead->ChkSum=GetCksum((USHORT *)(SpecialBuffer1+16), 20);
  621. pTCPHead->ChkSum=0;
  622. GetTCPCksum((SpecialBuffer1+2), 0);
  623. ACK=1;
  624. }
  625. void SendACK(BYTE *buf)
  626. {
  627. // int    TCPLen;
  628. // DWORD  tempNO;
  629. // struct IPPacketHead  *pIPHead;
  630. // struct TCPPacketHead *pTCPHead;
  631. struct EtherPacketHead* pEtherPacketHead;
  632. struct EtherAddr* tempEther=new EtherAddr;
  633. struct IPAddr* tempIP=new IPAddr;
  634. WORD   tempPort;
  635. DWORD  tempNO;
  636. int    TCPLen;
  637. WORD   Ttlen;
  638. int    length;
  639. pEtherPacketHead=(struct EtherPacketHead*)(buf);
  640. pIPPacketHead=(struct IPPacketHead*)(buf+14);
  641. pTCPPacketHead=(struct TCPPacketHead*)(buf+34);
  642. memcpy((void *)tempEther,(void *)&pEtherPacketHead->DestEther,6);
  643. memcpy((void *)&pEtherPacketHead->DestEther,(void *)&pEtherPacketHead->SourEther,6);
  644. memcpy((void *)&pEtherPacketHead->SourEther,(void *)tempEther,6);
  645. memcpy((void *)tempIP,(void *)&pIPPacketHead->SourIP,4);
  646. memcpy((void *)&pIPPacketHead->SourIP,(void *)&pIPPacketHead->DestIP,4);
  647. memcpy((void *)&pIPPacketHead->DestIP,(void *)tempIP,4);
  648. delete tempEther;
  649. delete tempIP;
  650. tempPort=pTCPPacketHead->DestPort;
  651. pTCPPacketHead->DestPort=pTCPPacketHead->SourPort;
  652. pTCPPacketHead->SourPort=tempPort;
  653.     tempNO=swapl(pTCPPacketHead->SeqNo);
  654. // tempNO=pTCPPacketHead->SeqNo;
  655. pTCPPacketHead->SeqNo=pTCPPacketHead->AckNo;
  656. TCPLen=swaps(pIPPacketHead->TtlLen)-40;
  657. // TCPLen = 0-56;
  658. pTCPPacketHead->AckNo=swapl(tempNO+TCPLen+1);
  659. pTCPPacketHead->Flag=0x10;
  660. // pTCPPacketHead->WndSize=0;
  661. pIPPacketHead->ChkSum=0;
  662. pIPPacketHead->ChkSum=GetCksum((USHORT *)(buf+14), 20);
  663. pTCPPacketHead->ChkSum=0;
  664. GetTCPCksum((buf), 0);
  665. // ACK1=1;
  666. }
  667. void SystemLog()
  668. {
  669. if (TheLogManage.TheProCommentsLog.isLogProtocal==FALSE)
  670. return;
  671. if (openfile1)
  672. {
  673. memset(URLBlockMsg,0,4096);
  674. openfile1=FALSE;
  675. }
  676. if (openfile2)
  677. {
  678. memset(ContentFilterMsg,0,4096);
  679. openfile2=FALSE;
  680. }
  681. if (i1!=tempcount1)
  682. {
  683. if (((TheLogManage.TheProCommentsLog.Options)&8)==8)
  684. {
  685. sprintf(TheLogView.time,"%d:%d:%d",URLBlockLog.Time.wHour,URLBlockLog.Time.wMinute,URLBlockLog.Time.wSecond);
  686. len1=strlen(URLBlockMsg);
  687. sprintf(URLBlockMsg+len1,"%d年%d月%d日%d:%d:%d    "
  688. ,URLBlockLog.Time.wYear,URLBlockLog.Time.wMonth,URLBlockLog.Time.wDay,URLBlockLog.Time.wHour,URLBlockLog.Time.wMinute,URLBlockLog.Time.wSecond);
  689. }
  690. if (((TheLogManage.TheProCommentsLog.Options)&1)==1)
  691. {
  692. sprintf(TheLogView.src,"%d.%d.%d.%d:%d",URLBlockLog.SourIP.AddrByte[0],URLBlockLog.SourIP.AddrByte[1],URLBlockLog.SourIP.AddrByte[2],URLBlockLog.SourIP.AddrByte[3],URLBlockLog.SourPort);
  693.     sprintf(TheLogView.dst,"%d.%d.%d.%d:%d",URLBlockLog.DestIP.AddrByte[0],URLBlockLog.DestIP.AddrByte[1],URLBlockLog.DestIP.AddrByte[2],URLBlockLog.DestIP.AddrByte[3],URLBlockLog.DestPort);
  694. len1=strlen(URLBlockMsg);
  695. sprintf(URLBlockMsg+len1,"源地址:%d.%d.%d.%d:%d   目的地址:%d.%d.%d.%d:%d   "
  696. ,URLBlockLog.SourIP.AddrByte[0],URLBlockLog.SourIP.AddrByte[1],URLBlockLog.SourIP.AddrByte[2],URLBlockLog.SourIP.AddrByte[3],URLBlockLog.SourPort
  697. ,URLBlockLog.DestIP.AddrByte[0],URLBlockLog.DestIP.AddrByte[1],URLBlockLog.DestIP.AddrByte[2],URLBlockLog.DestIP.AddrByte[3],URLBlockLog.DestPort);
  698. }
  699. if (((TheLogManage.TheProCommentsLog.Options)&4)==4)
  700. {
  701. sprintf(TheLogView.URL,"%s",URLBlockLog.URL);
  702. len1=strlen(URLBlockMsg);
  703. sprintf(URLBlockMsg+len1,"请求的URL:%s"
  704. ,URLBlockLog.URL);
  705. }
  706. len1=strlen(URLBlockMsg);
  707. sprintf(URLBlockMsg+len1,"rn");
  708. sprintf(TheLogView.demo,"内网入站");
  709. if (logType==2)
  710. // PostMessage(AfxGetMainWnd()->GetSafeHwnd(),M_LOGVIEW,(WPARAM)&TheLogView,(LPARAM)113);
  711.             PostMessage(myhWnd1,M_LOGVIEW,(WPARAM)&TheLogView,(LPARAM)113);
  712. tempcount1=i1;
  713. memset(&URLBlockLog,0,(sizeof(struct URLBlockLogMsg)));
  714. if (tempcount1==20)
  715. {
  716. URLBlockLogFile=fopen("URLBlockLog.log","a");
  717. fprintf(URLBlockLogFile,URLBlockMsg);
  718. fclose(URLBlockLogFile);
  719. openfile1=TRUE;
  720. tempcount1=0;
  721. i1=0;
  722. memset(URLBlockMsg,0,4096);
  723. }
  724. }
  725. if (i2!=tempcount2)
  726. {
  727. if (((TheLogManage.TheProCommentsLog.Options)&8)==8)
  728. {
  729. sprintf(TheLogView.time,"%d:%d:%d",ContentFilterLog.Time.wHour,ContentFilterLog.Time.wMinute,ContentFilterLog.Time.wSecond);
  730. len2=strlen(ContentFilterMsg);
  731. sprintf(ContentFilterMsg+len2,"%d年%d月%d日%d:%d:%d  "
  732. ,ContentFilterLog.Time.wYear,ContentFilterLog.Time.wMonth,ContentFilterLog.Time.wDay,ContentFilterLog.Time.wHour,ContentFilterLog.Time.wMinute,ContentFilterLog.Time.wSecond);
  733. }
  734. if (((TheLogManage.TheProCommentsLog.Options)&1)==1)
  735. {
  736. sprintf(TheLogView.src,"%d.%d.%d.%d:%d",ContentFilterLog.SourIP.AddrByte[0],ContentFilterLog.SourIP.AddrByte[1],ContentFilterLog.SourIP.AddrByte[2],ContentFilterLog.SourIP.AddrByte[3],ContentFilterLog.SourPort);
  737. sprintf(TheLogView.dst,"%d.%d.%d.%d:%d",ContentFilterLog.DestIP.AddrByte[0],ContentFilterLog.DestIP.AddrByte[1],ContentFilterLog.DestIP.AddrByte[2],ContentFilterLog.DestIP.AddrByte[3],ContentFilterLog.DestPort);
  738. len2=strlen(ContentFilterMsg);
  739. sprintf(ContentFilterMsg+len2,"源地址:%d.%d.%d.%d:%d   目的地址:%d.%d.%d.%d:%d"
  740. ,ContentFilterLog.SourIP.AddrByte[0],ContentFilterLog.SourIP.AddrByte[1],ContentFilterLog.SourIP.AddrByte[2],ContentFilterLog.SourIP.AddrByte[3],ContentFilterLog.SourPort
  741. ,ContentFilterLog.DestIP.AddrByte[0],ContentFilterLog.DestIP.AddrByte[1],ContentFilterLog.DestIP.AddrByte[2],ContentFilterLog.DestIP.AddrByte[3],ContentFilterLog.DestPort);
  742. }
  743. if (((TheLogManage.TheProCommentsLog.Options)&2)==2)
  744. {
  745. sprintf(TheLogView.keyword,"%s  %s  %s",ContentFilterLog.KeyWord[0],ContentFilterLog.KeyWord[1],ContentFilterLog.KeyWord[2]);
  746. len2=strlen(ContentFilterMsg);
  747. sprintf(ContentFilterMsg+len2,"含关键字:%s  %s  %s"
  748. ,ContentFilterLog.KeyWord[0],ContentFilterLog.KeyWord[1],ContentFilterLog.KeyWord[2]);
  749. }
  750. len2=strlen(ContentFilterMsg);
  751. sprintf(ContentFilterMsg+len2,"rn");
  752. sprintf(TheLogView.demo,"外网入站");
  753. if (logType==2)
  754. // PostMessage(AfxGetMainWnd()->GetSafeHwnd(),M_LOGVIEW,(WPARAM)&TheLogView,(LPARAM)114);
  755. PostMessage(myhWnd1,M_LOGVIEW,(WPARAM)&TheLogView,(LPARAM)114);
  756. memset(&ContentFilterLog,0,(sizeof(struct FilterLogMsg)));
  757. tempcount2=i2;
  758. if (tempcount2=20)
  759. {
  760. FilterLogFile=fopen("ContentFilterLog.log","a");
  761. fprintf(FilterLogFile,ContentFilterMsg);
  762. fclose(FilterLogFile);
  763. openfile2=TRUE;
  764. tempcount2=0;
  765.     i2=0;
  766. memset(ContentFilterMsg,0,4096);
  767. }
  768. }
  769. }
  770. void ProtoManInit()
  771. {
  772. int xx=0,yy=0,zz=1;
  773. memset(pat1[0],0,512);
  774. memset(pat1[1],0,512);
  775. memset(pat1[2],0,512);
  776. pat1[0][0]='<';
  777. while(TheServiceManageData.FilterKeyWord[xx]!=0)
  778. {
  779. if ((TheServiceManageData.FilterKeyWord[xx]!='r')&&(TheServiceManageData.FilterKeyWord[xx]!='n'))
  780. {
  781. pat1[yy][zz]=TheServiceManageData.FilterKeyWord[xx];
  782. zz++;
  783. xx++;
  784. }
  785. else
  786. {
  787. if (TheServiceManageData.FilterKeyWord[xx+2]!=0)
  788. {
  789.     yy++;
  790. pat1[yy][0]='<';
  791. }
  792. zz=1;
  793. xx+=2;
  794. }
  795. }
  796. count2=yy+1;
  797. zz=0;
  798. memset(HValueKeyWord,0,20);
  799. for (xx=0;xx<count2;xx++)
  800. {
  801. while (pat1[xx][zz])//((pat1[xx][zz]!='r')&&(pat1[xx][zz]!='n'))
  802. {
  803. HValueKeyWord[xx]+=(pat1[xx][zz]&95);
  804. zz++;
  805. }
  806. HValueKeyWord[xx]+=zz;
  807. zz=0;
  808. }
  809. }
  810. BOOL Authentication(BYTE *pdata)
  811. {
  812. char* buf,*pAuthorization,pszCode[32], pszText[32],*pBegin;
  813. int   Index=0;
  814. ACK1=0;
  815. /* mask.AddrByte[0]=255;
  816. mask.AddrByte[1]=255;
  817. mask.AddrByte[2]=255;
  818. mask.AddrByte[3]=0;*/
  819. buf=(char *)pdata;
  820. if (TheUserVerifyData.IsVerify==0)
  821.     return TRUE;
  822. pIPPacketHead=(struct IPPacketHead*)(pdata+14);
  823. // if (pIPPacketHead->Proto!=6)
  824. // return TRUE;
  825. pTCPPacketHead=(struct TCPPacketHead*)(pdata+34);
  826. // if (swaps(pTCPPacketHead->DestPort)!=80)
  827. // return TRUE;
  828. if (ACK1==1)
  829. {
  830. TRACE(_T("ID=:%x n"),pIPPacketHead->Id);
  831. ACK1=0;
  832. }/**/
  833. //    
  834. // int tempIPP=swapl(pIPPacketHead->SourIP);
  835. Index=SearchSourceIP(pIPPacketHead);//查找源IP地址的列表
  836. //Index = 2;
  837. //TRACE(_T("SourceIPFlag[Index]=:%d n"),SourceIPFlag[Index]);
  838. //TRACE(_T("Index=:%d n"),Index);
  839. // SourceIPFlag[Index] = 2;
  840. if (SourceIPFlag[Index]==0)//没有验证
  841. {
  842. if (pTCPPacketHead->Flag==0x11)
  843. {
  844. SendACK(pdata);
  845. TRACE(_T("CLIENT CLOSEn"));
  846. ACK1=1;
  847. // Flag2=0;
  848. return FALSE;
  849. }
  850. /**/
  851. if(pBegin=strstr(buf+54,"GET"))
  852. {
  853. // pAuthorization=strstr(buf+54,"Authorization: Basic");
  854. //     if (!pAuthorization)
  855. // {
  856. tempseq=pTCPPacketHead->SeqNo;
  857. tempack=pTCPPacketHead->AckNo;
  858. SendRToServer(pdata);
  859. //TRACE(_T("CLOSE servern"));
  860.     SendAutheMsg(buf, 0);//发送验证信息
  861. // TRACE(_T("send authen"));
  862. SendRes(pdata);
  863. // Flag2=0;
  864. ACK=1;
  865. ACK1=1;
  866. UserList[Index].PassTimes+=2;
  867. // SourceIPFlag[Index]=1;
  868. return FALSE;
  869. }
  870. else
  871. {
  872. ACK1=0;
  873. return TRUE;
  874. }
  875. }
  876. if (SourceIPFlag[Index]==1)//正在验证
  877. {
  878. TRACE(_T("正在验证n"));
  879. pAuthorization=strstr(buf+54,"Authorization: Basic");
  880. if (!pAuthorization)
  881. {
  882. if (strstr(buf+54,"GET"))
  883. {
  884. tempseq=pTCPPacketHead->SeqNo;
  885.         tempack=pTCPPacketHead->AckNo;
  886.          SendRToServer(pdata);
  887.              SendAutheMsg(buf, 0);//发送验证信息
  888. // if (pTCPPacketHead->Flag==0x11)
  889. // {
  890.     SendRes(pdata);
  891. // SendACK(pdata);
  892. ACK1=1;
  893. // }
  894. //          UserList[Index].PassTimes+=2;
  895.          ACK=1;
  896.          return FALSE;
  897. }
  898. if (pTCPPacketHead->Flag==0x11)
  899. {
  900.          SendACK(pdata);
  901. //Flag2=0;
  902.         ACK1=1;
  903.         return FALSE;
  904. }
  905. return TRUE;
  906. }
  907. else
  908. {
  909. int i=0;
  910. while (((pAuthorization+21)[i]!=' ')&&((pAuthorization+21)[i]!='r')&&((pAuthorization+21)[i]!='n'))
  911. i++;
  912. if (i>30)
  913. goto die;
  914. sscanf(pAuthorization+21, "%s", pszCode);
  915. memset(pszText,0,32);
  916.         Unbase64(pszText, pszCode);
  917. strcat(pszText,"rn");
  918. // memcpy(AuthLog[i2].UserPaswd,pszText,32);
  919. // memcpy((void *)&AuthLog[i2].SourIP,(void *)&pIPPacketHead->SourIP,4);
  920. // GetLocalTime(&(AuthLog[i2].Time));
  921.         if(strstr(TheUserVerifyData.UserList,pszText))
  922. {
  923.         buf[0]=1;
  924. //         SourceIPFlag=2;
  925. UserList[Index].PassTimes=1;
  926. //         SendAutheMsg(buf, 1);
  927. ACK=0;
  928. // SourceIPFlag[Index]=2;
  929. // AuthLog[i2].RightUser='Y';
  930. // i2++;
  931. return TRUE;
  932. }
  933.         else
  934. {
  935. die:;
  936.      if ((UserList[Index].PassTimes)==6)
  937. {
  938. UserList[Index].PassTimes=0;
  939. }
  940. else
  941. UserList[Index].PassTimes+=2;
  942. tempseq=pTCPPacketHead->SeqNo;
  943.     tempack=pTCPPacketHead->AckNo;
  944.     SendRToServer(pdata);
  945. Flag2=1;
  946.         SendAutheMsg(buf, 0);
  947. /* if (pTCPPacketHead->Flag==0x11)
  948. {
  949.     if (Flag2==0)
  950.         SendRes(pdata);
  951.     Flag2=1;
  952. SendACK(pdata);
  953. ACK1=1;
  954. }*/
  955. ACK=1;
  956. ACK1=1;
  957. // AuthLog[i2].RightUser='N';
  958. // i2++;
  959. return FALSE;
  960. }
  961. // return;
  962. }
  963. }
  964. else//验证通过
  965. {
  966. UserList[Index].PassTimes=1;
  967. return TRUE;
  968. }
  969. }
  970. void GetHost(char *buffer)
  971. {
  972. char *pBegin;
  973. memset(Host,0,250);
  974. if (pBegin=strstr(buffer,"Host: "))
  975. {
  976. int i=0;
  977. while ((pBegin[6+i]!='r')&&(i<250))
  978. {
  979. Host[i]=pBegin[6+i];
  980. i++;
  981. }
  982. // memcpy(URLBlockLog[i1].URL,Host,250);
  983. strcat(Host,"rn");
  984. // if (strstr(TheServiceManageData.BlockURLList,Host))
  985. // return TRUE;
  986. // return FALSE;
  987. }
  988. }
  989. void SendSpecialBuffer()
  990. {
  991. OVERLAPPED Overlapped;
  992. memset(&Overlapped,0,sizeof(OVERLAPPED));
  993. if (ACK==1)
  994. {
  995. TRACE(_T("ACK==1n"));
  996. if (Flag2==0)
  997. {
  998. SpecialBuffer1[0]=0;
  999. SpecialBuffer1[1]=(INNO-0x30);
  1000. //实际,tempdata[aa][0]=1;
  1001.     WriteFileEx(global_handle,
  1002. SpecialBuffer1,//TCP数据0字节的响应包
  1003. //其中,SpecialBuffer[0]=1,
  1004. 56,
  1005. &Overlapped,
  1006. WriteCompletionRoutineZJ);/**/
  1007. //count++;
  1008. }
  1009. SpecialBuffer[0]=0;
  1010.     SpecialBuffer[1]=(OUTNO-0x30);
  1011.     WriteFileEx(global_handle,
  1012. SpecialBuffer,//TCP数据0字节的响应包
  1013. //其中,SpecialBuffer[0]=1,
  1014. 56,
  1015. &Overlapped,
  1016. WriteCompletionRoutineXZ);
  1017. /**/
  1018. ACK=0;
  1019. Flag2=0;
  1020. }
  1021. }
  1022. VOID WINAPI WriteCompletionRoutineZJ(DWORD dwErrorCode, 
  1023.    DWORD dwNumberOfBytesTransferred, 
  1024.    LPOVERLAPPED pOverlapped)
  1025. {
  1026. memset(SpecialBuffer1,0,1500);
  1027. }
  1028. VOID WINAPI WriteCompletionRoutineXZ(DWORD dwErrorCode, 
  1029.    DWORD dwNumberOfBytesTransferred, 
  1030.    LPOVERLAPPED pOverlapped)
  1031. {
  1032. memset(SpecialBuffer,0,1500);
  1033. }