Micro山寨板+Android制作另类蓝牙键盘

2015-01-19 11:33:14 15 8566
0x00    吐槽

原创非首发,只为分享

昨天代码快写完了,一点保存,居然消失了,这是在逗我吗?

0x01        原因

我制作这个是因为一来可以做个蓝牙通讯的例子,为后续的键盘通讯监控做准备。二来HID攻击时,可以按照自己的输入来执行,就是效率有点低。三来是为了我方便使用树莓派。

我有时会把树莓派带出去做些移动,无线,硬件方面的渗透测试,身边没有什么显示器,键盘,网线等。

那么问题来了,该怎么和树莓派保持通讯呢?

一般可能会给树莓派配个无线网卡,让树莓派优先加入到手机的热点中,这样就可以ssh或者vnc了。但这种方法,偶尔树莓派会抽疯,死活连不上。

我一般采用手机通过usb共享给树莓派网络,这样物理连接比无线可靠多了,然后树莓派获取固定ip,然后手机ssh或者vnc。虽然这种方法比上一种可靠许多,但是树莓派有时还会抽疯,死活连不上。

所以在上面的方法之后,有的人可能会想到带个键盘。那么问题是键盘那么大,屌不屌?那么采用硅胶键盘,这种东西用了就会知道,底下没硬东西垫着,连键连到爆。所以

用这个两块小板子一组合,物理键盘就ok了。

0x02        准备

一个micro板子带排针(正版我还没有体验过。。.)//不到30元
一个蓝牙模块(我使用的是HC-06)//不到20元
四根杜邦线
一个Android

0x03        组装

连线图。。。还没有画。
就是把蓝牙的vcc,gnd接到micro板子上的vcc,gnd上,把蓝牙的txd,rxd接到micro板

子上的rxd,txd上。

图片





从图中可以看出两个叠加起来也不大(应当忽略排针,杜邦线,实战时是直接焊上去的),完全可以嵌到其他设备上。

0x04        实现代码
String keys = "";
boolean n = 0 , s = 0;

void setup()
{
  Serial1.begin(9600);
  Keyboard.begin();
}

int check(String key)   //不知道c语言有啥好方法从输入中识别标识符,只好打表了。。
{
if(keys.equalsIgnoreCase("LEFT_CTRL")) { s = 1; return(KEY_LEFT_CTRL); }
      else if(keys.equalsIgnoreCase("LEFT_SHIFT")) { s = 1; return(KEY_LEFT_SHIFT); }
      else if(keys.equalsIgnoreCase("LEFT_ALT")) { s = 1; return(KEY_LEFT_ALT); }
      else if(keys.equalsIgnoreCase("LEFT_GUI")) { s = 1; return(KEY_LEFT_GUI); }
      else if(keys.equalsIgnoreCase("RIGHT_CTRL")) { s = 1; return(KEY_RIGHT_CTRL); }
      else if(keys.equalsIgnoreCase("RIGHT_SHIFT")) { s = 1; return(KEY_RIGHT_SHIFT); }
      else if(keys.equalsIgnoreCase("RIGHT_ALT")) { s = 1; return(KEY_RIGHT_ALT); }
      else if(keys.equalsIgnoreCase("RIGHT_GUI")) { s = 1; return(KEY_RIGHT_GUI); }
      else if(keys.equalsIgnoreCase("UP_ARROW")) { s = 1; return(KEY_UP_ARROW); }
      else if(keys.equalsIgnoreCase("DOWN_ARROW")) { s = 1; return(KEY_DOWN_ARROW); }
      else if(keys.equalsIgnoreCase("LEFT_ARROW")) { s = 1; return(KEY_LEFT_ARROW); }
      else if(keys.equalsIgnoreCase("RIGHT_ARROW")) { s = 1; return(KEY_RIGHT_ARROW); }
      else if(keys.equalsIgnoreCase("BACKSPACE")) { s = 1; return(KEY_BACKSPACE); }
      else if(keys.equalsIgnoreCase("TAB")) { s = 1; return(KEY_TAB); }
      else if(keys.equalsIgnoreCase("RETURN")) { s = 1; return(KEY_RETURN); }
      else if(keys.equalsIgnoreCase("ESC")) { s = 1; return(KEY_ESC); }
      else if(keys.equalsIgnoreCase("INSERT")) { s = 1; return(KEY_INSERT); }
      else if(keys.equalsIgnoreCase("DELETE")) { s = 1; return(KEY_DELETE); }
      else if(keys.equalsIgnoreCase("PAGE_UP")) { s = 1; return(KEY_PAGE_UP); }
      else if(keys.equalsIgnoreCase("PAGE_DOWN")) { s = 1; return(KEY_PAGE_DOWN); }
      else if(keys.equalsIgnoreCase("HOME")) { s = 1; return(KEY_HOME); }
      else if(keys.equalsIgnoreCase("END")) { s = 1; return(KEY_END); }
      else if(keys.equalsIgnoreCase("CAPS_LOCK")) { s = 1; return(KEY_CAPS_LOCK); }
      else if(keys.equalsIgnoreCase("F1")) { s = 1; return(KEY_F1); }
      else if(keys.equalsIgnoreCase("F2")) { s = 1; return(KEY_F2); }
      else if(keys.equalsIgnoreCase("F3")) { s = 1; return(KEY_F3); }
      else if(keys.equalsIgnoreCase("F4")) { s = 1; return(KEY_F4); }
      else if(keys.equalsIgnoreCase("F5")) { s = 1; return(KEY_F5); }
      else if(keys.equalsIgnoreCase("F6")) { s = 1; return(KEY_F6); }
      else if(keys.equalsIgnoreCase("F7")) { s = 1; return(KEY_F7); }
      else if(keys.equalsIgnoreCase("F8")) { s = 1; return(KEY_F8); }
      else if(keys.equalsIgnoreCase("F9")) { s = 1; return(KEY_F9); }
      else if(keys.equalsIgnoreCase("F10")) { s = 1; return(KEY_F10); }
      else if(keys.equalsIgnoreCase("F11")) { s = 1; return(KEY_F11); }
      else if(keys.equalsIgnoreCase("F12")) { s = 1; return(KEY_F12); }
      else if(keys.equalsIgnoreCase("^p")) { s = 0; return 500; }  //开启按模式
      else if(keys.equalsIgnoreCase("^e")) { s = 0; return 501; } //结束按模式
      else { s = 0;  return int(keys[0]); }//单按
}

void loop()
{
  while (Serial1.available() > 0)  //有输入?
    {
        keys += char(Serial1.read());
        delay(3);
    }
  if (keys.length() > 0)//输入字节 > 0 ?
    {
     if(check(keys) == 500)//检测是否开启按模式
       {
         n = 1;   //标注已开启按模式
         keys = "";   //字符串复位
         Serial1.println("start the press mode!");  //提示手机开启模式了
         while(n == 1)
         {
           while (Serial1.available() > 0)  
            {
              keys += char(Serial1.read());
              delay(3);
            }
           if (keys.length() > 0)
            {
              if(check(keys) == 501)  //检测是否结束按模式
              { n = 0; Serial1.println("end the mode!");}
              else {
                    Keyboard.press(check(keys));
                    Serial1.println("pressed");
                    }
              keys = "";
            }
          }
       Keyboard.releaseAll();  //释放所有按键
      }
      else if(s == 1 ) Keyboard.write(check(keys));  //s标注是否是特殊按键,然后按下特殊按键
      else Keyboard.print(keys);  //输出非特殊按键
   }
  keys = "";
}
安卓端是使用bluetooth spp进行通讯的。蓝牙模块的密码是1234,可修改。

其实也可以直接写个安卓或者ios程序,直接写成一个键盘程序,每一个键位通过蓝牙传输过去,还可以做出触控板当作鼠标。

那么问题来了-

谁会写安卓/ios程序?


注释和程序框图陆续添加ing

0x05        测试视频

http://pan.baidu.com/s/1o6GTS

0x06    使用说明

默认是输入什么,就输出什么。
输入"^p"启动按模式,就是按下键位不松开,每次输入一个按键,以此实现组合键。
输入"^e"结束按模式,释放所有按键,就是把上面依次按下的键位松开,实现组合键
输入了"^p"后输入完组合键一定要输"^e",要不后面的输入会异常的。

特殊键值表(输入不区分大小写,eg:输入win键,输入left_gui即可)

Key        Hexadecimal value        Decimal value
KEY_LEFT_CTRL         0x80         128
KEY_LEFT_SHIFT         0x81         129
KEY_LEFT_ALT         0x82         130
KEY_LEFT_GUI         0x83         131
KEY_RIGHT_CTRL         0x84         132
KEY_RIGHT_SHIFT         0x85         133
KEY_RIGHT_ALT         0x86         134
KEY_RIGHT_GUI         0x87         135
KEY_UP_ARROW         0xDA         218
KEY_DOWN_ARROW         0xD9         217
KEY_LEFT_ARROW         0xD8         216
KEY_RIGHT_ARROW         0xD7         215
KEY_BACKSPACE         0xB2         178
KEY_TAB                 0xB3    179
KEY_RETURN         0xB0         176
KEY_ESC                 0xB1         177
KEY_INSERT         0xD1         209
KEY_DELETE         0xD4         212
KEY_PAGE_UP         0xD3         211
KEY_PAGE_DOWN         0xD6         214
KEY_HOME         0xD2         210
KEY_END                 0xD5         213
KEY_CAPS_LOCK         0xC1         193
KEY_F1                 0xC2         194
KEY_F2                 0xC3         195
KEY_F3                 0xC4         196
KEY_F4                 0xC5         197
KEY_F5                 0xC6         198
KEY_F6                 0xC7         199
KEY_F7                 0xC8         200
KEY_F8                 0xC9         201
KEY_F9                 0xCA         202
KEY_F10                 0xCB         203
KEY_F11                 0xCC         204
KEY_F12                 0xCD         205

关于作者

anymous8篇文章186篇回复

评论15次

要评论?请先  登录  或  注册