ProtocolInfo.cpp
上传用户:kklily621
上传日期:2013-06-25
资源大小:252k
文件大小:6k
开发平台:

Visual C++

  1. //=============================================================================================
  2. /*
  3. 文件: ProtocolInfo.cpp
  4. 说明:
  5. ---------------------------------------------------
  6. TCP/IP 封包分析,利用 TCP/IP 协议的封包结构分
  7. 析截获的数据,提取需要的数据。
  8. ---------------------------------------------------
  9. 工程: Xfilter 个人防火墙
  10. 作者: 朱雁辉,朱雁冰
  11. 创建日期: 2001/08/21
  12. 网址: http://www.xfilt.com
  13. 电子邮件: xstudio@xfilt.com
  14. 版权所有 (c) 2001-2002 X 工作室
  15. 警告:
  16. ---------------------------------------------------
  17. 本电脑程序受著作权法的保护。未经授权,不能使用
  18. 和修改本软件全部或部分源代码。凡擅自复制、盗用或散
  19. 布此程序或部分程序或者有其它任何越权行为,将遭到民
  20. 事赔偿及刑事的处罚,并将依法以最高刑罚进行追诉。
  21. 凡通过合法途径购买本软件源代码的用户被默认授权
  22. 可以在自己的程序中使用本软件的部分代码,但作者不对
  23. 代码产生的任何后果负责。
  24. 使用了本软件代码的程序只能以可执行文件形式发布,
  25. 未经特别许可,不能将含有本软件源代码的源程序以任何
  26. 形式发布。
  27. ---------------------------------------------------
  28. */
  29. //=============================================================================================
  30. #include "stdafx.h"
  31. #include "ProtocolInfo.h"
  32. #include "CheckAcl.h"
  33. extern CRITICAL_SECTION gCriticalSection;
  34. //=============================================================================================
  35. // exported public function.
  36. int CProtocolInfo::GetProtocolInfo(SESSION *session, TCHAR *pBuf, int nBufLenth, BOOL IsSend)
  37. {
  38. if (pBuf == NULL || nBufLenth == 0)
  39. return XERR_PROTOCOL_NO_DATA;
  40. if(IsSend)
  41. return GetFromSend(session, pBuf, nBufLenth);
  42. else
  43. return GetFromRecv(session, pBuf, nBufLenth);
  44. return XERR_SUCCESS;
  45. }
  46. //=============================================================================================
  47. // private function.
  48. int CProtocolInfo::GetFromSend(SESSION *session, TCHAR *pBuf, int nBufLenth)
  49. {
  50. if(session->bProtocol == ACL_SERVICE_TYPE_HTTP)
  51. return GetHttp(session, pBuf, nBufLenth);
  52. else if(session->bProtocol == ACL_SERVICE_TYPE_FTP)
  53. return GetFtp(session, pBuf, nBufLenth);
  54. else if(session->bProtocol == ACL_SERVICE_TYPE_SMTP)
  55. return GetSmtp(session, pBuf, nBufLenth);
  56. else if(session->bProtocol == ACL_SERVICE_TYPE_POP3)
  57. return GetPop3BySend(session, pBuf, nBufLenth);
  58. return XERR_SUCCESS;
  59. }
  60. int CProtocolInfo::GetFromRecv(SESSION *session, TCHAR *pBuf, int nBufLenth)
  61. {
  62. if(session->bProtocol == ACL_SERVICE_TYPE_POP3)
  63. return GetPop3(session, pBuf, nBufLenth);
  64. return XERR_SUCCESS;
  65. }
  66. int CProtocolInfo::GetHttp(SESSION *session, TCHAR *pBuf, int nBufLenth)
  67. {
  68. CString tmp, sHost = _T("");
  69. tmp.Format("%s",pBuf);
  70. int i = tmp.Find(_T("Host: "));
  71. if(i != -1)
  72. {
  73. int j = i + 6;
  74. TCHAR c = tmp.GetAt(j);
  75. while(c != 13)
  76. {
  77. sHost += c;
  78. c = tmp.GetAt(++j);
  79. }
  80. if(session->sMemo[0] == '')
  81. {
  82. if(sHost.GetLength() >= MAX_PATH - 1)
  83. sHost.SetAt(MAX_PATH - 1, '');
  84. EnterCriticalSection(&gCriticalSection);
  85. {
  86. _tcscpy(session->sMemo, sHost);
  87. }
  88. LeaveCriticalSection(&gCriticalSection);
  89. }
  90. }
  91. return XERR_SUCCESS;
  92. }
  93. int CProtocolInfo::GetFtp(SESSION *session, TCHAR *pBuf, int nBufLenth)
  94. {
  95. TCHAR tBuf[MAX_PATH];
  96. CString tmpStr;
  97. static TCHAR sUserName[21];
  98. static TCHAR sPassword[21];
  99. if(_tcsnicmp(pBuf, _T("USER "), 5) == 0)
  100. _stscanf(pBuf + 4, _T("%*[ ]%s"), sUserName);
  101. else if(_tcsnicmp(pBuf, _T("PASS "), 5) == 0)
  102. _stscanf(pBuf + 4, _T("%*[ ]%s"), sPassword);
  103. else if(_tcsnicmp(pBuf, _T("RETR "), 5) == 0)
  104. {
  105. _stscanf(pBuf + 4, _T("%*[ ]%s"), tBuf);
  106. tmpStr.Format(_T("User Name: %s; Password: %s; Get File: %s"), sUserName, sPassword, tBuf);
  107. if(tmpStr.GetLength() >= MAX_PATH - 1)
  108. tmpStr.SetAt(MAX_PATH - 1, '');
  109. EnterCriticalSection(&gCriticalSection);
  110. {
  111. _tcscpy(session->sMemo, tmpStr);
  112. }
  113. LeaveCriticalSection(&gCriticalSection);
  114. CCheckAcl::SendSessionToApp(session);
  115. }
  116. else if(_tcsnicmp(pBuf, _T("STOR "), 5) == 0)
  117. {
  118. _stscanf(pBuf + 4, _T("%*[ ]%s"), tBuf);
  119. tmpStr.Format(_T("User Name: %s; Password: %s; Put File: %s"), sUserName, sPassword, tBuf);
  120. if(tmpStr.GetLength() >= MAX_PATH - 1)
  121. tmpStr.SetAt(MAX_PATH - 1, '');
  122. EnterCriticalSection(&gCriticalSection);
  123. {
  124. _tcscpy(session->sMemo, tmpStr);
  125. }
  126. LeaveCriticalSection(&gCriticalSection);
  127. CCheckAcl::SendSessionToApp(session);
  128. }
  129. return XERR_SUCCESS;
  130. }
  131. int CProtocolInfo::GetSmtp(SESSION *session, TCHAR *pBuf, int nBufLenth)
  132. {
  133. static CString sEmail = _T("");
  134. if(_tcsnicmp(pBuf, _T("MAIL FROM: "), 11) == 0)
  135. sEmail.Format(_T("%s"), pBuf);
  136. else if(_tcsnicmp(pBuf, _T("RCPT TO: "), 9) == 0)
  137. {
  138. sEmail += pBuf;
  139. sEmail.Replace(13, ';');
  140. sEmail.Replace(10, ' ');
  141. if(sEmail.GetLength() >= MAX_PATH - 1)
  142. sEmail.SetAt(MAX_PATH - 1, '');
  143. EnterCriticalSection(&gCriticalSection);
  144. {
  145. _tcscpy(session->sMemo, sEmail);
  146. }
  147. LeaveCriticalSection(&gCriticalSection);
  148. }
  149. return XERR_SUCCESS;
  150. }
  151. int CProtocolInfo::GetPop3BySend(SESSION *session, TCHAR *pBuf, int nBufLenth)
  152. {
  153. CString tmpStr = session->sMemo;
  154. int i = tmpStr.Find(_T("USER "));
  155. int j = tmpStr.Find(_T("PASS "));
  156. if(( i != -1) && (j != -1))
  157. return XERR_SUCCESS;
  158. if(_tcsnicmp(pBuf, _T("USER "), 5) == 0
  159. || _tcsnicmp(pBuf, _T("PASS "), 5) == 0)
  160. {
  161. tmpStr += pBuf;
  162. tmpStr.Replace(13, ';');
  163. tmpStr.Replace(10, ' ');
  164. if(tmpStr.GetLength() >= MAX_PATH - 1)
  165. tmpStr.SetAt(MAX_PATH - 1, '');
  166. EnterCriticalSection(&gCriticalSection);
  167. {
  168. _tcscpy(session->sMemo, tmpStr);
  169. }
  170. LeaveCriticalSection(&gCriticalSection);
  171. }
  172. return XERR_SUCCESS;
  173. }
  174. int CProtocolInfo::GetPop3(SESSION *session, TCHAR *pBuf, int nBufLenth)
  175. {
  176. CString tmpStr;
  177. int iStart, iOver, iTmp;
  178. tmpStr = session->sMemo;
  179. iTmp = tmpStr.Find(_T("To: "));
  180. if(iTmp != -1)
  181. return XERR_SUCCESS;
  182. tmpStr = pBuf;
  183. iStart = tmpStr.Find(_T("From: "));
  184. if(iStart == -1)
  185. return XERR_SUCCESS;
  186. iOver = tmpStr.Find(_T("Subject: "));
  187. if(iOver == -1)
  188. return XERR_SUCCESS;
  189. tmpStr = tmpStr.Mid(iStart, iOver - iStart);
  190. tmpStr.Replace(13, ';');
  191. tmpStr.Replace(10, ' ');
  192. int i = MAX_PATH - 1 - _tcslen(session->sMemo);
  193. if(tmpStr.GetLength() >= i)
  194. tmpStr.SetAt(i, '');
  195. EnterCriticalSection(&gCriticalSection);
  196. {
  197. _tcscat(session->sMemo, tmpStr);
  198. }
  199. LeaveCriticalSection(&gCriticalSection);
  200. return XERR_SUCCESS;
  201. }