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

钩子与API截获

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <winsock.h>
  5. #include "resource.h"
  6. #include "util.h"
  7. #include "psapi.h"
  8. extern HINSTANCE g_hInstance;
  9. void GetFileName(char *fname)
  10. {
  11. char temp[200];
  12. fname[0] =0;
  13. if(GetModuleFileName(NULL, temp, sizeof(temp)) ==0) return;
  14. int i =strlen(temp);
  15. while(i >0 && temp[i-1] !='\' && temp[i-1] !=':') i--;
  16. strcpy(fname, &temp[i]);
  17. strupr(fname);
  18. }
  19. void WriteLog(char *fmt,...)
  20. {
  21. FILE *fp;
  22. va_list args;
  23. char modname[200];
  24. if((fp =fopen("c:\hookapi.log", "a")) !=NULL)
  25. {
  26. va_start(args,fmt);
  27. GetModuleFileName(NULL, modname, sizeof(modname));
  28. if(!strstr(modname, "HookAPI"))
  29. {
  30. fprintf(fp, "mydll.dll:%s:", modname);
  31. vfprintf(fp, fmt, args);
  32. fprintf(fp, "n");
  33. }
  34. fclose(fp);
  35. va_end(args);
  36. }
  37. }
  38. int ipcmp(char *szip1, char *szip2)
  39. {
  40. ULONG ip1 =GetIntIP(szip1);
  41. ULONG ip2 =GetIntIP(szip2);
  42. if(ip1 > ip2) return 1;
  43. else if(ip1 <ip2) return -1;
  44. else return 0;
  45. }
  46. ULONG GetIntIP(char *szip)
  47. {
  48. char *p, *p1;
  49. char ip[16];
  50. int i;
  51. ULONG ii[4];
  52. i =0;
  53. strcpy(ip, szip);
  54. p =ip;
  55. while(*p && i<4)
  56. {
  57. p1 =p;
  58. while(*p && *p !='.') p++;
  59. *p =0;
  60. ii[i] =my_atoi(p1);
  61. p ++;
  62. i++;
  63. }
  64. return ii[0]*256*256*256+ii[1]*256*256+ii[2]*256+ii[3];
  65. }
  66. ULONG my_atoi(char *p)
  67. {
  68. ULONG i;
  69. i =0;
  70. while(*p)
  71. {
  72. i =(i+*p-'0')*10;
  73. p++;
  74. }
  75. i =i/10;
  76. return i;
  77. }
  78. BOOL CALLBACK PasswordDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
  79. {
  80. static PASSWORD_DATA *pdata;
  81. char password[9];
  82. switch(msg)
  83. {
  84. case WM_INITDIALOG:
  85. pdata =(PASSWORD_DATA *)lParam;
  86. SetDlgItemText(hDlg, IDC_APP_NAME, pdata->app_name);
  87. SetWindowPos(hDlg, NULL, 300, 300, 0, 0, SWP_NOSIZE);
  88. SendDlgItemMessage(hDlg, IDE_PASSWORD, EM_SETLIMITTEXT, 8, 0L);
  89. break;
  90. case WM_COMMAND:
  91. switch(LOWORD(wParam))
  92. {
  93. case IDOK:
  94. if(GetDlgItemText(hDlg, IDE_PASSWORD, password, sizeof(password)) ==0)
  95. return TRUE;
  96. strcpy(pdata->p_password, password);
  97. EndDialog(hDlg, IDOK);
  98. break;
  99. case IDCANCEL:
  100. EndDialog(hDlg, IDCANCEL);
  101. }
  102. break;
  103. }
  104. return FALSE;
  105. }
  106. int GetPassword(char *app, char *password)
  107. {
  108. PASSWORD_DATA data;
  109. strcpy(data.app_name, app);
  110. data.p_password =password;
  111. if(DialogBoxParam(g_hInstance, MAKEINTRESOURCE(IDD_PASSWORD), NULL, PasswordDlgProc, (LONG)&data) ==IDCANCEL)
  112. return -1;
  113. return 0;
  114. }
  115. int EncURL(unsigned char *url, int len, char *new_url)
  116. {
  117. int k =0;
  118. for(int i =0; i<len; i++)
  119. {
  120. if(url[i] >127)
  121. {
  122. wsprintf(&new_url[k], "%%%2X", url[i]);
  123. k +=3;
  124. }
  125. else new_url[k++] =url[i];
  126. }
  127. new_url[k] =0;
  128. return k;
  129. }
  130. int FindData(unsigned char *data1, int len1, unsigned char *data2, int len2, int enc_url)
  131. {
  132. int i, len_url;
  133. char url[1024];
  134. //unsigned char *data =new BYTE[len2];
  135. int count =0;
  136. int pos[256], len[256], pos3[256], len3[256];
  137. int k =0;
  138. pos [0] =0;
  139. len [0] =0;
  140. char *p =(char *)data2;
  141. for(i =0; i<len2; i++)
  142. {
  143. if(p[i] !=',') len[k] ++;
  144. else
  145. {
  146. k++;
  147. pos[k] =i+1;
  148. len[k] =0;
  149. }
  150. }
  151. count =k+1;
  152. if(enc_url)
  153. {
  154. len_url =EncURL(data2, len2, url);
  155. k =0;
  156. pos3[0] =0;
  157. len3[0] =0;
  158. char *p =url;
  159. for(i =0; i<len_url; i++)
  160. {
  161. if(p[i] !=',') len3[k] ++;
  162. else
  163. {
  164. k++;
  165. pos3[k] =i+1;
  166. len3[k] =0;
  167. }
  168. }
  169. }
  170. else len_url =len2;
  171. //WriteLog("url =%s,len_url=%dndata1=%sn####len1=%d", url,len_url, data1,len1);
  172. i =0;
  173. while(i+len_url<=len1)
  174. {
  175. for(k =0; k<count; k++)
  176. {
  177. if(len[k] && memcmp(data1+i, data2+pos[k], len[k]) ==0) return i;
  178. }
  179. if(enc_url)
  180. {
  181. for(k =0; k<count; k++)
  182. {
  183. if(len3[k] && memcmp(data1+i, url+pos3[k], len3[k]) ==0) return i;
  184. }
  185. }
  186. i++;
  187. }
  188. //WriteLog("not found!!!");
  189. //delete data;
  190. return -1;
  191. }
  192. //加密例子:使用异或,输出长度不变。
  193. int EncryptData(int algrithm, char *password, unsigned char *inbuf, int inbuf_len, unsigned char *outbuf, int *outbuf_len)
  194. {
  195. int i;
  196. for(i =0; i<inbuf_len-1; i++)
  197. {
  198. outbuf[i] =inbuf[i]^password[i%8];
  199. }
  200. *outbuf_len =inbuf_len;
  201. return *outbuf_len;
  202. }
  203. int DecryptData(int algrithm, char *password, unsigned char *inbuf, int inbuf_len, unsigned char *outbuf, int *outbuf_len)
  204. {
  205. int i;
  206. for(i =0; i<inbuf_len; i++)
  207. {
  208. outbuf[i] =inbuf[i]^password[i%8];
  209. }
  210. *outbuf_len =inbuf_len;
  211. return *outbuf_len;
  212. }
  213. char *upper_case(char *p, int len)
  214. {
  215. for(int i =0; i<len; i++)
  216. {
  217. if(p[i] <='a' && p[i] >='z') p[i] =p[i]+'A'-'a';
  218. }
  219. return p;
  220. }
  221. int mreplace(char *buf, int len, char *str, char c)
  222. {
  223. if(len <=0) return NULL;
  224. int f_found =false;
  225. for(int i =0; i<len-(int)strlen(str); i++)
  226. {
  227. if(strnicmp(&buf[i], str, strlen(str))==0)
  228. {
  229. if(c) memset(&buf[i], c, strlen(str));
  230. f_found =true;
  231. }
  232. }
  233. return f_found;
  234. }
  235. char * GetErrString(char *str, DWORD errcode)
  236. {
  237. LPVOID lpbuf;
  238. if(FormatMessage( 
  239. FORMAT_MESSAGE_ALLOCATE_BUFFER |
  240. FORMAT_MESSAGE_FROM_SYSTEM | 
  241. FORMAT_MESSAGE_IGNORE_INSERTS,
  242. NULL,
  243. errcode,
  244. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  245. (LPTSTR) &lpbuf,
  246. 0,
  247. NULL
  248. ))
  249. {
  250. lstrcpy(str, (char *)lpbuf);
  251. LocalFree(lpbuf);
  252. }
  253. return str;
  254. }
  255. int GetProcessBaseName(HANDLE hProcess, char *name)
  256. {
  257. HMODULE hMods[1024];
  258. DWORD cbNeeded;
  259. //ObtainSeDebugPrivilege();
  260. *name =0;
  261. if( EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded))
  262. {
  263. GetModuleBaseNameA( hProcess, hMods[0], name,128);
  264. }
  265. else
  266. {
  267. char err[256];
  268. WriteLog("EnumProcessModules failed! err=%s", GetErrString(err, GetLastError()));
  269. }
  270. return 0;
  271. }
  272. int split_cmd(char *cmd, char *app, char *file)
  273. {
  274. char cmd2[512];
  275. *app =0;
  276. *file =0;
  277. strcpy(cmd2, cmd);
  278. char *p1, *p=cmd2;
  279. if(*p =='"')
  280. {
  281. p++;
  282. p1 =strtok(p, """);
  283. strcpy(app, p);
  284. if(p1 ==NULL) return 0;
  285. if(*(p1+1) !=' ') return 1;
  286. p =p1+2;
  287. }
  288. else
  289. {
  290. p1 =strtok(p, " ");
  291. strcpy(app, p);
  292. if(p1 ==NULL || *p1 ==NULL) return 1;
  293. p =p1+1;
  294. }
  295. return 0;
  296. }
  297. int MyDecryptFile(char *src_file, char *dst_file, char *password)
  298. {
  299. return 0;
  300. }
  301. char *GetFileNameByHandle(HANDLE hFile, char *name)
  302. {
  303. return NULL;
  304. }