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