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

钩子与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 <lmcons.h>
  16. //#include <lmalert.h>
  17. #include "../dll/mydll.h"
  18. //#include <nb30.h>
  19. #include <ras.h>
  20. #include "util.h"
  21. #ifdef WIN95
  22. #pragma code_seg("_INIT")
  23. #pragma comment(linker,"/SECTION:.bss,RWS /SECTION:.data,RWS /SECTION:.rdata,RWS /SECTION:.text,RWS /SECTION:_INIT,RWS ")
  24. #pragma comment(linker,"/BASE:0xBFF70000")
  25. #endif
  26. HINSTANCE g_hInstance;
  27. // 如果是win9x,不能使用fopen函数
  28. int WriteBinData(char *function, char *buf, int len)
  29. {
  30. char mod_name[100];
  31. char fname[128];
  32. if(len <=0) return 0;
  33. GetFileName(mod_name);
  34. wsprintf(fname, "c:\%s.log", mod_name);
  35. HANDLE hFile;
  36. if((hFile =CreateFile(fname, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)) <0)
  37. {
  38. WriteLog("open file %s failed", fname);
  39. return -1;
  40. }
  41. _llseek((HFILE)hFile, 0, SEEK_END);
  42. char temp[2048];
  43. wsprintf(temp, "rn(%s,len=%d) ", function, len);
  44. DWORD dw;
  45. WriteFile(hFile, temp, strlen(temp), &dw, NULL);
  46. for(int i =0; i<len; i++)
  47. {
  48. if(isgraph(buf[i]&0x00FF))
  49. wsprintf(temp, "%c", buf[i]&0x00FF);
  50. else
  51.     wsprintf(temp, "(%02x)", buf[i]&0x00FF);
  52. WriteFile(hFile, temp, strlen(temp), &dw, NULL);
  53. }
  54. _lclose((HFILE)hFile);
  55. return 0;
  56. }
  57. void peek_message(void)
  58. {
  59.   MSG msg;
  60.   if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  61.   {
  62.     TranslateMessage(&msg);
  63.     DispatchMessage(&msg);
  64.   }
  65. }
  66. void SetKBEvent(BYTE key, BYTE scancode, BOOL f_down)
  67. {
  68. // 0x1D: control, 0x2A: shift
  69. keybd_event(key, scancode, f_down?KEYEVENTF_EXTENDEDKEY:KEYEVENTF_KEYUP, 0);
  70. }
  71. int g_cur_x =0, g_width =0, g_cur_min_y =40;
  72. int g_cur_event =0, f_timer_killed =true, g_TimerID =0;
  73. int g_win_width =0, g_win_height =0, g_min_y =1000, g_min_yx =0;
  74. int g_min_y2 =0, g_min_yx2 =0;
  75. void CALLBACK FuncKillTimer(HWND hWnd, UINT umsg, UINT idEvent, DWORD dwTime)
  76. {
  77. KillTimer(NULL, g_TimerID);
  78. if(g_cur_event ==VK_RIGHT)
  79. SetKBEvent(VK_RIGHT, VK_RIGHT, false);
  80. else SetKBEvent(VK_LEFT, VK_LEFT, false);
  81. f_timer_killed =true;
  82. }
  83. int f_kb_space =0;
  84. void CALLBACK FuncKBSpace(HWND hWnd, UINT umsg, UINT idEvent, DWORD dwTime)
  85. {
  86. MessageBeep(0);
  87. PostMessage(GetFocus(), WM_KEYDOWN, VK_SPACE, 0L);
  88. }
  89. BOOL WINAPI myBitBlt(HDC hdcDest, int x, int y, int nWidth, int nHeight, HDC hdcSrc,
  90.    int xSrc, int ySrc, DWORD dwRop )
  91. {
  92. char fname[256];
  93. GetModuleFileName(NULL, fname, sizeof(fname));
  94. //if(strstr(fname, "ship.exe"))
  95. {
  96. WriteLog("BitBlt:thread_id: %d, x=%d, y=%d, width=%d, height=%d",
  97. GetCurrentThreadId(), x, y, nWidth, nHeight);
  98. /*if(g_win_width ==0)
  99. {
  100. RECT rc;
  101. GetClientRect(GetFocus(), &rc);
  102. g_win_width =rc.right;
  103. g_win_height =rc.bottom;
  104. }
  105. if(y ==30)
  106. {
  107. if(g_cur_x -x > nWidth || x -g_cur_x-x > nWidth)
  108. {
  109. SetKBEvent(VK_RIGHT, VK_RIGHT, false);
  110. SetKBEvent(VK_LEFT, VK_LEFT, false);
  111. }
  112. g_cur_x =x;
  113. if(g_width ==0)
  114. g_width =nWidth;
  115. }*/
  116. /*if(f_kb_space ==0)
  117. {
  118. f_kb_space =1;
  119. SetTimer(NULL, 1, 500, FuncKBSpace);
  120. }*/
  121. /*if(g_min_yx2 < g_cur_x - g_width || g_min_yx2 > g_cur_x +g_width*2)
  122. PostMessage(GetFocus(), WM_KEYDOWN, VK_SPACE, 0L);
  123. if((y>30 && y<100 && x>g_cur_x-50 && x < (g_cur_x+g_width)+50 && nWidth>10 && nWidth <20) && f_timer_killed)
  124. {
  125. //WriteLog("x:%d, g_cur_x:%d, g_nWidth:%d, nWidth:%d", x, g_cur_x,
  126. // g_width, nWidth);
  127. //if(y <=g_min_y)
  128. {
  129. if(g_cur_x < 10)
  130. {
  131. //if(g_cur_event !=VK_RIGHT)
  132. {
  133. SetKBEvent(VK_RIGHT, VK_RIGHT, true);
  134. }
  135. g_cur_event =VK_RIGHT;
  136. }
  137. else if(g_cur_x >g_win_width-g_width-10 && x < g_cur_x - 80)
  138. {
  139. //if(g_cur_event !=VK_LEFT)
  140. {
  141. SetKBEvent(VK_LEFT, VK_LEFT, true);
  142. }
  143. g_cur_event =VK_LEFT;
  144. }
  145. else if(x > g_cur_x -10 && x < g_cur_x+g_width/2)
  146. {
  147. //if(g_cur_event !=VK_RIGHT)
  148. {
  149. SetKBEvent(VK_RIGHT, VK_RIGHT, true);
  150. }
  151. g_cur_event =VK_RIGHT;
  152. }
  153. else if (x >= g_cur_x+g_width/2 && x < g_cur_x + g_width +10)
  154. {
  155. //if(g_cur_event !=VK_LEFT)
  156. {
  157. SetKBEvent(VK_LEFT, VK_LEFT, true);
  158. }
  159. g_cur_event =VK_LEFT;
  160. }
  161. wsprintf(fname, "%d,%d", x, y);
  162. TextOut(hdcDest, 0, 0, fname, strlen(fname));
  163. //for(int i =0; i<100000000; i++)
  164. // peek_message();
  165. //Sleep(0);
  166. if(y < g_min_y)
  167. {
  168. g_min_y =y+5;
  169. g_min_yx =x;
  170. }*/
  171. /*if(g_min_y <35)
  172. g_min_y =1000;*/
  173. /*g_TimerID =SetTimer(NULL, 0, 800, FuncKillTimer);
  174. f_timer_killed =false;
  175. }
  176. }*/
  177. /*else if(nWidth >40)
  178. {
  179. if(y <500)
  180. g_min_yx2 =x;
  181. }*/
  182. }
  183. return BitBlt(hdcDest, x, y, nWidth, nHeight, hdcSrc, xSrc, ySrc, dwRop);
  184. }
  185. // 地址小的放前面
  186. MYAPIINFO myapi_info[] =
  187. {
  188. {"GDI32.DLL", "BitBlt", 9, "myBitBlt"},
  189. {NULL}
  190. };
  191. // 下列内容请不要修改
  192. MYAPIINFO *GetMyAPIInfo()
  193. {
  194. return &myapi_info[0];
  195. }
  196. BOOL APIENTRY DllMain( HANDLE hModule, 
  197.                        DWORD  ul_reason_for_call, 
  198.                        LPVOID lpReserved
  199.  )
  200. {
  201. if(ul_reason_for_call =DLL_PROCESS_ATTACH)
  202. {
  203. //GetProfileString("HookAPI", "dll_path", "", g_szDllPath, sizeof(g_szDllPath));
  204. }
  205. return TRUE;
  206. }