Filter.cpp
上传用户:nbcables
上传日期:2007-01-11
资源大小:1243k
文件大小:7k
源码类别:

钩子与API截获

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <malloc.h>
  5. #include "util.h"
  6. #include "Filter.h"
  7. char g_dll_path[128];
  8. CSocketFilter::CSocketFilter()
  9. {
  10. m_pFilterInfo = NULL;
  11. m_hLocal =NULL;
  12. char dll_path[512];
  13. if(GetProfileString("HOOKAPI", "dll_path", "", dll_path, sizeof(dll_path)) ==0)
  14. return;
  15. char ini_file[256];
  16. wsprintf(ini_file, "%s\filter.ini", dll_path);
  17. WriteLog("FilterInit:ini_file=%s", ini_file);
  18. HANDLE hFile = CreateFile(ini_file, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  19. if (hFile == INVALID_HANDLE_VALUE)
  20. return;
  21. _llseek((HFILE)hFile, 0, FILE_BEGIN);
  22. BOOL bResult;
  23. DWORD nBytesToRead=1024;
  24. DWORD nBytesRead=0;
  25. char buffer[1024];
  26. char line[256], *p;
  27. char type[4], app[2], name[256], action[2];
  28. int i,j;
  29. bool bFirst=true;
  30. m_nFilterInfoCount = 0;
  31. m_hLocal =LocalAlloc(LMEM_FIXED, sizeof(FILTER_INFO)*FILTER_INFO_STEP);
  32. m_pFilterInfo = (FILTER_INFO*)LocalLock(m_hLocal);
  33. int len_read;
  34. bResult =1;
  35. while (bResult)
  36. {
  37. len_read =0;
  38. buffer[0] =0;
  39. while((bResult = ReadFile(hFile, &buffer[len_read], 1, &nBytesRead, NULL)))
  40. {
  41. if(buffer[len_read] =='n') break;
  42. len_read ++;
  43. }
  44. if(nBytesRead ==0) break;
  45. buffer[len_read] =0;
  46. if(buffer[0] =='#' || buffer[0] ==0 || buffer[0] =='r') continue;
  47. strtok(buffer, "r");
  48. strtok(buffer, "n");
  49. WriteLog("buffer:%s, bResult:%d", buffer, bResult);
  50. p =strtok(buffer, ",");
  51. if(!p) continue;
  52. if(strlen(p) >= sizeof(type)) continue;
  53. strcpy(type, p);
  54. if (stricmp(type,"dns")!=0)
  55. continue;
  56. p =strtok(NULL, ",");
  57. if(!p) continue;
  58. if(strlen(p) >=sizeof(name)) continue;
  59. strcpy(name, p);             // host
  60. m_pFilterInfo[m_nFilterInfoCount].type = FILTER_DNS;
  61. //strcpy(m_pFilterInfo[m_nFilterInfoCount].app,app);
  62. strcpy(m_pFilterInfo[m_nFilterInfoCount].buf,name);
  63. WriteLog("dns name:%s", name);
  64. m_nFilterInfoCount++;
  65. if (m_nFilterInfoCount == FILTER_INFO_STEP)
  66. break;
  67. }
  68. WriteLog("m_nFilterInfoCount =%d", m_nFilterInfoCount);
  69. _lclose((HFILE)hFile);
  70. }
  71. CSocketFilter::~CSocketFilter()
  72. {
  73. //if(m_pFilterInfo)
  74. // free(m_pFilterInfo);
  75. if(m_hLocal)
  76. {
  77. LocalUnlock(m_hLocal);
  78. LocalFree(m_hLocal);
  79. }
  80. }
  81. int CSocketFilter::FilterBind(int port)
  82. {
  83. char app[128];
  84. GetFileName(app);
  85. for(int i=0; i<m_nFilterInfoCount; i++)
  86. {
  87. if(m_pFilterInfo[i].type !=FILTER_BIND)
  88. continue;
  89. if(m_pFilterInfo[i].app[0] =='*' || !strcmpi(m_pFilterInfo[i].app, app))
  90. {
  91. if(m_pFilterInfo[i].port ==port)
  92. return true;
  93. }
  94. }
  95. return false;
  96. }
  97. int CSocketFilter::FilterConnect(char *ip, int port)
  98. {
  99. char app[128];
  100. GetFileName(app);
  101. for(int i=0; i<m_nFilterInfoCount; i++)
  102. {
  103. if(m_pFilterInfo[i].type !=FILTER_CONNECT)
  104. continue;
  105. if(m_pFilterInfo[i].app[0] =='*' || !strcmpi(m_pFilterInfo[i].app, app))
  106. {
  107. if(m_pFilterInfo[i].ip[0] =='*' || !strcmpi(m_pFilterInfo[i].ip, ip))
  108. {
  109. if(m_pFilterInfo[i].port ==0 || m_pFilterInfo[i].port ==port)
  110. return true;
  111. }
  112. }
  113. }
  114. return false;
  115. }
  116. int CSocketFilter::FilterSend(int sd, char *buf, int len)
  117. {
  118. char app[128];
  119. char ip[16];
  120. GetFileName(app);
  121. int port =GetLocalPortBySocket(sd);
  122. int port1 =GetRemotePortBySocket(sd);
  123. if(port1 <1024) port =port1;
  124. GetRemoteIPBySocket(sd, ip);
  125. for(int i=0; i<m_nFilterInfoCount; i++)
  126. {
  127. if(m_pFilterInfo[i].type !=FILTER_SEND)
  128. continue;
  129. if(m_pFilterInfo[i].app[0] =='*' || !strcmpi(m_pFilterInfo[i].app, app))
  130. {
  131. if(m_pFilterInfo[i].ip[0] =='*' || !strcmpi(m_pFilterInfo[i].ip, ip))
  132. {
  133. if(m_pFilterInfo[i].port ==0 || m_pFilterInfo[i].port ==port)
  134. {
  135. if(m_pFilterInfo[i].buf[0] ==0) return true;
  136. mreplace(buf, len, m_pFilterInfo[i].buf, ' ');
  137. }
  138. }
  139. }
  140. }
  141. return false;
  142. }
  143. int CSocketFilter::FilterRecv(int sd, char *buf, int len)
  144. {
  145. char app[128];
  146. char ip[16];
  147. GetFileName(app);
  148. int port =GetLocalPortBySocket(sd);
  149. int port1 =GetRemotePortBySocket(sd);
  150. if(port1 <1024) port =port1;
  151. GetRemoteIPBySocket(sd, ip);
  152. //WriteLog("FilterInfoCount=%d", m_nFilterInfoCount);
  153. for(int i=0; i<m_nFilterInfoCount; i++)
  154. {
  155. //WriteLog("FilterRecv:type=%d,app=%s,ip=%s,port=%d,buf=%s",
  156. // m_pFilterInfo[i].type, m_pFilterInfo[i].app, m_pFilterInfo[i].ip,
  157. // m_pFilterInfo[i].port,m_pFilterInfo[i].buf);
  158. if(m_pFilterInfo[i].type !=FILTER_RECV)
  159. continue;
  160. if(m_pFilterInfo[i].app[0] =='*' || !strcmpi(m_pFilterInfo[i].app, app))
  161. {
  162. if(m_pFilterInfo[i].ip[0] =='*' || !strcmpi(m_pFilterInfo[i].ip, ip))
  163. {
  164. if(m_pFilterInfo[i].port ==0 || m_pFilterInfo[i].port ==port)
  165. {
  166. if(m_pFilterInfo[i].buf[0] ==0) return true;
  167. mreplace(buf, len, m_pFilterInfo[i].buf, ' ');
  168. }
  169. }
  170. }
  171. }
  172. return false;
  173. }
  174. int CSocketFilter::FilterDNS(char *host_name)
  175. {
  176. if(host_name ==NULL) return false;
  177. //char app[128];
  178. //WriteLog("FilterDNS:host_name:%s", host_name);
  179. for(int i=0; i<m_nFilterInfoCount; i++)
  180. {
  181. if(m_pFilterInfo[i].type !=FILTER_DNS)
  182. continue;
  183. //WriteLog("FilterDNS:host_name:%s,%s", host_name, m_pFilterInfo[i].buf);
  184. if(!strcmpi(host_name, m_pFilterInfo[i].buf))
  185. return true;
  186. }
  187. return false;
  188. }
  189. int CSocketFilter::FilterSendTo(char *ip, int port, char *buf, int len)
  190. {
  191. char app[128];
  192. GetFileName(app);
  193. for(int i=0; i<m_nFilterInfoCount; i++)
  194. {
  195. if(m_pFilterInfo[i].type !=FILTER_SENDTO)
  196. continue;
  197. if(m_pFilterInfo[i].app[0] =='*' || !strcmpi(m_pFilterInfo[i].app, app))
  198. {
  199. if(m_pFilterInfo[i].ip[0] =='*' || !strcmpi(m_pFilterInfo[i].ip, ip))
  200. {
  201. if(m_pFilterInfo[i].port ==0 || m_pFilterInfo[i].port ==port)
  202. {
  203. if(m_pFilterInfo[i].buf[0] ==0) return true;
  204. mreplace(buf, len, m_pFilterInfo[i].buf, ' ');
  205. }
  206. }
  207. }
  208. }
  209. return false;
  210. }
  211. int CSocketFilter::FilterRecvFrom(char *ip, int port, char *buf, int len)
  212. {
  213. char app[128];
  214. GetFileName(app);
  215. for(int i=0; i<m_nFilterInfoCount; i++)
  216. {
  217. if(m_pFilterInfo[i].type !=FILTER_RECVFROM)
  218. continue;
  219. if(m_pFilterInfo[i].app[0] =='*' || !strcmpi(m_pFilterInfo[i].app, app))
  220. {
  221. if(m_pFilterInfo[i].ip[0] =='*' || !strcmpi(m_pFilterInfo[i].ip, ip))
  222. {
  223. if(m_pFilterInfo[i].port ==0 || m_pFilterInfo[i].port ==port)
  224. {
  225. if(m_pFilterInfo[i].buf[0] ==0) return true;
  226. mreplace(buf, len, m_pFilterInfo[i].buf, ' ');
  227. }
  228. }
  229. }
  230. }
  231. return false;
  232. }
  233. int CSocketFilter::FilterAccept(int sd)
  234. {
  235. char ip[16];
  236. int port =GetLocalPortBySocket(sd);
  237. GetRemoteIPBySocket(sd, ip);
  238. char app[128];
  239. GetFileName(app);
  240. for(int i=0; i<m_nFilterInfoCount; i++)
  241. {
  242. if(m_pFilterInfo[i].type !=FILTER_ACCEPT)
  243. continue;
  244. if(m_pFilterInfo[i].app[0] =='*' || !strcmpi(m_pFilterInfo[i].app, app))
  245. {
  246. if(m_pFilterInfo[i].ip[0] =='*' || !strcmpi(m_pFilterInfo[i].ip, ip))
  247. {
  248. if(m_pFilterInfo[i].port ==0 || m_pFilterInfo[i].port ==port)
  249. return true;
  250. }
  251. }
  252. }
  253. return false;
  254. }