Arduino+Avr libc制作Badusb原理讲解
一、 媒介
2014年美国黑帽大会上研讨人员JakobLell和Karsten Nohl展现了badusb的进击办法后,海内与badusb相干的文章固然有了一些,然则大部门人把相干文章都阅读后照样会有种“不明觉厉”的感到,badusb仍有一层朦胧的面纱。颠末一段光阴的进修和研讨后,笔者盼望经由进程自己的一些心得体会可以或许赞助其余人更清楚地认识badusb,也盼望这篇文章可以或许起到必定的启迪。这篇文章重要分为五个部门——常识扫盲部门、badusb固件编写部门、badusb设置装备摆设界面部门、技巧瞻望部门和总结部门。
二、硬件筹备
本文应用的硬件是Arduino Leonardo开辟板,然则不难将Leonardo开辟板调换为别的Arduino开辟板。
三、常识扫盲
1. 固然USB协定有必定的破绽,然则不是任何USB装备都能制造badusb的。制造badusb有两个焦点,一个是可以或许为USB装备编写相应的固件,另一个是可以或许将编写的固件烧录到USB装备中。要编写相应的固件就需要控制USB装备中微节制器(或许说芯片)的指令标准文档(假如Intel不供给开辟文档,那末除Intel自己没有人能为Intel处理器编写法式);而要将固件烧录到USB装备中,要末应用相应的硬件编程器,要末就需要USB装备自己曾经存在的bootloader来帮助停止烧录事情(bootloader是USB装备厂商在临盆时就放在USB装备中的,网上某些优盘的优盘量产对象也是从厂商流出的,而不是第三方编写的)。要同时满意两个焦点前提照样比较难的,即就是JakobLell和Karsten Nohl颁布的badusb应用代码也是针对满意必定前提的优盘,由于流出的优盘量产对象无限(既然有优盘量产对象,可以或许推想相应的优盘中确定有bootloader或许相似bootloader的固件存在,那末经由进程逆向优盘量产对象就可以够或许控制PC端软件和特定优盘的通讯方法,进而实现自己的烧录对象)。
2. Arduino 和 teensy这类开辟板之以是轻易制造badusb,是由于它们采用的微节制器民间有详细的阐明文档。最常用的是atmel公司的微节制器,atmel官网供给了各类开辟文档和开辟相干的库等。
3. Atmel厂商的微节制器整合了SRAM, FLASH和EEPROM。SRAM就比如电脑的内存,不消关怀;FLASH高地点寄存的是bootloader,低地点则寄存用户烧录的固件,芯片加电时间接履行用户的固件,然则芯片复位时会先履行bootloader(这一点是烧录的症结),再履行用户的固件;EEPROM则重要用来寄存数据,用户可以或许随便改动EEPROM中的数据,固件也能够或许从EEPROM里读取数据(本文的固件示例和PC端法式都应用了这一特征)。
4. Avr libc是一个开源名目,针对atmel厂商的各类微节制器开辟C说话库、编译器、烧录对象等一系列帮助对象,另有针对Windows平台的WinAvr名目。Arduino ide的焦点其实也是avr libc。
5. Arduino的开辟板有相应的bootloader(在FLASH高地点)可以或许和avr libc名目中的avrdude.exe软件通讯,实现固件的烧写和读取举措。在Arduino开辟板复位时,会加载bootloader,这时就可以够或许应用avrdude.exe和bootloader通讯。复位操纵可以或许经由进程开辟板上的复位按钮,或许编程实现软复位操纵(假如开辟板支撑的话)。
6. Intel hex 是一种用于编程器的特别的文件格局,正是由于这类格局,使得咱们可以或许自在节制数据的存储地点。Intel hex的文件格局剖析可以或许自行网上搜刮。
四、常识获得道路
1. USB常识获得
假如只是为了简略懂得USB装备为何可以或许模仿键盘、鼠标等别的装备,网上有很多博客是对于USB标准详解的,也能够或许简略地看《USB开辟大全》和《USB应用开辟实例详解》前面对于USB通用协定部门,假如不是对硬件感兴趣没需要穷究。
2. Arduino、Avr libc常识获得
这两样其实都是开源的,以是只要有充足的精神和气力,看源代码深刻懂得相干常识是没成绩的。然则假如只是想体验一下制造badusb,可以或许只看一下Arduino的民间文档和avrdude.exe的相干文档,看这些文档时也没需要穷究每一个细节,能必定程度上“照葫芦画瓢”就可以够或许了。
五、Badusb固件编写
这里给的固件示例在履行时会从EEPROM中指定的地点读取数据,依据读取的数据和制定的规矩发送相应的按键相应给PC主机。
#include"Keyboard.h"#include"EEPROM.h" intmodifier_key = -1; //modifier_key不为-1阐明Win键、Ctrl键或许Shift键按下,这个示例特指Win键intkeycode; //寄存要发送的按键代码unsignedint delay_time = 0; //固件履行下条指令时提早的光阴unsignedint address = 0; //从EEPROM读取数据的地点,这里要和EEPROM寄存数据的地点同等charnum_char[10] = {0}; //某个数字的字符串情势,这个数字用于delay()的参数,也就是作为就寝的光阴int num= 0;intindex = 0; //change this to match your platform:voidsetup() { // make pin 2 an input and turn on the // pullup resistor so it goes high unless // connected to ground: pinMode(2, INPUT_PULLUP); Keyboard.begin(); delay(1000); //期待一段光阴,让USB装备和PC主机通讯实现初始化事情 while((keycode = EEPROM.read(address++))!= 0){//轮回从EEPROM中读取数据直到读到数值0(不是数字0),这个值是在向EEPROM中写入数据时在末端增加的。 if (keycode == '$') { //假如从EEPROM中读到的数值即是'
版权声明:
作者: freeclashnode
链接: https://www.freeclashnode.com/news/article-1744.htm
来源: FreeClashNode
文章版权归作者所有,未经允许请勿转载。
热门文章
- 9月1日|21M/S,Shadowrocket/SSR/V2ray/Clash免费节点订阅链接每天更新
- 8月31日|20.3M/S,V2ray/Shadowrocket/SSR/Clash免费节点订阅链接每天更新
- 8月30日|22.8M/S,SSR/Clash/Shadowrocket/V2ray免费节点订阅链接每天更新
- 9月15日|20.4M/S,Shadowrocket/V2ray/SSR/Clash免费节点订阅链接每天更新
- 8月29日|22.2M/S,V2ray/Clash/SSR/Shadowrocket免费节点订阅链接每天更新
- 8月24日|19.3M/S,Shadowrocket/V2ray/Clash/SSR免费节点订阅链接每天更新
- 8月28日|20.4M/S,SSR/Clash/Shadowrocket/V2ray免费节点订阅链接每天更新
- 9月2日|21.4M/S,SSR/Shadowrocket/Clash/V2ray免费节点订阅链接每天更新
- 8月27日|21.5M/S,Clash/V2ray/SSR/Shadowrocket免费节点订阅链接每天更新
- 9月16日|18M/S,SSR/Shadowrocket/Clash/V2ray免费节点订阅链接每天更新
最新文章
- 9月19日|23M/S,Clash/SSR/Shadowrocket/V2ray免费节点订阅链接每天更新
- 9月18日|22.9M/S,Clash/Shadowrocket/V2ray/SSR免费节点订阅链接每天更新
- 9月17日|21.6M/S,SSR/Shadowrocket/V2ray/Clash免费节点订阅链接每天更新
- 9月16日|18M/S,SSR/Shadowrocket/Clash/V2ray免费节点订阅链接每天更新
- 9月15日|20.4M/S,Shadowrocket/V2ray/SSR/Clash免费节点订阅链接每天更新
- 9月14日|20M/S,Shadowrocket/SSR/Clash/V2ray免费节点订阅链接每天更新
- 9月13日|22.3M/S,Shadowrocket/V2ray/Clash/SSR免费节点订阅链接每天更新
- 9月12日|22.9M/S,Clash/V2ray/Shadowrocket/SSR免费节点订阅链接每天更新
- 9月11日|20.4M/S,Shadowrocket/Clash/SSR/V2ray免费节点订阅链接每天更新
- 9月10日|21.9M/S,V2ray/SSR/Clash/Shadowrocket免费节点订阅链接每天更新