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

钩子与API截获

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include <stdio.h>
  3. #include "resource.h"
  4. #include "util.h"
  5. extern HINSTANCE g_hInstance;
  6. void GetFileName(char *fname)
  7. {
  8. char temp[200];
  9. GetModuleFileName(NULL, temp, sizeof(temp));
  10. int i =strlen(temp);
  11. while(i >0 && temp[i-1] !='\' && temp[i-1] !=':') i--;
  12. strcpy(fname, &temp[i]);
  13. }
  14. void WriteLog(char *fmt,...)
  15. {
  16. FILE *fp;
  17. va_list args;
  18. char modname[200];
  19. if((fp =fopen("c:\hookapi.log", "a")) !=NULL)
  20. {
  21. va_start(args,fmt);
  22. GetModuleFileName(NULL, modname, sizeof(modname));
  23. fprintf(fp, "mydll.dll:%s:", modname);
  24. vfprintf(fp, fmt, args);
  25. fprintf(fp, "n");
  26. fclose(fp);
  27. va_end(args);
  28. }
  29. }
  30. int ipcmp(char *szip1, char *szip2)
  31. {
  32. ULONG ip1 =GetIntIP(szip1);
  33. ULONG ip2 =GetIntIP(szip2);
  34. if(ip1 > ip2) return 1;
  35. else if(ip1 <ip2) return -1;
  36. else return 0;
  37. }
  38. ULONG GetIntIP(char *szip)
  39. {
  40. char *p, *p1;
  41. char ip[16];
  42. int i;
  43. ULONG ii[4];
  44. i =0;
  45. strcpy(ip, szip);
  46. p =ip;
  47. while(*p && i<4)
  48. {
  49. p1 =p;
  50. while(*p && *p !='.') p++;
  51. *p =0;
  52. ii[i] =my_atoi(p1);
  53. p ++;
  54. i++;
  55. }
  56. return ii[0]*256*256*256+ii[1]*256*256+ii[2]*256+ii[3];
  57. }
  58. ULONG my_atoi(char *p)
  59. {
  60. ULONG i;
  61. i =0;
  62. while(*p)
  63. {
  64. i =(i+*p-'0')*10;
  65. p++;
  66. }
  67. i =i/10;
  68. return i;
  69. }
  70. BOOL CALLBACK PasswordDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
  71. {
  72. static PASSWORD_DATA *pdata;
  73. char password[9];
  74. switch(msg)
  75. {
  76. case WM_INITDIALOG:
  77. pdata =(PASSWORD_DATA *)lParam;
  78. SetDlgItemText(hDlg, IDC_APP_NAME, pdata->app_name);
  79. SetDlgItemText(hDlg, IDC_IP, pdata->ip);
  80. SetWindowPos(hDlg, NULL, 300, 300, 0, 0, SWP_NOSIZE);
  81. SendDlgItemMessage(hDlg, IDE_PASSWORD, EM_SETLIMITTEXT, 8, 0L);
  82. break;
  83. case WM_COMMAND:
  84. switch(LOWORD(wParam))
  85. {
  86. case IDOK:
  87. GetDlgItemText(hDlg, IDE_PASSWORD, password, sizeof(password));
  88. if(strcmp(password, pdata->password) !=0)
  89. {
  90. MessageBox(hDlg, "密码不对", pdata->app_name, MB_OK);
  91. return TRUE;
  92. }
  93. EndDialog(hDlg, IDOK);
  94. break;
  95. case IDCANCEL:
  96. EndDialog(hDlg, IDCANCEL);
  97. }
  98. break;
  99. }
  100. return FALSE;
  101. }
  102. int CheckPassword(char *app, char *ip, char *password)
  103. {
  104. PASSWORD_DATA data;
  105. strcpy(data.app_name, app);
  106. strcpy(data.ip, ip);
  107. strcpy(data.password, password);
  108. if(DialogBoxParam(g_hInstance, MAKEINTRESOURCE(IDD_PASSWORD), NULL, PasswordDlgProc, (LONG)&data) ==IDCANCEL)
  109. return -1;
  110. return 0;
  111. }
  112. int EncURL(unsigned char *url, int len, char *new_url)
  113. {
  114. int k =0;
  115. for(int i =0; i<len; i++)
  116. {
  117. if(url[i] >127)
  118. {
  119. wsprintf(&new_url[k], "%%%2X", url[i]);
  120. k +=3;
  121. }
  122. else new_url[k++] =url[i];
  123. }
  124. new_url[k] =0;
  125. return k;
  126. }
  127. int FindData(unsigned char *data1, int len1, unsigned char *data2, int len2, int enc_url)
  128. {
  129. int i, len_url;
  130. char url[1024];
  131. //unsigned char *data =new BYTE[len2];
  132. int count =0;
  133. int pos[256], len[256], pos3[256], len3[256];
  134. int k =0;
  135. pos [0] =0;
  136. len [0] =0;
  137. char *p =(char *)data2;
  138. for(i =0; i<len2; i++)
  139. {
  140. if(p[i] !=',') len[k] ++;
  141. else
  142. {
  143. k++;
  144. pos[k] =i+1;
  145. len[k] =0;
  146. }
  147. }
  148. count =k+1;
  149. if(enc_url)
  150. {
  151. len_url =EncURL(data2, len2, url);
  152. k =0;
  153. pos3[0] =0;
  154. len3[0] =0;
  155. char *p =url;
  156. for(i =0; i<len_url; i++)
  157. {
  158. if(p[i] !=',') len3[k] ++;
  159. else
  160. {
  161. k++;
  162. pos3[k] =i+1;
  163. len3[k] =0;
  164. }
  165. }
  166. }
  167. else len_url =len2;
  168. //WriteLog("url =%s,len_url=%dndata1=%sn####len1=%d", url,len_url, data1,len1);
  169. i =0;
  170. while(i+len_url<=len1)
  171. {
  172. for(k =0; k<count; k++)
  173. {
  174. if(len[k] && memcmp(data1+i, data2+pos[k], len[k]) ==0) return i;
  175. }
  176. if(enc_url)
  177. {
  178. for(k =0; k<count; k++)
  179. {
  180. if(len3[k] && memcmp(data1+i, url+pos3[k], len3[k]) ==0) return i;
  181. }
  182. }
  183. i++;
  184. }
  185. //WriteLog("not found!!!");
  186. //delete data;
  187. return -1;
  188. }
  189. //加密例子:使用异或,输出长度不变。
  190. int EncryptData(int algrithm, char *password, unsigned char *inbuf, int inbuf_len, unsigned char *outbuf, int *outbuf_len)
  191. {
  192. int i;
  193. for(i =0; i<inbuf_len-1; i++)
  194. {
  195. outbuf[i] =inbuf[i]^password[i%8];
  196. }
  197. *outbuf_len =inbuf_len;
  198. return *outbuf_len;
  199. }
  200. int DecryptData(int algrithm, char *password, unsigned char *inbuf, int inbuf_len, unsigned char *outbuf, int *outbuf_len)
  201. {
  202. int i;
  203. for(i =0; i<inbuf_len; i++)
  204. {
  205. outbuf[i] =inbuf[i]^password[i%8];
  206. }
  207. *outbuf_len =inbuf_len;
  208. return *outbuf_len;
  209. }
  210. int GetLocalPortBySocket(SOCKET s)
  211. {
  212. struct sockaddr name;
  213. int namelen =sizeof(name);
  214. getsockname(s, &name, &namelen);
  215. return ntohs(((struct sockaddr_in *)&name)->sin_port);
  216. }
  217. int GetLocalIPBySocket(SOCKET s, char *ip)
  218. {
  219. struct sockaddr name;
  220. int namelen =sizeof(name);
  221. getsockname(s, &name, &namelen);
  222. strcpy(ip, inet_ntoa(((struct sockaddr_in *)&name)->sin_addr));
  223. return 0;
  224. }
  225. int GetRemotePortBySocket(SOCKET s)
  226. {
  227. struct sockaddr name;
  228. int namelen =sizeof(name);
  229. getpeername(s, &name, &namelen);
  230. return ntohs(((struct sockaddr_in *)&name)->sin_port);
  231. }
  232. int GetRemoteIPBySocket(SOCKET s, char *ip)
  233. {
  234. struct sockaddr name;
  235. int namelen =sizeof(name);
  236. getpeername(s, &name, &namelen);
  237. strcpy(ip, inet_ntoa(((struct sockaddr_in *)&name)->sin_addr));
  238. return 0;
  239. }