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