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