Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
notes:hw:xencelabs-quickkeys [2023/04/24 16:43] – maff | notes:hw:xencelabs-quickkeys [2023/06/26 14:17] (current) – maff | ||
---|---|---|---|
Line 5: | Line 5: | ||
===== Hardware info ===== | ===== Hardware info ===== | ||
- | USB: VID 0x28bd PID 0x5202 - Manufacturer " | + | USB: VID '' |
USB pcaps pending - currently on a mac machine and capturing USB traffic on a mac requires disabling system integrity protection. | USB pcaps pending - currently on a mac machine and capturing USB traffic on a mac requires disabling system integrity protection. | ||
Line 13: | Line 13: | ||
Device appears to transmit only signals (ie., button press and rotary wheel moving +/- steps); although it appears to be using HID, it does not present as a regular input device and requires the driver components for actioning anything. | Device appears to transmit only signals (ie., button press and rotary wheel moving +/- steps); although it appears to be using HID, it does not present as a regular input device and requires the driver components for actioning anything. | ||
- | The device seems to have an FCC ID - 2AYM6-K02A. The firmware version indicates it as K02-B, making me wonder if this device is not actually compliant with the FCC as it does not display the regulatory mark anywhere. | + | The device seems to have an FCC ID - '' |
===== Software info ===== | ===== Software info ===== | ||
Line 19: | Line 19: | ||
Software seems to be a generic XenceLabs-branded application that works for both the QuickKeys and other products offered by the company. | Software seems to be a generic XenceLabs-branded application that works for both the QuickKeys and other products offered by the company. | ||
- | The software is delivered as a DMG disk image, which contains an `xar` compressed | + | The software is delivered as a DMG disk image, which contains an '' |
- | The software archive contains a `LaunchAgents` plist (`com.xencelabs.xencelabstablet.plist`) which registers a launch agent `com.ugee.XencelabsAgent` to be started during login and during a logged-in session, and launches | + | The software archive contains a '' |
The software archive also contains a set of applications in a tree: | The software archive also contains a set of applications in a tree: | ||
Line 27: | Line 27: | ||
* Xencelabs | * Xencelabs | ||
* .guide (contains a copy of LGPLv3, some images, and some plists) | * .guide (contains a copy of LGPLv3, some images, and some plists) | ||
- | * Info.plist: | + | * Info.plist: |
- | * com.xencelabs.config.plist: | + | * com.xencelabs.config.plist: |
- | * com.xencelabs.config_run.plist: | + | * com.xencelabs.config_run.plist: |
* Xencelabs.app | * Xencelabs.app | ||
* UninstallXencelabs.app | * UninstallXencelabs.app | ||
Line 41: | Line 41: | ||
All applications appear to be universal binaries with both arm64 and amd64 builds. | All applications appear to be universal binaries with both arm64 and amd64 builds. | ||
- | Going by the system permissions prompts that come up when various inputs from the device are received by the computer, XencelabsDriver handles scrolling and XencelabsAgent handles keypresses. This is known because both applications request the ability to control the system via accessibility features. Rudimentary binary analysis shows that if this is denied, the programs will execute | + | Going by the system permissions prompts that come up when various inputs from the device are received by the computer, |
===== Firmware info ===== | ===== Firmware info ===== | ||
- | The device came loaded with firmware version K02-B 20210824, and the diagnostic tool states the " | + | The device came loaded with firmware version |
===== Observations relating to the stock software and firmware ===== | ===== Observations relating to the stock software and firmware ===== | ||
Line 79: | Line 79: | ||
When first plugged in, the dongle appears to be identified by the system as a keyboard. | When first plugged in, the dongle appears to be identified by the system as a keyboard. | ||
- | USB: VID 0x28bd PID 0x5203 - Manufacturer " | + | USB: VID '' |
It has model number ACD12-A and FCC ID 2AYM6-ACD12A | It has model number ACD12-A and FCC ID 2AYM6-ACD12A | ||
- | With the dongle plugged in, the software allows you to manage up to two " | + | With the dongle plugged in, the software allows you to manage up to two " |
The FCC-published information about this device indicates that yes - this is simply bluetooth/ | The FCC-published information about this device indicates that yes - this is simply bluetooth/ | ||
+ | |||
+ | Diagnostic information in the software reports the dongle' | ||
+ | |||
+ | ===== Linux Drivers ===== | ||
+ | |||
+ | Somehow never occurred to me that the linux driver package might shed more light on how the software and hardware interact. | ||
+ | |||
+ | The Linux download contains packages for RPM and dpkg-based distros, as well as a tarball with installation scripts - the most obvious point for examination. It contains normal XDG stuff for startup, application registration and so on, but also contains udev rules: | ||
+ | |||
+ | <code text 10-xencelabs.rules> | ||
+ | KERNEL==" | ||
+ | SUBSYSTEMS==" | ||
+ | </ | ||
+ | |||
+ | It also contains the actual software and a set of Qt5 libraries. The application itself is invoked via a script which exports LD_LIBRARY_PATH beforehand. | ||
+ | |||
+ | The application binary is (predictably) a dynamically-linked ELF built for amd64. | ||
+ | |||
+ | ===== Plans ===== | ||
+ | |||
+ | Get USB packet captures of: | ||
+ | |||
+ | * Initial communication between the software and the device itself | ||
+ | * Initial communication between the software and the dongle | ||
+ | * Configuring the pairing for the dongle and the device | ||
+ | * Configuring the device | ||
+ | * Changing the sleep time and screen brightness | ||
+ | |||
+ | Check any network communications the software makes. | ||
+ | |||
+ | * Application has references to several hostnames/ | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * Checks for updates to itself by calling '' | ||
+ | * Checks for firmware updates by calling '' | ||
+ | |||
+ | ===== Notes during reverse-engineering ===== | ||
+ | |||
+ | Both the dongle and the direct USB connection expose a USB Usage with page FF0Ah | ||
+ | |||
+ | Not 100% on packet/HID report format, but.. | ||
+ | |||
+ | * All writes are 32-byte packets | ||
+ | * Bytes 10-15 inclusive are the MAC address of the device, or zeroes if connected via USB instead of the dongle | ||
+ | * Byte 0 is always 0x02 - this is the endpoint I think | ||
+ | * Data is only sent from the device once it has been subscribed to: | ||
+ | * 02b410 - Subscribes to battery change events | ||
+ | * 02b004 - Subscribes to button press and wheel events | ||
+ | * 02b801 - Subscribes to dongle connection events | ||
+ | |||
+ | Commands/ | ||
+ | |||
+ | * 02b40801& | ||
+ | * 02b4040101& | ||
+ | * 02b10a01& | ||
+ | * 02b1&0 - Set the display rotation (0 = 0º, 3 = 270º) | ||
+ | * 02b40101& | ||
+ | * 02b100& | ||
+ | * 02b1& | ||
+ | |||
+ | ===== Links ===== | ||
+ | |||
+ | [[https:// | ||