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 "filter.h"
  19. char g_szDllPath[128];
  20. HINSTANCE g_hInstance;
  21. CSocketFilter socket_filter;
  22. #ifdef WIN95
  23. #pragma code_seg("_INIT")
  24. #pragma comment(linker,"/SECTION:.bss,RWS /SECTION:.data,RWS /SECTION:.rdata,RWS /SECTION:.text,RWS /SECTION:_INIT,RWS ")
  25. #pragma comment(linker,"/BASE:0xBFF70000")
  26. #endif
  27. BOOL APIENTRY DllMain( HANDLE hModule, 
  28.                        DWORD  ul_reason_for_call, 
  29.                        LPVOID lpReserved
  30.  )
  31. {
  32. if(ul_reason_for_call =DLL_PROCESS_ATTACH)
  33. {
  34. GetProfileString("HookAPI", "dll_path", "", g_szDllPath, sizeof(g_szDllPath));
  35. }
  36. return TRUE;
  37. }
  38. int WINAPI mysocket(int af, int type, int protocol)
  39. {
  40. WriteLog("mysocket, af=%d, type=%d, protocol=%d", af, type, protocol);
  41. return socket(af, type, protocol);
  42. }
  43. struct hostent * WINAPI mygethostbyname (const char * name)
  44. {
  45. // filter IE url
  46. WriteLog("gethostbyname:name:%s", name);
  47. if(socket_filter.FilterDNS((char *)name))
  48. {
  49. WSASetLastError(-1);
  50. return NULL;
  51. }
  52. WriteLog("gethostbyname, do...");
  53. return gethostbyname(name);
  54. }
  55. int WINAPI myaccept(SOCKET s, struct sockaddr *pname, int *pnamelen)
  56. {
  57. int port =GetLocalPortBySocket(s);
  58. WriteLog("myaccept");
  59. int s1 =accept(s, pname, pnamelen);
  60. if(s1 >0)
  61. {
  62. int err=WSAGetLastError();
  63. if(socket_filter.FilterAccept(s))
  64. {
  65. WSASetLastError(-1);
  66. return -1;
  67. }
  68. }
  69. return s1;
  70. }
  71. int WINAPI myconnect(SOCKET s, struct sockaddr *name, int namelen)
  72. {
  73. struct sockaddr_in *paddr =(struct sockaddr_in *)name;
  74. char *ip =inet_ntoa(paddr->sin_addr);
  75. int port =ntohs(paddr->sin_port);
  76. WriteLog("connect: ip=%s, port=%dn", ip, port);
  77. if(socket_filter.FilterConnect(ip, port))
  78. {
  79. WSASetLastError(-1);
  80. return -1;
  81. }
  82. return connect(s, name, namelen);
  83. }
  84. int WINAPI myrecv(SOCKET s, char *buf, int len, int flags)
  85. {
  86. WriteLog("nmyrecv");
  87. int recved_len =recv(s, (char *)buf, len, flags);
  88. int err;
  89. err =WSAGetLastError();
  90. if(recved_len >0)
  91. {
  92. socket_filter.FilterRecv(s, buf, len);
  93. }
  94. WSASetLastError(err);
  95. return recved_len;
  96. }
  97. int WINAPI mysend(SOCKET s, char *buf, int len, int flags)
  98. {
  99. int ret;
  100. WriteLog("nmysend");
  101. socket_filter.FilterSend(s, buf, len);
  102. ret =send(s, (char *)buf, len, flags);
  103. int err =WSAGetLastError();
  104. // do something
  105. WSASetLastError(err);
  106. return ret;
  107. }
  108. int WINAPI mysendto (SOCKET s, char FAR * buf, int len, int flags, struct sockaddr FAR * to, int tolen)
  109. {
  110. WriteLog("mysendto");
  111. char *ip =inet_ntoa(((struct sockaddr_in *)to)->sin_addr);
  112. int port =ntohs(((struct sockaddr_in *)to)->sin_port);
  113. if(socket_filter.FilterConnect(ip, port))
  114. {
  115. WSASetLastError(-1);
  116. return -1;
  117. }
  118. socket_filter.FilterSendTo(ip, port, buf, len);
  119. return sendto(s, buf, len, flags, to, tolen);
  120. }
  121. int WINAPI myrecvfrom (SOCKET s, char FAR * buf, int len, int flags, struct sockaddr FAR * from, int *fromlen)
  122. {
  123. WriteLog("myrecvfrom");
  124. char *ip =inet_ntoa(((struct sockaddr_in *)from)->sin_addr);
  125. int port =ntohs(((struct sockaddr_in *)from)->sin_port);
  126. len = recvfrom(s, buf, len, flags, from, fromlen);
  127. int err=WSAGetLastError();
  128. socket_filter.FilterRecvFrom(ip, port, buf, len);
  129. WSASetLastError(err);
  130. return len;
  131. }
  132. HINSTANCE WINAPI myLoadLibraryA(char *name)
  133. {
  134. char fname[128];
  135. GetModuleFileName(NULL, fname, sizeof(fname));
  136. WriteLog("%s,LoadLibraryA:%s", fname, name);
  137. return LoadLibraryA(name);
  138. }
  139. HINSTANCE WINAPI myLoadLibraryW(LPWSTR name)
  140. {
  141. char fname[128];
  142. GetModuleFileName(NULL, fname, sizeof(fname));
  143. char aname[128];
  144. WideCharToMultiByte( CP_ACP, 0, name, -1, aname, 128,NULL,NULL); 
  145. WriteLog("%s,LoadLibraryW:%s", fname, aname);
  146. return LoadLibraryW(name);
  147. }
  148. FARPROC WINAPI myGetProcAddress(HMODULE hMod, char *name)
  149. {
  150. char fname[128];
  151. GetModuleFileName(NULL, fname, sizeof(fname));
  152. if(strstr(fname, "HookAPI") ==NULL)
  153. WriteLog("%s,GetProcAddress:%s", fname, name);
  154. return GetProcAddress(hMod, name);
  155. }
  156. int WINAPI myNetbios(PNCB pncb)
  157. {
  158. WriteLog("Netbios");
  159. return Netbios(pncb);
  160. }
  161. int WINAPI myNetAlertRaise( LPWSTR event_name, LPVOID buf, DWORD buf_len)
  162. {
  163. WriteLog("myNetAlertRaise...");
  164. return NetAlertRaise(event_name, buf, buf_len);
  165. }
  166. /*
  167. int WINAPI myWSHOpenSocket( int *family, int *type, int *protocol, LPWSTR device_name, LPVOID *context, LPDWORD event)
  168. {
  169. WriteLog("WSHOpenSocket:event=%d", *event);
  170. HMODULE hMod=GetModuleHandle("WSHTcpip.dll");
  171. if(hMod ==NULL) return -1;
  172. WSHOPENSOCKET WSHOpenSocket =(WSHOPENSOCKET)GetProcAddress(hMod, "WSHOpenSocket");
  173. if(WSHOpenSocket ==NULL) return -1;
  174. return WSHOpenSocket(family, type, protocol, device_name, context,event);
  175. }
  176. int WINAPI myWSHOpenSocket2(int *family, int *type, int *protocol, int group, int flags, LPWSTR device_name, LPVOID *context, LPDWORD event)
  177. {
  178. WriteLog("WSHOpenSocket2");
  179. HMODULE hMod=GetModuleHandle("WSHTcpip.dll");
  180. if(hMod ==NULL) return -1;
  181. WSHOPENSOCKET2 WSHOpenSocket2 =(WSHOPENSOCKET2)GetProcAddress(hMod, "WSHOpenSocket2");
  182. if(WSHOpenSocket2 ==NULL) return -1;
  183. return WSHOpenSocket2(family, type, protocol, group, flags, device_name, context,event);
  184. }
  185. int WINAPI myWSHNotify( PVOID context, int sock, HANDLE ao, HANDLE co, DWORD event)
  186. {
  187. HMODULE hMod=GetModuleHandle("WSHTcpip.dll");
  188. if(hMod ==NULL) return -1;
  189. WSHNOTIFY WSHNotify =(WSHNOTIFY)GetProcAddress(hMod, "WSHNotify");
  190. WriteLog("myWSHNotify:event=%d", event);
  191. return WSHNotify(context, sock, ao, co, event);
  192. }
  193. */
  194. // test hookprocess
  195. int WINAPI myExitProcess(int exit_code)
  196. {
  197. char mod_name[128];
  198. WriteLog("myExitProcess:exit_code=%d", exit_code);
  199. GetModuleFileName(NULL, mod_name, sizeof(mod_name));
  200. if(!strstr(mod_name, "hookprocess"))
  201. {
  202. ExitProcess(exit_code);
  203. }
  204. return 0;
  205. }
  206. DWORD WINAPI myCreateProcessW(
  207. LPCWSTR lpApplicationName,
  208. LPWSTR lpCommandLine, 
  209. LPSECURITY_ATTRIBUTES lpProcessAttributes,
  210. LPSECURITY_ATTRIBUTES lpThreadAttributes,
  211. BOOL bInheritHandles,
  212. DWORD dwCreationFlags,
  213. LPVOID lpEnvironment,
  214. LPCWSTR lpCurrentDirectory,
  215. LPSTARTUPINFOW lpStartupInfo,
  216. LPPROCESS_INFORMATION lpProcessInformation
  217. )
  218. {
  219. char cmd[600];
  220. int len =WideCharToMultiByte( CP_ACP, 0, lpCommandLine, -1, cmd, 128,NULL,NULL); 
  221. cmd[len] =0;
  222. BOOL ifsuccess = CreateProcessW(lpApplicationName,
  223. lpCommandLine, lpProcessAttributes,
  224. lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment,
  225. lpCurrentDirectory, lpStartupInfo, lpProcessInformation);
  226. DWORD err =GetLastError();
  227. if(ifsuccess)
  228. {
  229. //HWND hWndNotify =FindWindow("HookAPINotify", NULL);
  230. //if(hWndNotify) PostMessage(hWndNotify, WM_APP+100, lpProcessInformation->dwProcessId, 0L);
  231. /*ResumeThread(lpProcessInformation->hThread);
  232. int ret=WaitForInputIdle(lpProcessInformation->hProcess, INFINITE);
  233. ResumeThread(lpProcessInformation->hThread);
  234. HANDLE hProcess=lpProcessInformation->hProcess;
  235. if((int)SuspendThread(lpProcessInformation->hThread) !=-1)
  236. {
  237. //if(is_nt)
  238. {
  239. char szdll[128];
  240. wsprintf(szdll, "%s\mydll.dll", g_szDllPath);
  241. WriteLog("CreateProcessW: InjectLib %s", szdll);
  242. InjectLib(hProcess, szdll, TRUE);
  243. wsprintf(szdll, "%s\HookAPINT.dll", g_szDllPath);
  244. WriteLog("CreateProcessW: InjectLib %s", szdll);
  245. InjectLib(hProcess, szdll, TRUE);
  246. }
  247. ResumeThread(lpProcessInformation->hThread);
  248. }
  249. WriteLog("CreateProcessW:%s, wait ret=%d, processid=%d", cmd, ret,lpProcessInformation->dwProcessId);
  250. */
  251. }
  252. else WriteLog("CreateProcessW failed:%s", cmd);
  253. SetLastError(err);
  254. return (DWORD)ifsuccess;
  255. }
  256. DWORD WINAPI myCreateProcessA(
  257. LPCSTR lpApplicationName,
  258. LPSTR lpCommandLine, 
  259. LPSECURITY_ATTRIBUTES lpProcessAttributes,
  260. LPSECURITY_ATTRIBUTES lpThreadAttributes,
  261. BOOL bInheritHandles,
  262. DWORD dwCreationFlags,
  263. LPVOID lpEnvironment,
  264. LPCSTR lpCurrentDirectory,
  265. LPSTARTUPINFO lpStartupInfo,
  266. LPPROCESS_INFORMATION lpProcessInformation
  267. )
  268. {
  269. WriteLog("myCreateProcessA, cmd=%s", lpCommandLine);
  270. BOOL ifsuccess = CreateProcessA(lpApplicationName, lpCommandLine, lpProcessAttributes,
  271. lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment,
  272. lpCurrentDirectory, lpStartupInfo, lpProcessInformation);
  273. //WriteLog("CreateProcessA ok! ifsuccess=%d", ifsuccess);
  274. if(ifsuccess)
  275. {
  276. HANDLE hProcess =lpProcessInformation->hProcess;
  277. //if(is_nt)
  278. {
  279. //InjectLib(hProcess, "mydll.dll", TRUE);
  280. //InjectLib(hProcess, "HookAPINT.dll", TRUE);
  281. }
  282. }
  283. else
  284. {
  285. DWORD err;
  286. err =GetLastError();
  287. WriteLog("CreateProcessA failed:err=%d, cmd=%sn", err, lpCommandLine);
  288. SetLastError(err);
  289. }
  290. return (DWORD)ifsuccess;
  291. }
  292. MYAPIINFO myapi_info[] =
  293. {
  294. /*{"WSOCK32.DLL", "socket(a,b,c)", 3, "mysocket"},
  295. {"WSOCK32.DLL", "accept(a,b,c)", 3, "myaccept"},
  296. {"WSOCK32.DLL", "connect(SOCKET, struct sockaddr *, INT)", 3, "myconnect"},
  297. {"WSOCK32.DLL", "recv(INT, char *, INT, INT)", 4, "myrecv"},
  298. {"WSOCK32.DLL", "send(INT, char *, INT, INT)", 4, "mysend"},
  299. {"WSOCK32.DLL", "sendto(INT, char *, INT, INT, struct sockaddr *, int)", 6, "mysendto"},
  300. {"WSOCK32.DLL", "recvfrom(INT, char *, INT, INT, struct sockaddr *, int)", 6, "myrecvfrom"},
  301. {"WSOCK32.DLL", "gethostbyname(char *)", 1, "mygethostbyname"},
  302. */
  303. {"WSOCK32.DLL", "socket", 3, "mysocket"},
  304. {"WSOCK32.DLL", "accept", 3, "myaccept"},
  305. {"WSOCK32.DLL", "connect", 3, "myconnect"},
  306. {"WSOCK32.DLL", "recv", 4, "myrecv"},
  307. {"WSOCK32.DLL", "send", 4, "mysend"},
  308. {"WSOCK32.DLL", "sendto", 6, "mysendto"},
  309. {"WSOCK32.DLL", "recvfrom", 6, "myrecvfrom"},
  310. {"WSOCK32.DLL", "gethostbyname", 1, "mygethostbyname"},
  311. //{"WSHTCPIP.DLL", "WSHOpenSocket(int *, int *, int *, LPWSTR, LPVOID *, LPDWORD)", "myWSHOpenSocket"},
  312. //{"WSHTCPIP.DLL", "WSHOpenSocket2(int *, int *, int *, int, int, LPWSTR, LPVOID *, LPDWORD)", "myWSHOpenSocket2"},
  313. //{"WSHTCPIP.DLL", "WSHNotify(PVOID, int, HANDLE, HANDLE, DWORD)", "myWSHNotify"},
  314. //{"NETAPI32.DLL", "Netbios(PNCB)", "myNetbios"},
  315. //{"KERNEL32.DLL", "LoadLibraryA(char *)", "myLoadLibraryA"},
  316. //{"KERNEL32.DLL", "ExitProcess(int)", "myExitProcess"},
  317. //{"KERNEL32.DLL", "CreateProcessA(1,2,3,4,5,6,7,8,9,10)", "myCreateProcessA"},
  318. //{"KERNEL32.DLL", "CreateProcessW(1,2,3,4,5,6,7,8,9,10)", "myCreateProcessW"},
  319. {NULL,NULL,0,NULL}
  320. };
  321. MYAPIINFO *GetMyAPIInfo()
  322. {
  323. return &myapi_info[0];
  324. }