BadUSB ID change (#1046)

* badusb: vid/pid/strings change
* demo script update
* removed vid/pid values

Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
Nikolay Minaylov
2022-03-23 16:35:25 +03:00
committed by GitHub
parent 6470aa8ff9
commit d075e00ae1
19 changed files with 233 additions and 82 deletions

View File

@@ -18,6 +18,7 @@ typedef struct {
bool connected;
FuriHalUsbInterface* if_cur;
FuriHalUsbInterface* if_next;
void* if_ctx;
FuriHalUsbStateCallback callback;
void* cb_ctx;
} UsbSrv;
@@ -88,8 +89,9 @@ void furi_hal_usb_init(void) {
FURI_LOG_I(TAG, "Init OK");
}
void furi_hal_usb_set_config(FuriHalUsbInterface* new_if) {
void furi_hal_usb_set_config(FuriHalUsbInterface* new_if, void* ctx) {
usb.if_next = new_if;
usb.if_ctx = ctx;
if(usb.thread == NULL) {
// Service thread hasn't started yet, so just save interface mode
return;
@@ -246,7 +248,7 @@ static int32_t furi_hal_usb_thread(void* context) {
usb.if_cur->deinit(&udev);
}
if(usb.if_next != NULL) {
usb.if_next->init(&udev, usb.if_next);
usb.if_next->init(&udev, usb.if_next, usb.if_ctx);
usbd_reg_event(&udev, usbd_evt_reset, reset_evt);
FURI_LOG_I(TAG, "USB Mode change done");
usb.enabled = true;

View File

@@ -385,7 +385,7 @@ static const struct CdcConfigDescriptorDual
static struct usb_cdc_line_coding cdc_config[IF_NUM_MAX] = {};
static uint8_t cdc_ctrl_line_state[IF_NUM_MAX];
static void cdc_init(usbd_device* dev, FuriHalUsbInterface* intf);
static void cdc_init(usbd_device* dev, FuriHalUsbInterface* intf, void* ctx);
static void cdc_deinit(usbd_device* dev);
static void cdc_on_wakeup(usbd_device* dev);
static void cdc_on_suspend(usbd_device* dev);
@@ -428,7 +428,7 @@ FuriHalUsbInterface usb_cdc_dual = {
.cfg_descr = (void*)&cdc_cfg_desc_dual,
};
static void cdc_init(usbd_device* dev, FuriHalUsbInterface* intf) {
static void cdc_init(usbd_device* dev, FuriHalUsbInterface* intf, void* ctx) {
usb_dev = dev;
cdc_if_cur = intf;

View File

@@ -21,6 +21,9 @@
#define HID_PAGE_CONSUMER 0x0C
#define HID_CONSUMER_CONTROL 0x01
#define HID_VID_DEFAULT 0x046D
#define HID_PID_DEFAULT 0xC529
struct HidIadDescriptor {
struct usb_iad_descriptor hid_iad;
struct usb_interface_descriptor hid;
@@ -114,12 +117,8 @@ static const uint8_t hid_report_desc[] = {
HID_END_COLLECTION,
};
static const struct usb_string_descriptor dev_manuf_desc = USB_STRING_DESC("Logitech");
static const struct usb_string_descriptor dev_prod_desc = USB_STRING_DESC("USB Receiver");
static const struct usb_string_descriptor dev_serial_desc = USB_STRING_DESC("1234567890");
/* Device descriptor */
static const struct usb_device_descriptor hid_device_desc = {
static struct usb_device_descriptor hid_device_desc = {
.bLength = sizeof(struct usb_device_descriptor),
.bDescriptorType = USB_DTYPE_DEVICE,
.bcdUSB = VERSION_BCD(2, 0, 0),
@@ -127,12 +126,12 @@ static const struct usb_device_descriptor hid_device_desc = {
.bDeviceSubClass = USB_SUBCLASS_IAD,
.bDeviceProtocol = USB_PROTO_IAD,
.bMaxPacketSize0 = USB_EP0_SIZE,
.idVendor = 0x046d,
.idProduct = 0xc529,
.idVendor = HID_VID_DEFAULT,
.idProduct = HID_PID_DEFAULT,
.bcdDevice = VERSION_BCD(1, 0, 0),
.iManufacturer = UsbDevManuf,
.iProduct = UsbDevProduct,
.iSerialNumber = UsbDevSerial,
.iManufacturer = 0,
.iProduct = 0,
.iSerialNumber = 0,
.bNumConfigurations = 1,
};
@@ -236,11 +235,26 @@ static struct HidReport {
struct HidReportConsumer consumer;
} __attribute__((packed)) hid_report;
static void hid_init(usbd_device* dev, FuriHalUsbInterface* intf);
static void hid_init(usbd_device* dev, FuriHalUsbInterface* intf, void* ctx);
static void hid_deinit(usbd_device* dev);
static void hid_on_wakeup(usbd_device* dev);
static void hid_on_suspend(usbd_device* dev);
FuriHalUsbInterface usb_hid = {
.init = hid_init,
.deinit = hid_deinit,
.wakeup = hid_on_wakeup,
.suspend = hid_on_suspend,
.dev_descr = (struct usb_device_descriptor*)&hid_device_desc,
.str_manuf_descr = NULL,
.str_prod_descr = NULL,
.str_serial_descr = NULL,
.cfg_descr = (void*)&hid_cfg_desc,
};
static bool hid_send_report(uint8_t report_id);
static usbd_respond hid_ep_config(usbd_device* dev, uint8_t cfg);
static usbd_respond hid_control(usbd_device* dev, usbd_ctlreq* req, usbd_rqc_callback* callback);
@@ -348,28 +362,48 @@ bool furi_hal_hid_consumer_key_release(uint16_t button) {
return hid_send_report(ReportIdConsumer);
}
FuriHalUsbInterface usb_hid = {
.init = hid_init,
.deinit = hid_deinit,
.wakeup = hid_on_wakeup,
.suspend = hid_on_suspend,
static void* hid_set_string_descr(char* str) {
furi_assert(str);
.dev_descr = (struct usb_device_descriptor*)&hid_device_desc,
uint8_t len = strlen(str);
struct usb_string_descriptor* dev_str_desc = malloc(len * 2 + 2);
dev_str_desc->bLength = len * 2 + 2;
dev_str_desc->bDescriptorType = USB_DTYPE_STRING;
for(uint8_t i = 0; i < len; i++) dev_str_desc->wString[i] = str[i];
.str_manuf_descr = (void*)&dev_manuf_desc,
.str_prod_descr = (void*)&dev_prod_desc,
.str_serial_descr = (void*)&dev_serial_desc,
return dev_str_desc;
}
.cfg_descr = (void*)&hid_cfg_desc,
};
static void hid_init(usbd_device* dev, FuriHalUsbInterface* intf) {
static void hid_init(usbd_device* dev, FuriHalUsbInterface* intf, void* ctx) {
FuriHalUsbHidConfig* cfg = (FuriHalUsbHidConfig*)ctx;
if(hid_semaphore == NULL) hid_semaphore = osSemaphoreNew(1, 1, NULL);
usb_dev = dev;
hid_report.keyboard.report_id = ReportIdKeyboard;
hid_report.mouse.report_id = ReportIdMouse;
hid_report.consumer.report_id = ReportIdConsumer;
usb_hid.dev_descr->iManufacturer = 0;
usb_hid.dev_descr->iProduct = 0;
usb_hid.str_manuf_descr = NULL;
usb_hid.str_prod_descr = NULL;
usb_hid.dev_descr->idVendor = HID_VID_DEFAULT;
usb_hid.dev_descr->idProduct = HID_PID_DEFAULT;
if(cfg != NULL) {
usb_hid.dev_descr->idVendor = cfg->vid;
usb_hid.dev_descr->idProduct = cfg->pid;
if(cfg->manuf[0] != '\0') {
usb_hid.str_manuf_descr = hid_set_string_descr(cfg->manuf);
usb_hid.dev_descr->iManufacturer = UsbDevManuf;
}
if(cfg->product[0] != '\0') {
usb_hid.str_prod_descr = hid_set_string_descr(cfg->product);
usb_hid.dev_descr->iProduct = UsbDevProduct;
}
}
usbd_reg_config(dev, hid_ep_config);
usbd_reg_control(dev, hid_control);
@@ -379,6 +413,9 @@ static void hid_init(usbd_device* dev, FuriHalUsbInterface* intf) {
static void hid_deinit(usbd_device* dev) {
usbd_reg_config(dev, NULL);
usbd_reg_control(dev, NULL);
free(usb_hid.str_manuf_descr);
free(usb_hid.str_prod_descr);
}
static void hid_on_wakeup(usbd_device* dev) {

View File

@@ -137,7 +137,7 @@ static const struct HidConfigDescriptor hid_u2f_cfg_desc = {
},
};
static void hid_u2f_init(usbd_device* dev, FuriHalUsbInterface* intf);
static void hid_u2f_init(usbd_device* dev, FuriHalUsbInterface* intf, void* ctx);
static void hid_u2f_deinit(usbd_device* dev);
static void hid_u2f_on_wakeup(usbd_device* dev);
static void hid_u2f_on_suspend(usbd_device* dev);
@@ -185,7 +185,7 @@ FuriHalUsbInterface usb_hid_u2f = {
.cfg_descr = (void*)&hid_u2f_cfg_desc,
};
static void hid_u2f_init(usbd_device* dev, FuriHalUsbInterface* intf) {
static void hid_u2f_init(usbd_device* dev, FuriHalUsbInterface* intf, void* ctx) {
if(hid_u2f_semaphore == NULL) hid_u2f_semaphore = osSemaphoreNew(1, 1, NULL);
usb_dev = dev;

View File

@@ -79,7 +79,7 @@ static int32_t vcp_worker(void* context) {
size_t missed_rx = 0;
uint8_t last_tx_pkt_len = 0;
furi_hal_usb_set_config(&usb_cdc_single);
furi_hal_usb_set_config(&usb_cdc_single, NULL);
furi_hal_cdc_set_callbacks(VCP_IF_NUM, &cdc_cb, NULL);
while(1) {