update and add docs to serialace
This commit is contained in:
parent
737973c334
commit
46cf7030a1
@ -29,6 +29,7 @@
|
|||||||
- [Mouse keys](mouse_keys.md): Adds mouse keycodes
|
- [Mouse keys](mouse_keys.md): Adds mouse keycodes
|
||||||
- [OneShot](oneshot.md): Adds support for oneshot/sticky keys.
|
- [OneShot](oneshot.md): Adds support for oneshot/sticky keys.
|
||||||
- [Power](power.md): Power saving features. This is mostly useful when on battery power.
|
- [Power](power.md): Power saving features. This is mostly useful when on battery power.
|
||||||
|
- [SerialACE](serialace.md): Arbitrary Code Execution over the data serial.
|
||||||
- [Split](split_keyboards.md): Keyboards split in two. Seems ergonomic!
|
- [Split](split_keyboards.md): Keyboards split in two. Seems ergonomic!
|
||||||
- [TapDance](tapdance.md): Different key actions depending on how often it is pressed.
|
- [TapDance](tapdance.md): Different key actions depending on how often it is pressed.
|
||||||
|
|
||||||
|
@ -16,6 +16,7 @@ when tapped, and modifier when held.
|
|||||||
- [OneShot](oneshot.md): Adds support for oneshot/sticky keys.
|
- [OneShot](oneshot.md): Adds support for oneshot/sticky keys.
|
||||||
- [Power](power.md): Power saving features. This is mostly useful when on battery power.
|
- [Power](power.md): Power saving features. This is mostly useful when on battery power.
|
||||||
- [Split](split_keyboards.md): Keyboards split in two. Seems ergonomic!
|
- [Split](split_keyboards.md): Keyboards split in two. Seems ergonomic!
|
||||||
|
- [SerialACE](serialace.md): Arbitrary Code Execution over the data serial.
|
||||||
- [TapDance](tapdance.md): Different key actions depending on how often it is pressed.
|
- [TapDance](tapdance.md): Different key actions depending on how often it is pressed.
|
||||||
- [Dynamic Sequences](dynamic_sequences.md): Records a sequence of keypresses and plays it back.
|
- [Dynamic Sequences](dynamic_sequences.md): Records a sequence of keypresses and plays it back.
|
||||||
|
|
||||||
|
51
docs/serialace.md
Normal file
51
docs/serialace.md
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
# Serial ACE (Arbitrary Code Execution over serial interface)
|
||||||
|
|
||||||
|
> Caution: This module allows unrestricted, arbitrary code execution on your KMK
|
||||||
|
> device. That includes potential exploits, such as keyloggers, and unvetted
|
||||||
|
> user code that may result in undesired behaviour and/or crashes.
|
||||||
|
> This feature is purely experimental in the sense that you probably neither
|
||||||
|
> want nor should use it in production.
|
||||||
|
> Advanced knowledge of python and the serial console is required, and we will
|
||||||
|
> not provide help or support in any way.
|
||||||
|
|
||||||
|
This module provides an API to run any valid python code on your keyboard and
|
||||||
|
return the result of that code via an additional serial consol (not the one you
|
||||||
|
use for the circuitpython debugger).
|
||||||
|
|
||||||
|
|
||||||
|
## Prerequisite
|
||||||
|
|
||||||
|
Enable the data serial in `boot.py`:
|
||||||
|
```python
|
||||||
|
import usb_cdc
|
||||||
|
usb_cdc.enable(data=True)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
Enable the module, just as any other module else:
|
||||||
|
```
|
||||||
|
from kmk.modules.serialace import SerialACE
|
||||||
|
keyboard.modules.append(SerialACE())
|
||||||
|
```
|
||||||
|
|
||||||
|
Assume the data serial is on `/dev/ttyACM1`.
|
||||||
|
Depending on your OS settings, it bay be necessary to explicitly set the serial
|
||||||
|
device to raw transmission, no echo:
|
||||||
|
```bash
|
||||||
|
stty -F /dev/ttyACM1 raw -echo
|
||||||
|
```
|
||||||
|
|
||||||
|
### Get the List of Active Layers
|
||||||
|
```bash
|
||||||
|
$ echo "keyboard.active_layers" > /dev/ttyACM1
|
||||||
|
$ cat /dev/ttyACM1
|
||||||
|
[0]
|
||||||
|
```
|
||||||
|
|
||||||
|
### "Tap" a Key
|
||||||
|
```bash
|
||||||
|
$ echo "exec('from kmk.keys import KC; keyboard.tap_key(KC.Y)')" > /dev/ttyACM1
|
||||||
|
$ y
|
||||||
|
```
|
@ -1,8 +1,9 @@
|
|||||||
from usb_cdc import data
|
from usb_cdc import data
|
||||||
|
|
||||||
from kmk.modules import Module
|
from kmk.modules import Module
|
||||||
|
from kmk.utils import Debug
|
||||||
|
|
||||||
debug_enabled = False
|
debug = Debug(__name__)
|
||||||
|
|
||||||
|
|
||||||
class SerialACE(Module):
|
class SerialACE(Module):
|
||||||
@ -39,17 +40,18 @@ class SerialACE(Module):
|
|||||||
if idx == -1:
|
if idx == -1:
|
||||||
return
|
return
|
||||||
|
|
||||||
# Split off command and evaluate
|
# Split off command and evaluate.
|
||||||
line = self.buffer[:idx]
|
line = self.buffer[:idx]
|
||||||
self.buffer = self.buffer[idx + 1 :]
|
self.buffer = self.buffer[idx + 1 :]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if debug_enabled:
|
if debug.enabled:
|
||||||
print(f'SerialACE eval({line})')
|
debug(f'eval({line})')
|
||||||
ret = eval(line, {'keyboard': keyboard})
|
ret = eval(line, {'keyboard': keyboard})
|
||||||
data.write(bytearray(str(ret) + '\n'))
|
data.write(bytearray(str(ret) + '\n'))
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
if debug_enabled:
|
if debug.enabled:
|
||||||
print(f'SerialACE error({err})')
|
debug(f'error: {err}')
|
||||||
|
|
||||||
def after_hid_send(self, keyboard):
|
def after_hid_send(self, keyboard):
|
||||||
pass
|
pass
|
||||||
|
Loading…
x
Reference in New Issue
Block a user