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