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

钩子与API截获

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include <malloc.h>
  3. #include "util.h"
  4. #include "const.h"
  5. #include "Filter.h"
  6. typedef int (WINAPI *FILTERFUNC)();
  7. // int WINAPI ConnectFilter(char *ip, int port);
  8. typedef int (WINAPI *CONNECTFILTERFUNC)(char *, int);
  9. // int WINAPI BindFilter(int port);
  10. typedef int (WINAPI *BINDFILTERFUNC)(int);
  11. // int WINAPI AcceptFilter(int sd, char *ip, int port);
  12. typedef int (WINAPI *ACCEPTFILTERFUNC)(int, char *, int);
  13. // int WINAPI RecvFilter(int sd, char *data, int data_len, char *data1, int *pdata1_len);
  14. typedef int (WINAPI *RECVFILTERFUNC)(int, char *, int, char *, int *);
  15. // int WINAPI SendFilter(int sd, char *data, int data_len, char *data1, int *pdata1_len);
  16. typedef int (WINAPI *SENDFILTERFUNC)(int, char *, int, char *, int *);
  17. typedef struct
  18. {
  19. int type;
  20. HANDLE hModule;
  21. CONNECTFILTERFUNC ConnectFilter;
  22. BINDFILTERFUNC BindFilter;
  23. ACCEPTFILTERFUNC AcceptFilter;
  24. RECVFILTERFUNC RecvFilter;
  25. SENDFILTERFUNC SendFilter;
  26. }FILTER_INFO;
  27. HANDLE *pFilter
  28. FILTER_INFO *g_pFilterInfo =NULL;
  29. int g_filter_info_count =0;
  30. ///////////////// ok//////////////////
  31. int CryptInitDLL()
  32. {
  33. if(crypt_dll_file[0] ==0) return 0;
  34. if((hModCrypt =LoadLibrary(crypt_dll_file)) !=NULL)
  35. {
  36. myCryptData =(CRYPTDATA)GetProcAddress((HMODULE)hModCrypt, "CryptData");
  37. myDecryptData =(DECRYPTDATA)GetProcAddress((HMODULE)hModCrypt, "DecryptData");
  38. }
  39. else WriteLog("LoadLibrary crypt dll %s failed!", crypt_dll_file);
  40. return 0;
  41. }
  42. int CryptFreeDLL()
  43. {
  44. if(hModCrypt)
  45. {
  46. FreeLibrary((HINSTANCE)hModCrypt);
  47. hModCrypt =NULL;
  48. }
  49. return 0;
  50. }
  51. int CryptInit()
  52. {
  53. char init_file[128];
  54. char temp[100], temp1[128];
  55. //WriteLog("CryptInit...");
  56. if(g_szDllPath[0] ==0 || g_crypt_info_count >0)
  57. return 0;
  58. wsprintf(init_file, "%s\crypt.ini", g_szDllPath);
  59. if(GetPrivateProfileString("SETUP", "dll", "", temp1, sizeof(temp1), init_file) >0)
  60. wsprintf(crypt_dll_file, "%s\%s", g_szDllPath, temp1);
  61. g_crypt_info_count =0;
  62. while(1)
  63. {
  64. wsprintf(temp, "APP%d", g_crypt_info_count+1);
  65. if(GetPrivateProfileString("SETUP", temp, "", temp1, sizeof(temp1), init_file) <1)
  66. break;
  67. if(g_pCryptInfo ==NULL) g_pCryptInfo =(CRYPT_INFO *)malloc(sizeof(CRYPT_INFO));
  68. else g_pCryptInfo =(CRYPT_INFO *)realloc(g_pCryptInfo, sizeof(CRYPT_INFO)*(g_crypt_info_count+1));
  69. if(g_pCryptInfo ==NULL) return -1;
  70. memset(&g_pCryptInfo[g_crypt_info_count], 0, sizeof(CRYPT_INFO));
  71. strupr(temp1);
  72. strcpy(g_pCryptInfo[g_crypt_info_count].app, temp1);
  73. wsprintf(temp, "IP%d", g_crypt_info_count+1);
  74. GetPrivateProfileString("SETUP", temp, "", g_pCryptInfo[g_crypt_info_count].ip, 16, init_file);
  75. wsprintf(temp, "LOCAL_PORT_TYPE%d", g_crypt_info_count+1);
  76. g_pCryptInfo[g_crypt_info_count].server_port =GetPrivateProfileInt("SETUP", temp, 0, init_file);
  77. GetPrivateProfileString("SETUP", temp, "", g_pCryptInfo[g_crypt_info_count].local_port_type, 2, init_file);
  78. //WriteLog("crypt:%d", g_crypt_info_count);
  79. g_crypt_info_count++;
  80. }
  81. return 0;
  82. }
  83. // 检查是否需要加解密
  84. BOOL CryptCheck(char *remote_ip, int local_port, int remote_port)
  85. {
  86. int i;
  87. int port;
  88. //WriteLog("CryptCheck...");
  89. for(i =0; i<g_crypt_info_count; i++)
  90. {
  91. //WriteLog("g_szAppBaseName:%s, app:%s, ip:%s, port:%d, local_port_type:%s", g_szAppBaseName, g_pCryptInfo[i].app, g_pCryptInfo[i].ip, g_pCryptInfo[i].server_port,g_pCryptInfo[i].local_port_type);
  92. if(strcmp(g_pCryptInfo[i].app, g_szAppBaseName)==0 || strcmp(g_pCryptInfo[i].app, "ALL") ==0)
  93. {
  94. if(g_pCryptInfo[i].ip[0] ==0 || strcmp(g_pCryptInfo[i].ip, remote_ip) ==0)
  95. {
  96. if(g_pCryptInfo[i].server_port ==0) return true;
  97. if(g_pCryptInfo[i].local_port_type[0] =='S' || g_pCryptInfo[i].local_port_type[0] =='s')
  98. port =local_port;
  99. else port =remote_port;
  100. if(g_pCryptInfo[i].server_port ==port)
  101. return true;
  102. }
  103. }
  104. }
  105. return false;
  106. }
  107. // CryptData
  108. // return: 0 - data not changed, 1 - data crypted, <0 - failed
  109. int CryptData(char *data, int data_len, char *data_crypted, int *pdata_crypted_len)
  110. {
  111. int ret =0;
  112. CryptInitDLL();
  113. if(myCryptData)
  114. {
  115. ret = myCryptData(data, data_len, data_crypted, pdata_crypted_len);
  116. WriteLog("Dll crypt, ret=%d", ret);
  117. }
  118. else
  119. {
  120. for(int i =0; i<data_len; i++)
  121. data_crypted[i] ^=data[i];
  122. *pdata_crypted_len =data_len;
  123. ret =data_len;
  124. WriteLog("Local Crypt, ret=%d", ret);
  125. }
  126. CryptFreeDLL();
  127. return ret;
  128. }
  129. // DecryptData
  130. // return: 0 - data not changed, 1 - data decrypted, <0 - failed
  131. int DecryptData(char *data, int data_len, char *data_decrypted, int *pdata_decrypted_len)
  132. {
  133. int ret =0;
  134. CryptInitDLL();
  135. if(myDecryptData)
  136. {
  137. ret = myDecryptData(data, data_len, data_decrypted, pdata_decrypted_len);
  138. WriteLog("Dll Decrypt, ret=%d", ret);
  139. }
  140. else
  141. {
  142. for(int i =0; i<data_len; i++)
  143. data_decrypted[i] ^=data[i];
  144. *pdata_decrypted_len =data_len;
  145. ret =data_len;
  146. WriteLog("Local Decrypt, ret=%d", ret);
  147. }
  148. CryptFreeDLL();
  149. return ret;
  150. }
  151. int CryptExit()
  152. {
  153. g_crypt_info_count =0;
  154. if(g_pCryptInfo)
  155. {
  156. free(g_pCryptInfo);
  157. g_pCryptInfo =NULL;
  158. }
  159. return 0;
  160. }