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

钩子与API截获

开发平台:

Visual C++

  1. // ------------------------------------- //
  2. // 您如果要使用本文件,请不要删除本说明  //
  3. // ------------------------------------- //
  4. //             HOOKAPI 开发例子          //
  5. //   Copyright 2002 编程沙龙 Paladin     //
  6. //       www.ProgramSalon.com            //
  7. // ------------------------------------- //
  8. #include "stdafx.h"
  9. #include <winsock2.h>
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <time.h>
  13. #include <lmcons.h>
  14. #include <lmalert.h>
  15. #include "mydll.h"
  16. #include <nb30.h>
  17. #include "util.h"
  18. #include "const.h"
  19. #include "cryptfilter.h"
  20. CryptFilter g_CryptFilter;
  21. BOOL APIENTRY DllMain( HANDLE hModule, 
  22.                        DWORD  ul_reason_for_call, 
  23.                        LPVOID lpReserved
  24.  )
  25. {
  26. switch(ul_reason_for_call)
  27. {
  28. case DLL_PROCESS_ATTACH:
  29. GetProfileString("HookAPI", "dll_path", "", g_szDllPath, sizeof(g_szDllPath));
  30. GetFileName(g_szAppBaseName);
  31. strupr(g_szAppBaseName);
  32. break;
  33. }
  34. return TRUE;
  35. }
  36. int WINAPI mysocket(int af, int type, int protocol)
  37. {
  38. WriteLog("mysocket, af=%d, type=%d, protocol=%d", af, type, protocol);
  39. return socket(af, type, protocol);
  40. }
  41. struct hostent * WINAPI mygethostbyname (const char * name)
  42. {
  43. // filter IE url
  44. WriteLog("gethostbyname:name:%s", name);
  45. return gethostbyname(name);
  46. }
  47. int WINAPI myaccept(SOCKET s, struct sockaddr *pname, int *pnamelen)
  48. {
  49. int port =GetLocalPortBySocket(s);
  50. WriteLog("myaccept");
  51. int s1 =accept(s, pname, pnamelen);
  52. if(s1 >0)
  53. {
  54. int ov, len =sizeof(ov);
  55. getsockopt(s1, SOL_SOCKET, SO_ACCEPTCONN, (char *)&ov, &len);
  56. WriteLog("accept...%d", ov); 
  57. }
  58. return s1;
  59. }
  60. int WINAPI myconnect(SOCKET s, struct sockaddr *name, int namelen)
  61. {
  62. struct sockaddr_in *paddr =(struct sockaddr_in *)name;
  63. char *ip =inet_ntoa(paddr->sin_addr);
  64. int port =ntohs(paddr->sin_port);
  65. WriteLog("connect: ip=%s, port=%dn", ip, port);
  66. // check filter
  67. return connect(s, name, namelen);
  68. }
  69. // 这种mysend和这种myrecv支持异步方式
  70. int WINAPI myrecv(SOCKET s, char *buf, int len, int flags)
  71. {
  72. WriteLog("nmyrecv");
  73. int f_crypted;
  74. int port =GetLocalPortBySocket(s);
  75. int port1 =GetRemotePortBySocket(s);
  76. char ip[16];
  77. GetRemoteIPBySocket(s, ip);
  78. char *buf1 =NULL;
  79. int recved_len;
  80. int ret;
  81. int err;
  82. f_crypted =g_CryptFilter.CryptCheck(ip, port, port1);
  83. if(f_crypted)
  84. {
  85. buf1 =(char *)malloc(len*2);
  86. int len2;
  87. if(recv(s, (char *)&len2, sizeof(len2), flags) !=sizeof(len2))
  88. {
  89. err =WSAGetLastError();
  90. free(buf1);
  91. WSASetLastError(err);
  92. return -1;
  93. }
  94. len =ntohl(len2);
  95. WriteLog("myrecv:len=%d", len);
  96. int len1;
  97. time_t t1, t2;
  98. time(&t1);
  99. t2 =t1;
  100. recved_len =0;
  101. while(t2-t1 <10 && recved_len <len)
  102. {
  103. len2 =recv(s, (char *)buf, len-recved_len, flags);
  104. if(len2 >0)
  105. recved_len +=len2;
  106. time(&t2);
  107. }
  108. err =WSAGetLastError();
  109. WriteLog("recved_len:%d", recved_len);
  110. if(recved_len <=0)
  111. {
  112. free(buf1);
  113. WSASetLastError(err);
  114. return -1;
  115. }
  116. WriteLog("DecryptData...");
  117. ret =g_CryptFilter.DecryptData(buf, recved_len, buf1, &len1);
  118. if(ret >0)
  119. {
  120. memcpy(buf, buf1, len1);
  121. recved_len =len1;
  122. }
  123. else if(ret <0)
  124. {
  125. free(buf1);
  126. WSASetLastError(-1);
  127. return -1;
  128. }
  129. WriteLog("DecryptData ret:%d", ret);
  130. free(buf1);
  131. WSASetLastError(err);
  132. }
  133. else
  134. recved_len =recv(s, (char *)buf, len, flags);
  135. return recved_len;
  136. }
  137. int WINAPI mysend(SOCKET s, char *buf, int len, int flags)
  138. {
  139. WriteLog("nmysend");
  140. int f_crypted;
  141. int port =GetLocalPortBySocket(s);
  142. int port1 =GetRemotePortBySocket(s);
  143. char ip[16];
  144. GetRemoteIPBySocket(s, ip);
  145. char *buf1 =NULL;
  146. int ret, ret_len =len;
  147. f_crypted =g_CryptFilter.CryptCheck(ip, port, port1);
  148. if(f_crypted)
  149. {
  150. buf1 =(char *)malloc(len*2);
  151. int len1;
  152. WriteLog("CryptData...");
  153. ret =g_CryptFilter.CryptData(buf, len, buf1, &len1);
  154. if(ret >0)
  155. {
  156. memcpy(buf, buf1, len1);
  157. len =len1;
  158. }
  159. else if(ret <0)
  160. {
  161. free(buf1);
  162. WSASetLastError(-1);
  163. return -1;
  164. }
  165. WriteLog("Crypt ret:%d", ret);
  166. free(buf1);
  167. int len2 =htonl(len);
  168. if(send(s, (char *)&len2, sizeof(len2), flags) !=sizeof(len2))
  169. return -1;
  170. WriteLog("send len=%d", len);
  171. }
  172. if(send(s, (char *)buf, len, flags) !=len)
  173. ret_len =-1;
  174. return ret_len;
  175. }
  176. int WINAPI mysendto (SOCKET s, char FAR * buf, int len, int flags, struct sockaddr FAR * to, int tolen)
  177. {
  178. WriteLog("mysendto");
  179. return sendto(s, buf, len, flags, to, tolen);
  180. }
  181. int WINAPI myrecvfrom (SOCKET s, char FAR * buf, int len, int flags, struct sockaddr FAR * from, int *fromlen)
  182. {
  183. WriteLog("mysendto");
  184. return recvfrom(s, buf, len, flags, from, fromlen);
  185. }
  186. HINSTANCE WINAPI myLoadLibraryA(char *name)
  187. {
  188. char fname[128];
  189. GetModuleFileName(NULL, fname, sizeof(fname));
  190. WriteLog("%s,LoadLibraryA:%s", fname, name);
  191. return LoadLibraryA(name);
  192. }
  193. HINSTANCE WINAPI myLoadLibraryW(LPWSTR name)
  194. {
  195. char fname[128];
  196. GetModuleFileName(NULL, fname, sizeof(fname));
  197. char aname[128];
  198. WideCharToMultiByte( CP_ACP, 0, name, -1, aname, 128,NULL,NULL); 
  199. WriteLog("%s,LoadLibraryW:%s", fname, aname);
  200. return LoadLibraryW(name);
  201. }
  202. FARPROC WINAPI myGetProcAddress(HMODULE hMod, char *name)
  203. {
  204. char fname[128];
  205. GetModuleFileName(NULL, fname, sizeof(fname));
  206. if(strstr(fname, "HookAPI") ==NULL)
  207. WriteLog("%s,GetProcAddress:%s", fname, name);
  208. return GetProcAddress(hMod, name);
  209. }
  210. int WINAPI myNetbios(PNCB pncb)
  211. {
  212. WriteLog("Netbios");
  213. return Netbios(pncb);
  214. }
  215. int WINAPI myNetAlertRaise( LPWSTR event_name, LPVOID buf, DWORD buf_len)
  216. {
  217. WriteLog("myNetAlertRaise...");
  218. return NetAlertRaise(event_name, buf, buf_len);
  219. }
  220. int WINAPI myWSHOpenSocket( int *family, int *type, int *protocol, LPWSTR device_name, LPVOID *context, LPDWORD event)
  221. {
  222. WriteLog("WSHOpenSocket:event=%d", *event);
  223. HMODULE hMod=GetModuleHandle("WSHTcpip.dll");
  224. if(hMod ==NULL) return -1;
  225. WSHOPENSOCKET WSHOpenSocket =(WSHOPENSOCKET)GetProcAddress(hMod, "WSHOpenSocket");
  226. if(WSHOpenSocket ==NULL) return -1;
  227. return WSHOpenSocket(family, type, protocol, device_name, context,event);
  228. }
  229. int WINAPI myWSHOpenSocket2(int *family, int *type, int *protocol, int group, int flags, LPWSTR device_name, LPVOID *context, LPDWORD event)
  230. {
  231. WriteLog("WSHOpenSocket2");
  232. HMODULE hMod=GetModuleHandle("WSHTcpip.dll");
  233. if(hMod ==NULL) return -1;
  234. WSHOPENSOCKET2 WSHOpenSocket2 =(WSHOPENSOCKET2)GetProcAddress(hMod, "WSHOpenSocket2");
  235. if(WSHOpenSocket2 ==NULL) return -1;
  236. return WSHOpenSocket2(family, type, protocol, group, flags, device_name, context,event);
  237. }
  238. int WINAPI myWSHNotify( PVOID context, int sock, HANDLE ao, HANDLE co, DWORD event)
  239. {
  240. HMODULE hMod=GetModuleHandle("WSHTcpip.dll");
  241. if(hMod ==NULL) return -1;
  242. WSHNOTIFY WSHNotify =(WSHNOTIFY)GetProcAddress(hMod, "WSHNotify");
  243. WriteLog("myWSHNotify:event=%d", event);
  244. return WSHNotify(context, sock, ao, co, event);
  245. }
  246. // test hookprocess
  247. int WINAPI myExitProcess(int exit_code)
  248. {
  249. char mod_name[128];
  250. WriteLog("myExitProcess:exit_code=%d", exit_code);
  251. GetModuleFileName(NULL, mod_name, sizeof(mod_name));
  252. if(!strstr(mod_name, "hookprocess"))
  253. {
  254. ExitProcess(exit_code);
  255. }
  256. return 0;
  257. }
  258. DWORD WINAPI myCreateProcessW(
  259. LPCWSTR lpApplicationName,
  260. LPWSTR lpCommandLine, 
  261. LPSECURITY_ATTRIBUTES lpProcessAttributes,
  262. LPSECURITY_ATTRIBUTES lpThreadAttributes,
  263. BOOL bInheritHandles,
  264. DWORD dwCreationFlags,
  265. LPVOID lpEnvironment,
  266. LPCWSTR lpCurrentDirectory,
  267. LPSTARTUPINFOW lpStartupInfo,
  268. LPPROCESS_INFORMATION lpProcessInformation
  269. )
  270. {
  271. char cmd[600];
  272. int len =WideCharToMultiByte( CP_ACP, 0, lpCommandLine, -1, cmd, 128,NULL,NULL); 
  273. cmd[len] =0;
  274. BOOL ifsuccess = CreateProcessW(lpApplicationName,
  275. lpCommandLine, lpProcessAttributes,
  276. lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment,
  277. lpCurrentDirectory, lpStartupInfo, lpProcessInformation);
  278. DWORD err =GetLastError();
  279. if(ifsuccess)
  280. {
  281. //HWND hWndNotify =FindWindow("HookAPINotify", NULL);
  282. //if(hWndNotify) PostMessage(hWndNotify, WM_APP+100, lpProcessInformation->dwProcessId, 0L);
  283. /*ResumeThread(lpProcessInformation->hThread);
  284. int ret=WaitForInputIdle(lpProcessInformation->hProcess, INFINITE);
  285. ResumeThread(lpProcessInformation->hThread);
  286. HANDLE hProcess=lpProcessInformation->hProcess;
  287. if((int)SuspendThread(lpProcessInformation->hThread) !=-1)
  288. {
  289. //if(is_nt)
  290. {
  291. char szdll[128];
  292. wsprintf(szdll, "%s\mydll.dll", g_szDllPath);
  293. WriteLog("CreateProcessW: InjectLib %s", szdll);
  294. InjectLib(hProcess, szdll, TRUE);
  295. wsprintf(szdll, "%s\HookAPINT.dll", g_szDllPath);
  296. WriteLog("CreateProcessW: InjectLib %s", szdll);
  297. InjectLib(hProcess, szdll, TRUE);
  298. }
  299. ResumeThread(lpProcessInformation->hThread);
  300. }
  301. WriteLog("CreateProcessW:%s, wait ret=%d, processid=%d", cmd, ret,lpProcessInformation->dwProcessId);
  302. */
  303. }
  304. else WriteLog("CreateProcessW failed:%s", cmd);
  305. SetLastError(err);
  306. return (DWORD)ifsuccess;
  307. }
  308. DWORD WINAPI myCreateProcessA(
  309. LPCSTR lpApplicationName,
  310. LPSTR lpCommandLine, 
  311. LPSECURITY_ATTRIBUTES lpProcessAttributes,
  312. LPSECURITY_ATTRIBUTES lpThreadAttributes,
  313. BOOL bInheritHandles,
  314. DWORD dwCreationFlags,
  315. LPVOID lpEnvironment,
  316. LPCSTR lpCurrentDirectory,
  317. LPSTARTUPINFO lpStartupInfo,
  318. LPPROCESS_INFORMATION lpProcessInformation
  319. )
  320. {
  321. WriteLog("myCreateProcessA, cmd=%s", lpCommandLine);
  322. BOOL ifsuccess = CreateProcessA(lpApplicationName, lpCommandLine, lpProcessAttributes,
  323. lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment,
  324. lpCurrentDirectory, lpStartupInfo, lpProcessInformation);
  325. //WriteLog("CreateProcessA ok! ifsuccess=%d", ifsuccess);
  326. if(ifsuccess)
  327. {
  328. HANDLE hProcess =lpProcessInformation->hProcess;
  329. //if(is_nt)
  330. {
  331. //InjectLib(hProcess, "mydll.dll", TRUE);
  332. //InjectLib(hProcess, "HookAPINT.dll", TRUE);
  333. }
  334. }
  335. else
  336. {
  337. DWORD err;
  338. err =GetLastError();
  339. WriteLog("CreateProcessA failed:err=%d, cmd=%sn", err, lpCommandLine);
  340. SetLastError(err);
  341. }
  342. return (DWORD)ifsuccess;
  343. }
  344. MYAPIINFO myapi_info[] =
  345. {
  346. {"WSOCK32.DLL", "socket(a,b,c)", "mysocket"},
  347. {"WSOCK32.DLL", "accept(a,b,c)", "myaccept"},
  348. {"WSOCK32.DLL", "connect(SOCKET, struct sockaddr *, INT)", "myconnect"},
  349. {"WSOCK32.DLL", "recv(INT, char *, INT, INT)", "myrecv"},
  350. {"WSOCK32.DLL", "send(INT, char *, INT, INT)", "mysend"},
  351. {"WSOCK32.DLL", "sendto(INT, char *, INT, INT, struct sockaddr *, int)", "mysendto"},
  352. {"WSOCK32.DLL", "recvfrom(INT, char *, INT, INT, struct sockaddr *, int)", "myrecvfrom"},
  353. {"WSOCK32.DLL", "gethostbyname(char *)", "mygethostbyname"},
  354. //{"WSHTCPIP.DLL", "WSHOpenSocket(int *, int *, int *, LPWSTR, LPVOID *, LPDWORD)", "myWSHOpenSocket"},
  355. //{"WSHTCPIP.DLL", "WSHOpenSocket2(int *, int *, int *, int, int, LPWSTR, LPVOID *, LPDWORD)", "myWSHOpenSocket2"},
  356. //{"WSHTCPIP.DLL", "WSHNotify(PVOID, int, HANDLE, HANDLE, DWORD)", "myWSHNotify"},
  357. //{"NETAPI32.DLL", "Netbios(PNCB)", "myNetbios"},
  358. //{"KERNEL32.DLL", "LoadLibraryA(char *)", "myLoadLibraryA"},
  359. //{"KERNEL32.DLL", "ExitProcess(int)", "myExitProcess"},
  360. //{"KERNEL32.DLL", "CreateProcessA(1,2,3,4,5,6,7,8,9,10)", "myCreateProcessA"},
  361. //{"KERNEL32.DLL", "CreateProcessW(1,2,3,4,5,6,7,8,9,10)", "myCreateProcessW"},
  362. {NULL,NULL,NULL}
  363. };
  364. MYAPIINFO *GetMyAPIInfo()
  365. {
  366. return &myapi_info[0];
  367. }