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. // 编译提示:如果是Win9x系统,需要预定义WIN95 //
  8. // ------------------------------------- //
  9. #include "stdafx.h"
  10. #include <winsock.h>
  11. #include <io.h>
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <time.h>
  15. #include <shellapi.h>
  16. //#include <lmcons.h>
  17. //#include <lmalert.h>
  18. #include "../dll/mydll.h"
  19. //#include <nb30.h>
  20. #include <ras.h>
  21. #include "util.h"
  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. HINSTANCE g_hInstance;
  28. // 如果是win9x,不能使用fopen函数
  29. int WriteBinData(char *function, char *buf, int len)
  30. {
  31. char mod_name[100];
  32. char fname[128];
  33. if(len <=0) return 0;
  34. GetFileName(mod_name);
  35. wsprintf(fname, "c:\%s.log", mod_name);
  36. HANDLE hFile;
  37. if((hFile =CreateFile(fname, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)) <0)
  38. {
  39. WriteLog("open file %s failed", fname);
  40. return -1;
  41. }
  42. SetFilePointer(hFile, 0, NULL, FILE_END);
  43. char temp[2048];
  44. wsprintf(temp, "rn(%s,len=%d) ", function, len);
  45. DWORD dw;
  46. WriteFile(hFile, temp, strlen(temp), &dw, NULL);
  47. for(int i =0; i<len; i++)
  48. {
  49. if(isgraph(buf[i]&0x00FF))
  50. wsprintf(temp, "%c", buf[i]&0x00FF);
  51. else
  52.     wsprintf(temp, "(%02x)", buf[i]&0x00FF);
  53. WriteFile(hFile, temp, strlen(temp), &dw, NULL);
  54. }
  55. CloseHandle(hFile);
  56. return 0;
  57. }
  58. int GetLocalPortBySocket(SOCKET s)
  59. {
  60. struct sockaddr name;
  61. int namelen =sizeof(name);
  62. getsockname(s, &name, &namelen);
  63. return ntohs(((struct sockaddr_in *)&name)->sin_port);
  64. }
  65. int GetLocalIPBySocket(SOCKET s, char *ip)
  66. {
  67. struct sockaddr name;
  68. int namelen =sizeof(name);
  69. getsockname(s, &name, &namelen);
  70. strcpy(ip, inet_ntoa(((struct sockaddr_in *)&name)->sin_addr));
  71. return 0;
  72. }
  73. int GetRemotePortBySocket(SOCKET s)
  74. {
  75. struct sockaddr name;
  76. int namelen =sizeof(name);
  77. getpeername(s, &name, &namelen);
  78. return ntohs(((struct sockaddr_in *)&name)->sin_port);
  79. }
  80. int GetIPAndPortByAddr(struct sockaddr *paddr, char *ip, int *port)
  81. {
  82. *ip =0;
  83. *port =0;
  84. if(paddr ==NULL) return -1;
  85. strcpy(ip, inet_ntoa(((struct sockaddr_in *)paddr)->sin_addr));
  86. *port =ntohs(((struct sockaddr_in *)paddr)->sin_port);
  87. return 0;
  88. }
  89. int GetRemoteIPBySocket(SOCKET s, char *ip)
  90. {
  91. struct sockaddr name;
  92. int namelen =sizeof(name);
  93. getpeername(s, &name, &namelen);
  94. strcpy(ip, inet_ntoa(((struct sockaddr_in *)&name)->sin_addr));
  95. return 0;
  96. }
  97. int WINAPI mysocket(int af, int type, int protocol)
  98. {
  99. //Sleep(500);// test for multithread
  100. WriteLog("debug mysocket, af=%d, type=%d, protocol=%d", af, type, protocol);
  101. return socket(af, type, protocol);
  102. }
  103. struct hostent * WINAPI mygethostbyname (const char * name)
  104. {
  105. // filter IE url
  106. //MessageBox(NULL, "mydll:mygethostbyname called", name, MB_OK);
  107. WriteLog("gethostbyname:name:%s", name);
  108. return gethostbyname(name);
  109. }
  110. int WINAPI myaccept(SOCKET s, struct sockaddr *pname, int *pnamelen)
  111. {
  112. //WriteLog("myaccept");
  113. int port =GetLocalPortBySocket(s);
  114. int s1 =accept(s, pname, pnamelen);
  115. if(s1 >0)
  116. {
  117. // check filter 
  118. }
  119. return s1;
  120. }
  121. int WINAPI myconnect(SOCKET s, struct sockaddr *name, int namelen)
  122. {
  123. WriteLog("myconnect");
  124. struct sockaddr_in *paddr =(struct sockaddr_in *)name;
  125. char *ip =inet_ntoa(paddr->sin_addr);
  126. int port =ntohs(paddr->sin_port);
  127. WriteLog("connect: ip=%s, port=%drn", ip, port);
  128. char temp[50];
  129. wsprintf(temp, "ip=%s, port=%drn", ip, port);
  130. WriteBinData("connect", temp, strlen(temp));
  131. BYTE *p =(BYTE *)GetProcAddress(GetModuleHandle("ws2_32.dll"), "recv");
  132. if(p)
  133. {
  134. sprintf(temp, "my connect: data of recv=%x:%x %x %x %x %x", p, p[0], p[1],p[2],p[3],p[4]);
  135. WriteLog(temp);
  136. }
  137. // check filter
  138. return connect(s, name, namelen);
  139. }
  140. int WINAPI myrecv(SOCKET s, char *buf, int len, int flags)
  141. {
  142. WriteLog("myrecv, len:%d", len);
  143. int recved_len =recv(s, (char *)buf, len, flags);
  144. int err;
  145. if(recved_len <=0) err =WSAGetLastError();
  146. int port =GetLocalPortBySocket(s);
  147. int port1 =GetRemotePortBySocket(s);
  148. char ip[16];
  149. GetRemoteIPBySocket(s, ip);
  150. char temp[200];
  151. wsprintf(temp, "ip:%s, local_port:%d, remote_port:%d", ip, port, port1);
  152. WriteBinData("recv", temp, strlen(temp));
  153. WriteBinData("recv", buf, recved_len);
  154. BYTE *p =(BYTE *)GetProcAddress(GetModuleHandle("ws2_32.dll"), "recv");
  155. if(p)
  156. {
  157. sprintf(temp, "myrecv: data of recv=%x:%x %x %x %x %x", p, p[0], p[1],p[2],p[3],p[4]);
  158. WriteLog(temp);
  159. }
  160. if(recved_len <=0) WSASetLastError(err);
  161. return recved_len;
  162. }
  163. int WINAPI mysend(SOCKET s, char *buf, int len, int flags)
  164. {
  165. int ret;
  166. WriteLog("mysend, len:%d", len);
  167. int port =GetLocalPortBySocket(s);
  168. int port1 =GetRemotePortBySocket(s);
  169. char ip[16];
  170. GetRemoteIPBySocket(s, ip);
  171. char temp[200];
  172. wsprintf(temp, "ip:%s, local_port:%d, remote_port:%d", ip, port, port1);
  173. WriteBinData("send", temp, strlen(temp));
  174. WriteBinData("send", buf, len);
  175. BYTE *p =(BYTE *)GetProcAddress(GetModuleHandle("ws2_32.dll"), "recv");
  176. if(p)
  177. {
  178. sprintf(temp, "mysend data of recv=%x:%x %x %x %x %x", p, p[0], p[1],p[2],p[3],p[4]);
  179. WriteLog(temp);
  180. }
  181. ret =send(s, (char *)buf, len, flags);
  182. int err;
  183. if(ret <=0) err =WSAGetLastError();
  184. // other process...
  185. if(ret <=0) WSASetLastError(err);
  186. return ret;
  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. int port;
  192. char ip[16];
  193. char temp[200];
  194. GetIPAndPortByAddr(to, ip, &port);
  195. sprintf(temp, "ip:%s, remote_port:%d", ip, port);
  196. WriteBinData("sendto", temp, strlen(temp));
  197. WriteBinData("sendto", buf, len);
  198. BYTE *p =(BYTE *)GetProcAddress(GetModuleHandle("ws2_32.dll"), "recv");
  199. if(p)
  200. {
  201. sprintf(temp, "data of recv=%x:%x %x %x %x %x", p, p[0], p[1],p[2],p[3],p[4]);
  202. WriteLog(temp);
  203. }
  204. return sendto(s, buf, len, flags, to, tolen);
  205. }
  206. int WINAPI myrecvfrom (SOCKET s, char FAR * buf, int len, int flags, struct sockaddr FAR * from, int *fromlen)
  207. {
  208. WriteLog("myrecvfrom");
  209. int ret = recvfrom(s, buf, len, flags, from, fromlen);
  210. int err=WSAGetLastError();
  211. int port;
  212. char ip[16];
  213. char temp[200];
  214. GetIPAndPortByAddr(from, ip, &port);
  215. sprintf(temp, "ip:%s, remote_port:%d, len=%d", ip, port, len);
  216. WriteBinData("recvfrom", temp, strlen(temp));
  217. WriteBinData("recvfrom", buf, ret);
  218. WSASetLastError(err);
  219. return ret;
  220. }
  221. /*
  222. HINSTANCE WINAPI myShellExecuteA(HWND hwnd, LPCSTR lpOperation, LPCSTR lpFile,
  223.  LPCSTR lpParameters, LPCSTR lpDirectory, INT nShowCmd)
  224. {
  225. WriteLog("ShellExecuteW file=%s", lpFile);
  226. return ShellExecuteA(hwnd, lpOperation, lpFile, lpParameters, lpDirectory, nShowCmd);
  227. }
  228. HINSTANCE WINAPI myShellExecuteW(HWND hwnd, LPCWSTR lpOperation, LPCWSTR lpFile, LPCWSTR lpParameters, LPCWSTR lpDirectory, INT nShowCmd)
  229. {
  230. char fname[400];
  231. int len =WideCharToMultiByte( CP_ACP, 0, lpFile, -1, fname, sizeof(fname),NULL,NULL);
  232. fname[len] =0;
  233. WriteLog("ShellExecuteW file=%s", fname);
  234. return ShellExecuteW(hwnd, lpOperation, lpFile, lpParameters, lpDirectory, nShowCmd);
  235. }
  236. BOOL WINAPI myShellExecuteExA(LPSHELLEXECUTEINFOA lpExecInfo)
  237. {
  238. WriteLog("ShellExecuteExA");
  239. return ShellExecuteExA(lpExecInfo);
  240. }
  241. BOOL WINAPI myShellExecuteExW(LPSHELLEXECUTEINFOW lpExecInfo)
  242. {
  243. WriteLog("ShellExecuteExW");
  244. return ShellExecuteExW(lpExecInfo);
  245. }
  246. BOOL WINAPI myCreateProcessAsUserA (
  247.     HANDLE hToken,
  248.     LPCSTR lpApplicationName,
  249.     LPSTR lpCommandLine,
  250.     LPSECURITY_ATTRIBUTES lpProcessAttributes,
  251.     LPSECURITY_ATTRIBUTES lpThreadAttributes,
  252.     BOOL bInheritHandles,
  253.     DWORD dwCreationFlags,
  254.     LPVOID lpEnvironment,
  255.     LPCSTR lpCurrentDirectory,
  256.     LPSTARTUPINFOA lpStartupInfo,
  257.     LPPROCESS_INFORMATION lpProcessInformation
  258.     )
  259. {
  260. BOOL bbb= CreateProcessAsUserA (hToken, lpApplicationName,
  261. lpCommandLine,
  262. lpProcessAttributes,
  263. lpThreadAttributes,
  264. bInheritHandles,
  265. dwCreationFlags,
  266. lpEnvironment,
  267. lpCurrentDirectory,
  268. lpStartupInfo,
  269. lpProcessInformation);
  270. WriteLog("CreateProcessAsUserA");
  271. return bbb;
  272. }
  273. BOOL WINAPI myCreateProcessAsUserW (
  274.     HANDLE hToken,
  275.     LPCWSTR lpApplicationName,
  276.     LPWSTR lpCommandLine,
  277.     LPSECURITY_ATTRIBUTES lpProcessAttributes,
  278.     LPSECURITY_ATTRIBUTES lpThreadAttributes,
  279.     BOOL bInheritHandles,
  280.     DWORD dwCreationFlags,
  281.     LPVOID lpEnvironment,
  282.     LPCWSTR lpCurrentDirectory,
  283.     LPSTARTUPINFOW lpStartupInfo,
  284.     LPPROCESS_INFORMATION lpProcessInformation
  285.     )
  286. {
  287. BOOL bbb = CreateProcessAsUserW (hToken, lpApplicationName,
  288. lpCommandLine,
  289. lpProcessAttributes,
  290. lpThreadAttributes,
  291. bInheritHandles,
  292. dwCreationFlags,
  293. lpEnvironment,
  294. lpCurrentDirectory,
  295. lpStartupInfo,
  296. lpProcessInformation);
  297. WriteLog("CreateProcessAsUserW");
  298. return bbb;
  299. }
  300. */
  301. // 地址小的放前面
  302. MYAPIINFO myapi_info[] =
  303. {
  304. // "kernel32.dll" CreateProcessInternalA
  305. //{"advapi32.dll", "CreateProcessAsUserA", 11, "myCreateProcessAsUserA"},
  306. //{"advapi32.dll", "CreateProcessAsUserW", 12, "myCreateProcessAsUserW"},
  307. //{"Shell32.dll", "ShellExecuteA", 6, "myShellExecuteA"},
  308. //{"Shell32.dll", "ShellExecuteW", 6, "myShellExecuteW"},
  309. //{"Shell32.dll", "ShellExecuteExA", 1, "myShellExecuteExA"},
  310. //{"Shell32.dll", "ShellExecuteExW", 1, "myShellExecuteExW"},
  311. #ifdef WINNT
  312. {"WS2_32.DLL", "socket", 3, "mysocket"},
  313. {"WS2_32.DLL", "accept", 3, "myaccept"},
  314. {"WS2_32.DLL", "connect", 3, "myconnect"},
  315. {"WS2_32.DLL", "recv", 4, "myrecv"},
  316. {"WS2_32.DLL", "send", 4, "mysend"},
  317. {"WS2_32.DLL", "sendto", 6, "mysendto"},
  318. {"WS2_32.DLL", "recvfrom", 6, "myrecvfrom"},
  319. {"WS2_32.DLL", "gethostbyname", 1, "mygethostbyname"},
  320. #else
  321. {"WSOCK32.DLL", "socket", 3, "mysocket"},
  322. {"WSOCK32.DLL", "accept", 3, "myaccept"},
  323. {"WSOCK32.DLL", "connect", 3, "myconnect"},
  324. {"WSOCK32.DLL", "recv", 4, "myrecv"},
  325. {"WSOCK32.DLL", "send", 4, "mysend"},
  326. {"WSOCK32.DLL", "sendto", 6, "mysendto"},
  327. {"WSOCK32.DLL", "recvfrom", 6, "myrecvfrom"},
  328. {"WSOCK32.DLL", "gethostbyname", 1, "mygethostbyname"},
  329. #endif
  330. {NULL}
  331. };
  332. // 下列内容请不要修改
  333. MYAPIINFO *GetMyAPIInfo()
  334. {
  335. return &myapi_info[0];
  336. }
  337. BOOL APIENTRY DllMain( HANDLE hModule, 
  338.                        DWORD  ul_reason_for_call, 
  339.                        LPVOID lpReserved
  340.  )
  341. {
  342. if(ul_reason_for_call =DLL_PROCESS_ATTACH)
  343. {
  344. //GetProfileString("HookAPI", "dll_path", "", g_szDllPath, sizeof(g_szDllPath));
  345. }
  346. return TRUE;
  347. }