Micro山寨板+Android制作另类蓝牙键盘
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 实现代码安卓端是使用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
原创非首发,只为分享
昨天代码快写完了,一点保存,居然消失了,这是在逗我吗?
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 = "";
}
其实也可以直接写个安卓或者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
评论15次
真的看不懂,但是很佩服楼主这种自己动手的!
神人神技,虽然看不懂。
@ver007 你是ver007
23333333333333333333333333333333333333333333333333333333333333333333333333333
@ver007 你是ver007
猜猜我是谁
楼主动手能力很强
@wsm123 可以,但用起来会比较蛋疼的,需要了解点光学方面的知识
加个投影 想这个种 可以实现吗 http://baike.baidu.com/link?url=kWm65nWD-UV_sO1maShP1aTFqPQERvDmeCOXmyMZwyyto5mRlq4Z9YWjVAv2CBf7Q6WnKeqStfvhpMEeC8gDdK
LZ是专门搞这些硬件开发的吗?连发三篇,简直高产啊!
不是,业余的,板子到了,玩了两天
LZ是专门搞这些硬件开发的吗?连发三篇,简直高产啊!
@L.D 没有成品,只有实验品。成品就焊死,精简,加壳了。
@NO.THINKING arduino micro
成品發來看看
你这板子是什么的。怎么这么小
不明觉厉,吊炸天。学xi了