From e0853ade9bc44cb6f331a68d4f75db4e4e43a465 Mon Sep 17 00:00:00 2001 From: evilsocket Date: Wed, 20 Feb 2019 12:24:05 +0100 Subject: [PATCH] some progress on HID injection --- modules/hid_recon/hid_builders.go | 13 + modules/hid_recon/hid_command.go | 11 + modules/hid_recon/hid_keymaps.go | 2113 +++++++++++++++++++++++++++++ modules/hid_recon/hid_logitech.go | 8 + modules/hid_recon/hid_recon.go | 147 +- 5 files changed, 2254 insertions(+), 38 deletions(-) create mode 100644 modules/hid_recon/hid_builders.go create mode 100644 modules/hid_recon/hid_command.go create mode 100644 modules/hid_recon/hid_keymaps.go create mode 100644 modules/hid_recon/hid_logitech.go diff --git a/modules/hid_recon/hid_builders.go b/modules/hid_recon/hid_builders.go new file mode 100644 index 00000000..9b709fcb --- /dev/null +++ b/modules/hid_recon/hid_builders.go @@ -0,0 +1,13 @@ +package hid_recon + +import ( + "github.com/bettercap/bettercap/network" +) + +type FrameBuilder interface { + BuildFrames(commands []Command) +} + +var FrameBuilders = map[network.HIDType]FrameBuilder{ + network.HIDTypeLogitech: LogitechBuilder{}, +} diff --git a/modules/hid_recon/hid_command.go b/modules/hid_recon/hid_command.go new file mode 100644 index 00000000..05ba96ee --- /dev/null +++ b/modules/hid_recon/hid_command.go @@ -0,0 +1,11 @@ +package hid_recon + +type Frame []byte + +type Command struct { + Mode byte + HID byte + Char string + Sleep byte + Frames []Frame +} diff --git a/modules/hid_recon/hid_keymaps.go b/modules/hid_recon/hid_keymaps.go new file mode 100644 index 00000000..413fe2d7 --- /dev/null +++ b/modules/hid_recon/hid_keymaps.go @@ -0,0 +1,2113 @@ +package hid_recon + +type KeyMap map[string]Command + +var BaseMap = KeyMap{ + "": Command{}, + "ALT": Command{Mode: 4}, + "SHIFT": Command{Mode: 2}, + "CTRL": Command{Mode: 1}, + "GUI": Command{Mode: 8}, + "SCROLLLOCK": Command{HID: 71}, + "ENTER": Command{HID: 40}, + "F12": Command{HID: 69}, + "HOME": Command{HID: 74}, + "F10": Command{HID: 67}, + "F9": Command{HID: 66}, + "ESCAPE": Command{HID: 41}, + "PAGEUP": Command{HID: 75}, + "TAB": Command{HID: 43}, + "PRINTSCREEN": Command{HID: 70}, + "F2": Command{HID: 59}, + "CAPSLOCK": Command{HID: 57}, + "F1": Command{HID: 58}, + "F4": Command{HID: 61}, + "F6": Command{HID: 63}, + "F8": Command{HID: 65}, + "DOWNARROW": Command{HID: 81}, + "DELETE": Command{HID: 42}, + "RIGHT": Command{HID: 79}, + "F3": Command{HID: 60}, + "DOWN": Command{HID: 81}, + "DEL": Command{HID: 76}, + "END": Command{HID: 77}, + "INSERT": Command{HID: 73}, + "F5": Command{HID: 62}, + "LEFTARROW": Command{HID: 80}, + "RIGHTARROW": Command{HID: 79}, + "PAGEDOWN": Command{HID: 78}, + "PAUSE": Command{HID: 72}, + "SPACE": Command{HID: 44}, + "UPARROW": Command{HID: 82}, + "F11": Command{HID: 68}, + "F7": Command{HID: 64}, + "UP": Command{HID: 82}, + "LEFT": Command{HID: 80}, +} + +var KeyMaps = map[string]KeyMap{ + "be": KeyMap{ + " ": Command{HID: 44}, + "$": Command{HID: 48}, + "(": Command{HID: 34}, + ",": Command{HID: 16}, + "0": Command{HID: 39, Mode: 2}, + "4": Command{HID: 33, Mode: 2}, + "8": Command{HID: 37, Mode: 2}, + "<": Command{HID: 100}, + "@": Command{HID: 31, Mode: 64}, + "€": Command{HID: 8, Mode: 64}, + "D": Command{HID: 7, Mode: 2}, + "H": Command{HID: 11, Mode: 2}, + "L": Command{HID: 15, Mode: 2}, + "P": Command{HID: 19, Mode: 2}, + "§": Command{HID: 35}, + "T": Command{HID: 23, Mode: 2}, + "X": Command{HID: 27, Mode: 2}, + "\\": Command{HID: 100, Mode: 64}, + "`": Command{HID: 49, Mode: 64}, + "d": Command{HID: 7}, + "h": Command{HID: 11}, + "£": Command{HID: 49, Mode: 2}, + "l": Command{HID: 15}, + "p": Command{HID: 19}, + "t": Command{HID: 23}, + "x": Command{HID: 27}, + "|": Command{HID: 30, Mode: 64}, + "BACKSPACE": Command{HID: 42}, + "#": Command{HID: 32, Mode: 64}, + "'": Command{HID: 33}, + "+": Command{HID: 56, Mode: 2}, + "/": Command{HID: 55, Mode: 2}, + "3": Command{HID: 32, Mode: 2}, + "7": Command{HID: 36, Mode: 2}, + ";": Command{HID: 54}, + "?": Command{HID: 16, Mode: 2}, + "C": Command{HID: 6, Mode: 2}, + "G": Command{HID: 10, Mode: 2}, + "K": Command{HID: 14, Mode: 2}, + "³": Command{HID: 53, Mode: 2}, + "O": Command{HID: 18, Mode: 2}, + "S": Command{HID: 22, Mode: 2}, + "è": Command{HID: 36}, + "W": Command{HID: 29, Mode: 2}, + "[": Command{HID: 48, Mode: 64}, + "_": Command{HID: 46, Mode: 2}, + "c": Command{HID: 6}, + "g": Command{HID: 10}, + "k": Command{HID: 14}, + "o": Command{HID: 18}, + "s": Command{HID: 22}, + "w": Command{HID: 29}, + "{": Command{HID: 38, Mode: 64}, + "à": Command{HID: 39}, + "é": Command{HID: 31}, + "\"": Command{HID: 32}, + "&": Command{HID: 30}, + "*": Command{HID: 48, Mode: 2}, + "ç": Command{HID: 38}, + ".": Command{HID: 54, Mode: 2}, + "ù": Command{HID: 52}, + "2": Command{HID: 31, Mode: 2}, + "6": Command{HID: 35, Mode: 2}, + ":": Command{HID: 55}, + ">": Command{HID: 100, Mode: 2}, + "B": Command{HID: 5, Mode: 2}, + "F": Command{HID: 9, Mode: 2}, + "J": Command{HID: 13, Mode: 2}, + "N": Command{HID: 17, Mode: 2}, + "R": Command{HID: 21, Mode: 2}, + "V": Command{HID: 25, Mode: 2}, + "Z": Command{HID: 26, Mode: 2}, + "^": Command{HID: 35, Mode: 64}, + "b": Command{HID: 5}, + "f": Command{HID: 9}, + "j": Command{HID: 13}, + "n": Command{HID: 17}, + "µ": Command{HID: 49}, + "r": Command{HID: 21}, + "°": Command{HID: 45, Mode: 2}, + "²": Command{HID: 53}, + "v": Command{HID: 25}, + "z": Command{HID: 26}, + "~": Command{HID: 56, Mode: 64}, + "!": Command{HID: 37}, + "%": Command{HID: 52, Mode: 2}, + ")": Command{HID: 45}, + "-": Command{HID: 46}, + "1": Command{HID: 30, Mode: 2}, + "5": Command{HID: 34, Mode: 2}, + "9": Command{HID: 38, Mode: 2}, + "=": Command{HID: 56}, + "A": Command{HID: 20, Mode: 2}, + "E": Command{HID: 8, Mode: 2}, + "I": Command{HID: 12, Mode: 2}, + "M": Command{HID: 51, Mode: 2}, + "Q": Command{HID: 4, Mode: 2}, + "U": Command{HID: 24, Mode: 2}, + "Y": Command{HID: 28, Mode: 2}, + "]": Command{HID: 47, Mode: 64}, + "a": Command{HID: 20}, + "e": Command{HID: 8}, + "i": Command{HID: 12}, + "m": Command{HID: 51}, + "q": Command{HID: 4}, + "u": Command{HID: 24}, + "y": Command{HID: 28}, + "}": Command{HID: 39, Mode: 64}, + }, + "fr": KeyMap{ + " ": Command{HID: 44}, + "$": Command{HID: 48}, + "(": Command{HID: 34}, + ",": Command{HID: 16}, + "0": Command{HID: 39, Mode: 2}, + "4": Command{HID: 33, Mode: 2}, + "8": Command{HID: 37, Mode: 2}, + "<": Command{HID: 100}, + "@": Command{HID: 39, Mode: 64}, + "D": Command{HID: 7, Mode: 2}, + "H": Command{HID: 11, Mode: 2}, + "L": Command{HID: 15, Mode: 2}, + "P": Command{HID: 19, Mode: 2}, + "T": Command{HID: 23, Mode: 2}, + "X": Command{HID: 27, Mode: 2}, + "\\": Command{HID: 37, Mode: 64}, + "`": Command{HID: 36, Mode: 64}, + "d": Command{HID: 7}, + "h": Command{HID: 11}, + "l": Command{HID: 15}, + "p": Command{HID: 19}, + "t": Command{HID: 23}, + "x": Command{HID: 27}, + "|": Command{HID: 35, Mode: 64}, + "BACKSPACE": Command{HID: 42}, + "#": Command{HID: 32, Mode: 64}, + "'": Command{HID: 33}, + "+": Command{HID: 46, Mode: 2}, + "/": Command{HID: 55, Mode: 2}, + "3": Command{HID: 32, Mode: 2}, + "7": Command{HID: 36, Mode: 2}, + ";": Command{HID: 54}, + "?": Command{HID: 16, Mode: 2}, + "C": Command{HID: 6, Mode: 2}, + "G": Command{HID: 10, Mode: 2}, + "K": Command{HID: 14, Mode: 2}, + "O": Command{HID: 18, Mode: 2}, + "S": Command{HID: 22, Mode: 2}, + "W": Command{HID: 29, Mode: 2}, + "[": Command{HID: 34, Mode: 64}, + "_": Command{HID: 37}, + "c": Command{HID: 6}, + "g": Command{HID: 10}, + "k": Command{HID: 14}, + "o": Command{HID: 18}, + "s": Command{HID: 22}, + "w": Command{HID: 29}, + "{": Command{HID: 33, Mode: 64}, + "\"": Command{HID: 32}, + "&": Command{HID: 30}, + "*": Command{HID: 49}, + ".": Command{HID: 54, Mode: 2}, + "2": Command{HID: 31, Mode: 2}, + "6": Command{HID: 35, Mode: 2}, + ":": Command{HID: 55}, + ">": Command{HID: 100, Mode: 2}, + "B": Command{HID: 5, Mode: 2}, + "F": Command{HID: 9, Mode: 2}, + "J": Command{HID: 13, Mode: 2}, + "N": Command{HID: 17, Mode: 2}, + "R": Command{HID: 21, Mode: 2}, + "V": Command{HID: 25, Mode: 2}, + "Z": Command{HID: 26, Mode: 2}, + "^": Command{HID: 38, Mode: 64}, + "b": Command{HID: 5}, + "f": Command{HID: 9}, + "j": Command{HID: 13}, + "n": Command{HID: 17}, + "r": Command{HID: 21}, + "v": Command{HID: 25}, + "z": Command{HID: 26}, + "~": Command{HID: 31, Mode: 64}, + "!": Command{HID: 56}, + "%": Command{HID: 52, Mode: 2}, + ")": Command{HID: 45}, + "-": Command{HID: 35}, + "1": Command{HID: 30, Mode: 2}, + "5": Command{HID: 34, Mode: 2}, + "9": Command{HID: 38, Mode: 2}, + "=": Command{HID: 46}, + "A": Command{HID: 20, Mode: 2}, + "E": Command{HID: 8, Mode: 2}, + "I": Command{HID: 12, Mode: 2}, + "M": Command{HID: 51, Mode: 2}, + "Q": Command{HID: 4, Mode: 2}, + "U": Command{HID: 24, Mode: 2}, + "Y": Command{HID: 28, Mode: 2}, + "]": Command{HID: 45, Mode: 64}, + "a": Command{HID: 20}, + "e": Command{HID: 8}, + "i": Command{HID: 12}, + "m": Command{HID: 51}, + "q": Command{HID: 4}, + "u": Command{HID: 24}, + "y": Command{HID: 28}, + "}": Command{HID: 46, Mode: 64}, + }, + "ch": KeyMap{ + " ": Command{HID: 44}, + "$": Command{HID: 49}, + "(": Command{HID: 37, Mode: 2}, + ",": Command{HID: 54}, + "0": Command{HID: 39}, + "4": Command{HID: 33}, + "8": Command{HID: 37}, + "<": Command{HID: 100}, + "@": Command{HID: 31, Mode: 64}, + "€": Command{HID: 8, Mode: 64}, + "D": Command{HID: 7, Mode: 2}, + "H": Command{HID: 11, Mode: 2}, + "L": Command{HID: 15, Mode: 2}, + "P": Command{HID: 19, Mode: 2}, + "§": Command{HID: 53}, + "T": Command{HID: 23, Mode: 2}, + "X": Command{HID: 27, Mode: 2}, + "\\": Command{HID: 100, Mode: 64}, + "`": Command{HID: 46, Mode: 2}, + "d": Command{HID: 7}, + "h": Command{HID: 11}, + "l": Command{HID: 15}, + "p": Command{HID: 19}, + "t": Command{HID: 23}, + "x": Command{HID: 27}, + "|": Command{HID: 36, Mode: 64}, + "BACKSPACE": Command{HID: 42}, + "#": Command{HID: 32, Mode: 64}, + "'": Command{HID: 45}, + "+": Command{HID: 30, Mode: 2}, + "/": Command{HID: 36, Mode: 2}, + "3": Command{HID: 32}, + "7": Command{HID: 36}, + ";": Command{HID: 54, Mode: 2}, + "?": Command{HID: 45, Mode: 2}, + "C": Command{HID: 6, Mode: 2}, + "G": Command{HID: 10, Mode: 2}, + "K": Command{HID: 14, Mode: 2}, + "O": Command{HID: 18, Mode: 2}, + "S": Command{HID: 22, Mode: 2}, + "W": Command{HID: 26, Mode: 2}, + "[": Command{HID: 47, Mode: 64}, + "_": Command{HID: 56, Mode: 2}, + "c": Command{HID: 6}, + "g": Command{HID: 10}, + "k": Command{HID: 14}, + "o": Command{HID: 18}, + "s": Command{HID: 22}, + "w": Command{HID: 26}, + "{": Command{HID: 53, Mode: 64}, + "Ä": Command{HID: 52, Mode: 2}, + "ß": Command{HID: 45}, + "Ü": Command{HID: 47, Mode: 2}, + "ä": Command{HID: 52}, + "Ö": Command{HID: 51, Mode: 2}, + "\"": Command{HID: 31, Mode: 2}, + "&": Command{HID: 35, Mode: 2}, + "*": Command{HID: 32, Mode: 2}, + ".": Command{HID: 55}, + "2": Command{HID: 31}, + "6": Command{HID: 35}, + ":": Command{HID: 55, Mode: 2}, + "ö": Command{HID: 51}, + ">": Command{HID: 100, Mode: 2}, + "B": Command{HID: 5, Mode: 2}, + "F": Command{HID: 9, Mode: 2}, + "J": Command{HID: 13, Mode: 2}, + "N": Command{HID: 17, Mode: 2}, + "R": Command{HID: 21, Mode: 2}, + "V": Command{HID: 25, Mode: 2}, + "Z": Command{HID: 28, Mode: 2}, + "^": Command{HID: 46}, + "b": Command{HID: 5}, + "f": Command{HID: 9}, + "j": Command{HID: 13}, + "n": Command{HID: 17}, + "r": Command{HID: 21}, + "°": Command{HID: 53, Mode: 2}, + "v": Command{HID: 25}, + "z": Command{HID: 28}, + "~": Command{HID: 46, Mode: 64}, + "ü": Command{HID: 47}, + "!": Command{HID: 48, Mode: 2}, + "%": Command{HID: 34, Mode: 2}, + ")": Command{HID: 38, Mode: 2}, + "-": Command{HID: 56}, + "1": Command{HID: 30}, + "5": Command{HID: 34}, + "9": Command{HID: 38}, + "=": Command{HID: 39, Mode: 2}, + "A": Command{HID: 4, Mode: 2}, + "E": Command{HID: 8, Mode: 2}, + "I": Command{HID: 12, Mode: 2}, + "M": Command{HID: 16, Mode: 2}, + "Q": Command{HID: 20, Mode: 2}, + "U": Command{HID: 24, Mode: 2}, + "Y": Command{HID: 29, Mode: 2}, + "]": Command{HID: 48, Mode: 64}, + "a": Command{HID: 4}, + "e": Command{HID: 8}, + "i": Command{HID: 12}, + "m": Command{HID: 16}, + "q": Command{HID: 20}, + "u": Command{HID: 24}, + "y": Command{HID: 29}, + "}": Command{HID: 49, Mode: 64}, + }, + "dk": KeyMap{ + "ð": Command{HID: 7, Mode: 64}, + " ": Command{HID: 44}, + "$": Command{HID: 33, Mode: 64}, + "(": Command{HID: 37, Mode: 2}, + ",": Command{HID: 54}, + "0": Command{HID: 39}, + "4": Command{HID: 33}, + "8": Command{HID: 37}, + "<": Command{HID: 100}, + "@": Command{HID: 31, Mode: 64}, + "€": Command{HID: 8, Mode: 64}, + "D": Command{HID: 7, Mode: 2}, + "H": Command{HID: 11, Mode: 2}, + "L": Command{HID: 15, Mode: 2}, + "P": Command{HID: 19, Mode: 2}, + "§": Command{HID: 53, Mode: 2}, + "T": Command{HID: 23, Mode: 2}, + "X": Command{HID: 27, Mode: 2}, + "\\": Command{HID: 100, Mode: 64}, + "d": Command{HID: 7}, + "h": Command{HID: 11}, + "£": Command{HID: 32, Mode: 64}, + "l": Command{HID: 15}, + "p": Command{HID: 19}, + "t": Command{HID: 23}, + "x": Command{HID: 27}, + "|": Command{HID: 46, Mode: 64}, + "BACKSPACE": Command{HID: 42}, + "«": Command{HID: 33}, + "#": Command{HID: 32, Mode: 2}, + "'": Command{HID: 49}, + "+": Command{HID: 45}, + "/": Command{HID: 36, Mode: 2}, + "3": Command{HID: 32}, + "7": Command{HID: 36}, + ";": Command{HID: 54, Mode: 2}, + "?": Command{HID: 45, Mode: 2}, + "C": Command{HID: 6, Mode: 2}, + "G": Command{HID: 10, Mode: 2}, + "K": Command{HID: 14, Mode: 2}, + "O": Command{HID: 18, Mode: 2}, + "S": Command{HID: 22, Mode: 2}, + "W": Command{HID: 26, Mode: 2}, + "[": Command{HID: 37, Mode: 64}, + "_": Command{HID: 56, Mode: 2}, + "c": Command{HID: 6}, + "g": Command{HID: 10}, + "k": Command{HID: 14}, + "o": Command{HID: 18}, + "s": Command{HID: 22}, + "w": Command{HID: 26}, + "{": Command{HID: 36, Mode: 64}, + "Æ": Command{HID: 51, Mode: 2}, + "Å": Command{HID: 47, Mode: 2}, + "Ø": Command{HID: 52, Mode: 2}, + "ß": Command{HID: 22, Mode: 64}, + "ø": Command{HID: 52}, + "\"": Command{HID: 31, Mode: 2}, + "&": Command{HID: 35, Mode: 2}, + "*": Command{HID: 49, Mode: 2}, + "æ": Command{HID: 51}, + "å": Command{HID: 47}, + ".": Command{HID: 55}, + "2": Command{HID: 31}, + "þ": Command{HID: 23, Mode: 64}, + "6": Command{HID: 35}, + ":": Command{HID: 55, Mode: 2}, + ">": Command{HID: 100, Mode: 2}, + "B": Command{HID: 5, Mode: 2}, + "F": Command{HID: 9, Mode: 2}, + "J": Command{HID: 13, Mode: 2}, + "N": Command{HID: 17, Mode: 2}, + "R": Command{HID: 21, Mode: 2}, + "V": Command{HID: 25, Mode: 2}, + "Z": Command{HID: 29, Mode: 2}, + "¤": Command{HID: 33, Mode: 2}, + "b": Command{HID: 5}, + "f": Command{HID: 9}, + "j": Command{HID: 13}, + "¨": Command{}, + "n": Command{HID: 17}, + "´": Command{}, + "µ": Command{HID: 16, Mode: 64}, + "r": Command{HID: 21}, + "v": Command{HID: 25}, + "½": Command{HID: 53}, + "z": Command{HID: 29}, + "~": Command{HID: 48, Mode: 64}, + "!": Command{HID: 30, Mode: 2}, + "%": Command{HID: 34, Mode: 2}, + ")": Command{HID: 38, Mode: 2}, + "-": Command{HID: 56}, + "1": Command{HID: 30}, + "5": Command{HID: 34}, + "9": Command{HID: 38}, + "=": Command{HID: 39, Mode: 2}, + "A": Command{HID: 4, Mode: 2}, + "E": Command{HID: 8, Mode: 2}, + "I": Command{HID: 12, Mode: 2}, + "M": Command{HID: 16, Mode: 2}, + "Q": Command{HID: 20, Mode: 2}, + "U": Command{HID: 24, Mode: 2}, + "Y": Command{HID: 28, Mode: 2}, + "]": Command{HID: 38, Mode: 64}, + "a": Command{HID: 4}, + "e": Command{HID: 8}, + "i": Command{HID: 12}, + "m": Command{HID: 16}, + "q": Command{HID: 20}, + "u": Command{HID: 24}, + "y": Command{HID: 28}, + "}": Command{HID: 39, Mode: 64}, + }, + "pt": KeyMap{ + " ": Command{HID: 44}, + "$": Command{HID: 33, Mode: 2}, + "(": Command{HID: 37, Mode: 2}, + ",": Command{HID: 54}, + "0": Command{HID: 39}, + "4": Command{HID: 33}, + "8": Command{HID: 37}, + "<": Command{HID: 100}, + "@": Command{HID: 31, Mode: 64}, + "€": Command{HID: 8, Mode: 64}, + "D": Command{HID: 7, Mode: 2}, + "H": Command{HID: 11, Mode: 2}, + "L": Command{HID: 15, Mode: 2}, + "P": Command{HID: 19, Mode: 2}, + "§": Command{HID: 33, Mode: 64}, + "T": Command{HID: 23, Mode: 2}, + "X": Command{HID: 27, Mode: 2}, + "\\": Command{HID: 53}, + "`": Command{HID: 48, Mode: 2}, + "d": Command{HID: 7}, + "h": Command{HID: 11}, + "£": Command{HID: 32, Mode: 64}, + "l": Command{HID: 15}, + "p": Command{HID: 19}, + "t": Command{HID: 23}, + "x": Command{HID: 27}, + "|": Command{HID: 53, Mode: 2}, + "BACKSPACE": Command{HID: 42}, + "«": Command{HID: 46}, + "#": Command{HID: 32, Mode: 2}, + "'": Command{HID: 45}, + "+": Command{HID: 47}, + "/": Command{HID: 36, Mode: 2}, + "3": Command{HID: 32}, + "7": Command{HID: 36}, + ";": Command{HID: 54, Mode: 2}, + "?": Command{HID: 45, Mode: 2}, + "C": Command{HID: 6, Mode: 2}, + "G": Command{HID: 10, Mode: 2}, + "K": Command{HID: 14, Mode: 2}, + "O": Command{HID: 18, Mode: 2}, + "S": Command{HID: 22, Mode: 2}, + "W": Command{HID: 26, Mode: 2}, + "[": Command{HID: 37, Mode: 64}, + "_": Command{HID: 56, Mode: 2}, + "c": Command{HID: 6}, + "g": Command{HID: 10}, + "k": Command{HID: 14}, + "o": Command{HID: 18}, + "s": Command{HID: 22}, + "w": Command{HID: 26}, + "{": Command{HID: 36, Mode: 64}, + "»": Command{HID: 46, Mode: 2}, + "Ç": Command{HID: 51, Mode: 2}, + "\"": Command{HID: 31, Mode: 2}, + "&": Command{HID: 35, Mode: 2}, + "*": Command{HID: 47, Mode: 2}, + "ç": Command{HID: 51}, + ".": Command{HID: 55}, + "2": Command{HID: 31}, + "6": Command{HID: 35}, + ":": Command{HID: 55, Mode: 2}, + ">": Command{HID: 100, Mode: 2}, + "B": Command{HID: 5, Mode: 2}, + "F": Command{HID: 9, Mode: 2}, + "J": Command{HID: 13, Mode: 2}, + "N": Command{HID: 17, Mode: 2}, + "R": Command{HID: 21, Mode: 2}, + "V": Command{HID: 25, Mode: 2}, + "Z": Command{HID: 29, Mode: 2}, + "^": Command{HID: 50, Mode: 2}, + "b": Command{HID: 5}, + "f": Command{HID: 9}, + "j": Command{HID: 13}, + "ª": Command{HID: 52, Mode: 2}, + "n": Command{HID: 17}, + "r": Command{HID: 21}, + "v": Command{HID: 25}, + "z": Command{HID: 29}, + "º": Command{HID: 52}, + "~": Command{HID: 50}, + "!": Command{HID: 30, Mode: 2}, + "%": Command{HID: 34, Mode: 2}, + ")": Command{HID: 38, Mode: 2}, + "-": Command{HID: 56}, + "1": Command{HID: 30}, + "5": Command{HID: 34}, + "9": Command{HID: 38}, + "=": Command{HID: 39, Mode: 2}, + "A": Command{HID: 4, Mode: 2}, + "E": Command{HID: 8, Mode: 2}, + "I": Command{HID: 12, Mode: 2}, + "M": Command{HID: 16, Mode: 2}, + "Q": Command{HID: 20, Mode: 2}, + "U": Command{HID: 24, Mode: 2}, + "Y": Command{HID: 28, Mode: 2}, + "]": Command{HID: 38, Mode: 64}, + "a": Command{HID: 4}, + "e": Command{HID: 8}, + "i": Command{HID: 12}, + "m": Command{HID: 16}, + "q": Command{HID: 20}, + "u": Command{HID: 24}, + "y": Command{HID: 28}, + "}": Command{HID: 39, Mode: 64}, + }, + "no": KeyMap{ + "ð": Command{HID: 7, Mode: 64}, + " ": Command{HID: 44}, + "$": Command{HID: 33, Mode: 64}, + "(": Command{HID: 37, Mode: 2}, + ",": Command{HID: 54}, + "0": Command{HID: 39}, + "4": Command{HID: 33}, + "8": Command{HID: 37}, + "<": Command{HID: 100}, + "@": Command{HID: 31, Mode: 64}, + "€": Command{HID: 8, Mode: 64}, + "D": Command{HID: 7, Mode: 2}, + "H": Command{HID: 11, Mode: 2}, + "L": Command{HID: 15, Mode: 2}, + "P": Command{HID: 19, Mode: 2}, + "§": Command{HID: 53, Mode: 2}, + "T": Command{HID: 23, Mode: 2}, + "X": Command{HID: 27, Mode: 2}, + "\\": Command{HID: 46}, + "`": Command{HID: 46, Mode: 2}, + "d": Command{HID: 7}, + "h": Command{HID: 11}, + "£": Command{HID: 32, Mode: 64}, + "l": Command{HID: 15}, + "p": Command{HID: 19}, + "t": Command{HID: 23}, + "x": Command{HID: 27}, + "|": Command{HID: 53}, + "BACKSPACE": Command{HID: 42}, + "«": Command{HID: 33}, + "#": Command{HID: 32, Mode: 2}, + "'": Command{HID: 49}, + "+": Command{HID: 45}, + "/": Command{HID: 36, Mode: 2}, + "3": Command{HID: 32}, + "7": Command{HID: 36}, + ";": Command{HID: 54, Mode: 2}, + "?": Command{HID: 45, Mode: 2}, + "C": Command{HID: 6, Mode: 2}, + "G": Command{HID: 10, Mode: 2}, + "K": Command{HID: 14, Mode: 2}, + "O": Command{HID: 18, Mode: 2}, + "S": Command{HID: 22, Mode: 2}, + "W": Command{HID: 26, Mode: 2}, + "[": Command{HID: 37, Mode: 64}, + "_": Command{HID: 56, Mode: 2}, + "c": Command{HID: 6}, + "g": Command{HID: 10}, + "k": Command{HID: 14}, + "o": Command{HID: 18}, + "s": Command{HID: 22}, + "w": Command{HID: 26}, + "{": Command{HID: 36, Mode: 64}, + "Æ": Command{HID: 52, Mode: 2}, + "Å": Command{HID: 47, Mode: 2}, + "Ø": Command{HID: 51, Mode: 2}, + "ß": Command{HID: 22, Mode: 64}, + "ø": Command{HID: 51}, + "\"": Command{HID: 31, Mode: 2}, + "&": Command{HID: 35, Mode: 2}, + "*": Command{HID: 49, Mode: 2}, + "æ": Command{HID: 52}, + "å": Command{HID: 47}, + ".": Command{HID: 55}, + "2": Command{HID: 31}, + "þ": Command{HID: 23, Mode: 64}, + "6": Command{HID: 35}, + ":": Command{HID: 55, Mode: 2}, + ">": Command{HID: 100, Mode: 2}, + "B": Command{HID: 5, Mode: 2}, + "F": Command{HID: 9, Mode: 2}, + "J": Command{HID: 13, Mode: 2}, + "N": Command{HID: 17, Mode: 2}, + "R": Command{HID: 21, Mode: 2}, + "V": Command{HID: 25, Mode: 2}, + "Z": Command{HID: 29, Mode: 2}, + "^": Command{HID: 48, Mode: 2}, + "¤": Command{HID: 33, Mode: 2}, + "b": Command{HID: 5}, + "f": Command{HID: 9}, + "j": Command{HID: 13}, + "n": Command{HID: 17}, + "µ": Command{HID: 16, Mode: 64}, + "r": Command{HID: 21}, + "v": Command{HID: 25}, + "½": Command{HID: 53}, + "z": Command{HID: 29}, + "~": Command{HID: 48, Mode: 64}, + "!": Command{HID: 30, Mode: 2}, + "%": Command{HID: 34, Mode: 2}, + ")": Command{HID: 38, Mode: 2}, + "-": Command{HID: 56}, + "1": Command{HID: 30}, + "5": Command{HID: 34}, + "9": Command{HID: 38}, + "=": Command{HID: 39, Mode: 2}, + "A": Command{HID: 4, Mode: 2}, + "E": Command{HID: 8, Mode: 2}, + "I": Command{HID: 12, Mode: 2}, + "M": Command{HID: 16, Mode: 2}, + "Q": Command{HID: 20, Mode: 2}, + "U": Command{HID: 24, Mode: 2}, + "Y": Command{HID: 28, Mode: 2}, + "]": Command{HID: 38, Mode: 64}, + "a": Command{HID: 4}, + "e": Command{HID: 8}, + "i": Command{HID: 12}, + "m": Command{HID: 16}, + "q": Command{HID: 20}, + "u": Command{HID: 24}, + "y": Command{HID: 28}, + "}": Command{HID: 39, Mode: 64}, + }, + "hr": KeyMap{ + "-": Command{HID: 56}, + " ": Command{HID: 44}, + "$": Command{HID: 33, Mode: 2}, + "(": Command{HID: 37, Mode: 2}, + ",": Command{HID: 54}, + "0": Command{HID: 39}, + "4": Command{HID: 33}, + "8": Command{HID: 37}, + "<": Command{HID: 100}, + "@": Command{HID: 25, Mode: 64}, + "€": Command{HID: 8, Mode: 64}, + "D": Command{HID: 7, Mode: 2}, + "H": Command{HID: 11, Mode: 2}, + "L": Command{HID: 15, Mode: 2}, + "P": Command{HID: 19, Mode: 2}, + "§": Command{HID: 16, Mode: 64}, + "T": Command{HID: 23, Mode: 2}, + "X": Command{HID: 27, Mode: 2}, + "\\": Command{HID: 20, Mode: 64}, + "`": Command{HID: 36, Mode: 64}, + "d": Command{HID: 7}, + "h": Command{HID: 11}, + "l": Command{HID: 15}, + "p": Command{HID: 19}, + "t": Command{HID: 23}, + "x": Command{HID: 27}, + "|": Command{HID: 26, Mode: 64}, + "#": Command{HID: 32, Mode: 2}, + "'": Command{HID: 45}, + "+": Command{HID: 46}, + "/": Command{HID: 36, Mode: 2}, + "I": Command{HID: 12, Mode: 2}, + "3": Command{HID: 32}, + "7": Command{HID: 36}, + ";": Command{HID: 54, Mode: 2}, + "?": Command{HID: 45, Mode: 2}, + "C": Command{HID: 6, Mode: 2}, + "G": Command{HID: 10, Mode: 2}, + "K": Command{HID: 14, Mode: 2}, + "O": Command{HID: 18, Mode: 2}, + "S": Command{HID: 22, Mode: 2}, + "W": Command{HID: 26, Mode: 2}, + "[": Command{HID: 9, Mode: 64}, + "_": Command{HID: 56, Mode: 2}, + "c": Command{HID: 6}, + "g": Command{HID: 10}, + "k": Command{HID: 14}, + "o": Command{HID: 18}, + "s": Command{HID: 22}, + "w": Command{HID: 26}, + "{": Command{HID: 5, Mode: 64}, + "ß": Command{HID: 52, Mode: 64}, + "×": Command{HID: 48, Mode: 64}, + "\"": Command{HID: 31, Mode: 2}, + "ˇ": Command{HID: 31, Mode: 64}, + "&": Command{HID: 35, Mode: 2}, + "*": Command{HID: 46, Mode: 2}, + ".": Command{HID: 55}, + "2": Command{HID: 31}, + "6": Command{HID: 35}, + "˛": Command{HID: 35, Mode: 64}, + "˙": Command{HID: 37, Mode: 64}, + ":": Command{HID: 55, Mode: 2}, + "÷": Command{HID: 47, Mode: 64}, + "˝": Command{HID: 39, Mode: 64}, + ">": Command{HID: 100, Mode: 2}, + "B": Command{HID: 5, Mode: 2}, + "F": Command{HID: 9, Mode: 2}, + "J": Command{HID: 13, Mode: 2}, + "N": Command{HID: 17, Mode: 2}, + "R": Command{HID: 21, Mode: 2}, + "V": Command{HID: 25, Mode: 2}, + "Z": Command{HID: 28, Mode: 2}, + "^": Command{HID: 32, Mode: 64}, + "¤": Command{HID: 49, Mode: 64}, + "b": Command{HID: 5}, + "f": Command{HID: 9}, + "j": Command{HID: 13}, + "¨": Command{HID: 45, Mode: 64}, + "n": Command{HID: 17}, + "´": Command{HID: 38, Mode: 64}, + "r": Command{HID: 21}, + "°": Command{HID: 34, Mode: 64}, + "v": Command{HID: 25}, + "z": Command{HID: 28}, + "¸": Command{HID: 46, Mode: 64}, + "~": Command{HID: 30, Mode: 64}, + "Ł": Command{HID: 15, Mode: 64}, + "ł": Command{HID: 14, Mode: 64}, + "!": Command{HID: 30, Mode: 2}, + "%": Command{HID: 34, Mode: 2}, + ")": Command{HID: 38, Mode: 2}, + "š": Command{HID: 47}, + "Š": Command{HID: 47, Mode: 2}, + "Ž": Command{HID: 49, Mode: 2}, + "ž": Command{HID: 49}, + "5": Command{HID: 34}, + "9": Command{HID: 38}, + "˘": Command{HID: 33, Mode: 64}, + "=": Command{HID: 39, Mode: 2}, + "A": Command{HID: 4, Mode: 2}, + "Č": Command{HID: 51, Mode: 2}, + "č": Command{HID: 51}, + "E": Command{HID: 8, Mode: 2}, + "Ć": Command{HID: 52, Mode: 2}, + "ć": Command{HID: 52}, + "M": Command{HID: 16, Mode: 2}, + "Q": Command{HID: 20, Mode: 2}, + "U": Command{HID: 24, Mode: 2}, + "Y": Command{HID: 29, Mode: 2}, + "]": Command{HID: 10, Mode: 64}, + "Đ": Command{HID: 48, Mode: 2}, + "đ": Command{HID: 48}, + "a": Command{HID: 4}, + "e": Command{HID: 8}, + "i": Command{HID: 12}, + "m": Command{HID: 16}, + "q": Command{HID: 20}, + "1": Command{HID: 30}, + "u": Command{HID: 24}, + "y": Command{HID: 29}, + "}": Command{HID: 17, Mode: 64}, + }, + "ca": KeyMap{ + " ": Command{HID: 44}, + "$": Command{HID: 33, Mode: 2}, + "(": Command{HID: 38, Mode: 2}, + ",": Command{HID: 54}, + "0": Command{HID: 39}, + "4": Command{HID: 33}, + "8": Command{HID: 37}, + "<": Command{HID: 49}, + "@": Command{HID: 31, Mode: 64}, + "D": Command{HID: 7, Mode: 2}, + "H": Command{HID: 11, Mode: 2}, + "L": Command{HID: 15, Mode: 2}, + "P": Command{HID: 19, Mode: 2}, + "§": Command{HID: 18, Mode: 64}, + "T": Command{HID: 23, Mode: 2}, + "X": Command{HID: 27, Mode: 2}, + "\\": Command{HID: 53, Mode: 64}, + "`": Command{HID: 52}, + "d": Command{HID: 7}, + "h": Command{HID: 11}, + "£": Command{HID: 32, Mode: 64}, + "l": Command{HID: 15}, + "p": Command{HID: 19}, + "t": Command{HID: 23}, + "x": Command{HID: 27}, + "|": Command{HID: 53, Mode: 2}, + "¯": Command{HID: 53, Mode: 64}, + "BACKSPACE": Command{HID: 42}, + "«": Command{Mode: 2}, + "#": Command{HID: 53}, + "'": Command{HID: 54, Mode: 2}, + "+": Command{HID: 46, Mode: 2}, + "/": Command{HID: 32, Mode: 2}, + "3": Command{HID: 32}, + "7": Command{HID: 36}, + ";": Command{HID: 51}, + "?": Command{HID: 35, Mode: 2}, + "C": Command{HID: 6, Mode: 2}, + "G": Command{HID: 10, Mode: 2}, + "K": Command{HID: 14, Mode: 2}, + "³": Command{HID: 38, Mode: 64}, + "O": Command{HID: 18, Mode: 2}, + "S": Command{HID: 22, Mode: 2}, + "W": Command{HID: 26, Mode: 2}, + "[": Command{HID: 47, Mode: 64}, + "_": Command{HID: 45, Mode: 2}, + "c": Command{HID: 6}, + "g": Command{HID: 10}, + "k": Command{HID: 14}, + "o": Command{HID: 18}, + "s": Command{HID: 22}, + "w": Command{HID: 26}, + "{": Command{HID: 52, Mode: 64}, + "»": Command{}, + "É": Command{HID: 56, Mode: 2}, + "é": Command{HID: 56}, + "\"": Command{HID: 31, Mode: 2}, + "&": Command{HID: 36, Mode: 2}, + "*": Command{HID: 37, Mode: 2}, + ".": Command{HID: 55}, + "2": Command{HID: 31}, + "6": Command{HID: 35}, + ":": Command{HID: 51, Mode: 2}, + ">": Command{HID: 49, Mode: 2}, + "B": Command{HID: 5, Mode: 2}, + "F": Command{HID: 9, Mode: 2}, + "J": Command{HID: 13, Mode: 2}, + "N": Command{HID: 17, Mode: 2}, + "R": Command{HID: 21, Mode: 2}, + "V": Command{HID: 25, Mode: 2}, + "Z": Command{HID: 29, Mode: 2}, + "^": Command{HID: 47}, + "¤": Command{HID: 34, Mode: 64}, + "¦": Command{HID: 36, Mode: 64}, + "b": Command{HID: 5}, + "¢": Command{HID: 33, Mode: 64}, + "f": Command{HID: 9}, + "¬": Command{HID: 35, Mode: 64}, + "­": Command{HID: 55, Mode: 64}, + "j": Command{HID: 13}, + "¨": Command{HID: 48, Mode: 2}, + "n": Command{HID: 17}, + "´": Command{HID: 56, Mode: 64}, + "µ": Command{HID: 16, Mode: 64}, + "¶": Command{HID: 19, Mode: 64}, + "r": Command{HID: 21}, + "°": Command{Mode: 64}, + "±": Command{HID: 30, Mode: 64}, + "²": Command{HID: 37, Mode: 64}, + "v": Command{HID: 25}, + "¼": Command{HID: 39, Mode: 64}, + "½": Command{HID: 45, Mode: 64}, + "¾": Command{HID: 46, Mode: 64}, + "z": Command{HID: 29}, + "¸": Command{HID: 48}, + "~": Command{HID: 51, Mode: 64}, + "!": Command{HID: 30, Mode: 2}, + "%": Command{HID: 34, Mode: 2}, + ")": Command{HID: 39, Mode: 2}, + "-": Command{HID: 45}, + "1": Command{HID: 30}, + "5": Command{HID: 34}, + "9": Command{HID: 38}, + "=": Command{HID: 46}, + "A": Command{HID: 4, Mode: 2}, + "E": Command{HID: 8, Mode: 2}, + "I": Command{HID: 12, Mode: 2}, + "M": Command{HID: 16, Mode: 2}, + "Q": Command{HID: 20, Mode: 2}, + "U": Command{HID: 24, Mode: 2}, + "Y": Command{HID: 28, Mode: 2}, + "]": Command{HID: 48, Mode: 64}, + "a": Command{HID: 4}, + "e": Command{HID: 8}, + "i": Command{HID: 12}, + "m": Command{HID: 16}, + "q": Command{HID: 20}, + "u": Command{HID: 24}, + "y": Command{HID: 28}, + "}": Command{HID: 49, Mode: 64}, + }, + "de": KeyMap{ + " ": Command{HID: 44}, + "$": Command{HID: 33, Mode: 2}, + "(": Command{HID: 37, Mode: 2}, + ",": Command{HID: 54}, + "0": Command{HID: 39}, + "4": Command{HID: 33}, + "8": Command{HID: 37}, + "<": Command{HID: 100}, + "@": Command{HID: 20, Mode: 64}, + "€": Command{HID: 8, Mode: 64}, + "D": Command{HID: 7, Mode: 2}, + "H": Command{HID: 11, Mode: 2}, + "L": Command{HID: 15, Mode: 2}, + "P": Command{HID: 19, Mode: 2}, + "§": Command{HID: 32, Mode: 2}, + "T": Command{HID: 23, Mode: 2}, + "X": Command{HID: 27, Mode: 2}, + "\\": Command{HID: 45, Mode: 64}, + "`": Command{HID: 46, Mode: 2}, + "d": Command{HID: 7}, + "h": Command{HID: 11}, + "l": Command{HID: 15}, + "p": Command{HID: 19}, + "t": Command{HID: 23}, + "x": Command{HID: 27}, + "|": Command{HID: 100, Mode: 64}, + "BACKSPACE": Command{HID: 42}, + "#": Command{HID: 49}, + "'": Command{HID: 49, Mode: 2}, + "+": Command{HID: 48}, + "/": Command{HID: 36, Mode: 2}, + "3": Command{HID: 32}, + "7": Command{HID: 36}, + ";": Command{HID: 54, Mode: 2}, + "?": Command{HID: 45, Mode: 2}, + "C": Command{HID: 6, Mode: 2}, + "G": Command{HID: 10, Mode: 2}, + "K": Command{HID: 14, Mode: 2}, + "³": Command{HID: 32, Mode: 64}, + "O": Command{HID: 18, Mode: 2}, + "S": Command{HID: 22, Mode: 2}, + "W": Command{HID: 26, Mode: 2}, + "[": Command{HID: 37, Mode: 64}, + "_": Command{HID: 56, Mode: 2}, + "c": Command{HID: 6}, + "g": Command{HID: 10}, + "k": Command{HID: 14}, + "o": Command{HID: 18}, + "s": Command{HID: 22}, + "w": Command{HID: 26}, + "{": Command{HID: 36, Mode: 64}, + "Ä": Command{HID: 52, Mode: 2}, + "ß": Command{HID: 45}, + "Ü": Command{HID: 47, Mode: 2}, + "ä": Command{HID: 52}, + "Ö": Command{HID: 51, Mode: 2}, + "\"": Command{HID: 31, Mode: 2}, + "&": Command{HID: 35, Mode: 2}, + "*": Command{HID: 48, Mode: 2}, + ".": Command{HID: 55}, + "2": Command{HID: 31}, + "6": Command{HID: 35}, + ":": Command{HID: 55, Mode: 2}, + "ö": Command{HID: 51}, + ">": Command{HID: 100, Mode: 2}, + "B": Command{HID: 5, Mode: 2}, + "F": Command{HID: 9, Mode: 2}, + "J": Command{HID: 13, Mode: 2}, + "N": Command{HID: 17, Mode: 2}, + "R": Command{HID: 21, Mode: 2}, + "V": Command{HID: 25, Mode: 2}, + "Z": Command{HID: 28, Mode: 2}, + "^": Command{HID: 53}, + "¤": Command{HID: 8, Mode: 64}, + "b": Command{HID: 5}, + "f": Command{HID: 9}, + "j": Command{HID: 13}, + "n": Command{HID: 17}, + "r": Command{HID: 21}, + "°": Command{HID: 53, Mode: 2}, + "²": Command{HID: 31, Mode: 64}, + "v": Command{HID: 25}, + "z": Command{HID: 28}, + "~": Command{HID: 48, Mode: 64}, + "ü": Command{HID: 47}, + "!": Command{HID: 30, Mode: 2}, + "%": Command{HID: 34, Mode: 2}, + ")": Command{HID: 38, Mode: 2}, + "-": Command{HID: 56}, + "1": Command{HID: 30}, + "5": Command{HID: 34}, + "9": Command{HID: 38}, + "=": Command{HID: 39, Mode: 2}, + "A": Command{HID: 4, Mode: 2}, + "E": Command{HID: 8, Mode: 2}, + "I": Command{HID: 12, Mode: 2}, + "M": Command{HID: 16, Mode: 2}, + "Q": Command{HID: 20, Mode: 2}, + "U": Command{HID: 24, Mode: 2}, + "Y": Command{HID: 29, Mode: 2}, + "]": Command{HID: 38, Mode: 64}, + "a": Command{HID: 4}, + "e": Command{HID: 8}, + "i": Command{HID: 12}, + "m": Command{HID: 16}, + "q": Command{HID: 20}, + "u": Command{HID: 24}, + "y": Command{HID: 29}, + "}": Command{HID: 39, Mode: 64}, + }, + "tr": KeyMap{ + " ": Command{HID: 44}, + "$": Command{HID: 33, Mode: 64}, + "(": Command{HID: 37, Mode: 2}, + ",": Command{HID: 49}, + "0": Command{HID: 39}, + "4": Command{HID: 33}, + "8": Command{HID: 37}, + "<": Command{HID: 54, Mode: 2}, + "@": Command{HID: 20, Mode: 64}, + "D": Command{HID: 7, Mode: 2}, + "H": Command{HID: 11, Mode: 2}, + "L": Command{HID: 15, Mode: 2}, + "P": Command{HID: 19, Mode: 2}, + "T": Command{HID: 23, Mode: 2}, + "X": Command{HID: 27, Mode: 2}, + "\\": Command{HID: 45, Mode: 64}, + "`": Command{HID: 49, Mode: 64}, + "d": Command{HID: 7}, + "h": Command{HID: 11}, + "l": Command{HID: 15}, + "p": Command{HID: 19}, + "t": Command{HID: 23}, + "x": Command{HID: 27}, + "|": Command{HID: 49, Mode: 2}, + "BACKSPACE": Command{HID: 42}, + "#": Command{HID: 32, Mode: 64}, + "'": Command{HID: 31, Mode: 2}, + "+": Command{HID: 33, Mode: 2}, + "/": Command{HID: 36, Mode: 2}, + "3": Command{HID: 32}, + "7": Command{HID: 36}, + ";": Command{HID: 49, Mode: 2}, + "?": Command{HID: 45, Mode: 2}, + "C": Command{HID: 6, Mode: 2}, + "G": Command{HID: 10, Mode: 2}, + "K": Command{HID: 14, Mode: 2}, + "O": Command{HID: 18, Mode: 2}, + "S": Command{HID: 22, Mode: 2}, + "W": Command{HID: 26, Mode: 2}, + "[": Command{HID: 37, Mode: 64}, + "_": Command{HID: 46, Mode: 2}, + "c": Command{HID: 6}, + "g": Command{HID: 10}, + "k": Command{HID: 14}, + "o": Command{HID: 18}, + "s": Command{HID: 22}, + "w": Command{HID: 26}, + "{": Command{HID: 36, Mode: 64}, + "\"": Command{HID: 53}, + "&": Command{HID: 36, Mode: 2}, + "*": Command{HID: 45}, + ".": Command{HID: 56}, + "2": Command{HID: 31}, + "6": Command{HID: 35}, + ":": Command{HID: 56, Mode: 2}, + ">": Command{HID: 55, Mode: 2}, + "B": Command{HID: 5, Mode: 2}, + "F": Command{HID: 9, Mode: 2}, + "J": Command{HID: 13, Mode: 2}, + "N": Command{HID: 17, Mode: 2}, + "R": Command{HID: 21, Mode: 2}, + "V": Command{HID: 25, Mode: 2}, + "Z": Command{HID: 29, Mode: 2}, + "^": Command{HID: 32, Mode: 2}, + "b": Command{HID: 5}, + "f": Command{HID: 9}, + "j": Command{HID: 13}, + "n": Command{HID: 17}, + "r": Command{HID: 21}, + "v": Command{HID: 25}, + "z": Command{HID: 29}, + "~": Command{HID: 48, Mode: 64}, + "!": Command{HID: 30, Mode: 2}, + "%": Command{HID: 34, Mode: 2}, + ")": Command{HID: 38, Mode: 2}, + "-": Command{HID: 46}, + "1": Command{HID: 30}, + "5": Command{HID: 34}, + "9": Command{HID: 38}, + "=": Command{HID: 39, Mode: 2}, + "A": Command{HID: 4, Mode: 2}, + "E": Command{HID: 8, Mode: 2}, + "I": Command{HID: 12, Mode: 2}, + "M": Command{HID: 16, Mode: 2}, + "Q": Command{HID: 20, Mode: 2}, + "U": Command{HID: 24, Mode: 2}, + "Y": Command{HID: 28, Mode: 2}, + "]": Command{HID: 38, Mode: 64}, + "a": Command{HID: 4}, + "e": Command{HID: 8}, + "i": Command{HID: 52}, + "m": Command{HID: 16}, + "q": Command{HID: 20}, + "u": Command{HID: 24}, + "y": Command{HID: 28}, + "}": Command{HID: 39, Mode: 64}, + }, + "it": KeyMap{ + " ": Command{HID: 44}, + "$": Command{HID: 33, Mode: 2}, + "(": Command{HID: 37, Mode: 2}, + ",": Command{HID: 54}, + "0": Command{HID: 39}, + "4": Command{HID: 33}, + "8": Command{HID: 37}, + "<": Command{HID: 100}, + "@": Command{HID: 51, Mode: 64}, + "D": Command{HID: 7, Mode: 2}, + "H": Command{HID: 11, Mode: 2}, + "L": Command{HID: 15, Mode: 2}, + "P": Command{HID: 19, Mode: 2}, + "T": Command{HID: 23, Mode: 2}, + "X": Command{HID: 27, Mode: 2}, + "\\": Command{HID: 53}, + "d": Command{HID: 7}, + "h": Command{HID: 11}, + "l": Command{HID: 15}, + "p": Command{HID: 19}, + "t": Command{HID: 23}, + "x": Command{HID: 27}, + "|": Command{HID: 53, Mode: 2}, + "#": Command{HID: 52, Mode: 64}, + "'": Command{HID: 45}, + "+": Command{HID: 48}, + "/": Command{HID: 36, Mode: 2}, + "3": Command{HID: 32}, + "7": Command{HID: 36}, + ";": Command{HID: 54, Mode: 2}, + "?": Command{HID: 45, Mode: 2}, + "C": Command{HID: 6, Mode: 2}, + "G": Command{HID: 10, Mode: 2}, + "K": Command{HID: 14, Mode: 2}, + "O": Command{HID: 18, Mode: 2}, + "S": Command{HID: 22, Mode: 2}, + "è": Command{HID: 47}, + "W": Command{HID: 26, Mode: 2}, + "[": Command{HID: 47, Mode: 64}, + "_": Command{HID: 56, Mode: 2}, + "c": Command{HID: 6}, + "g": Command{HID: 10}, + "k": Command{HID: 14}, + "ì": Command{HID: 46}, + "o": Command{HID: 18}, + "s": Command{HID: 22}, + "w": Command{HID: 26}, + "{": Command{HID: 47, Mode: 66}, + "à": Command{HID: 52}, + "é": Command{HID: 47, Mode: 2}, + "\"": Command{HID: 31, Mode: 2}, + "&": Command{HID: 35, Mode: 2}, + "*": Command{HID: 48, Mode: 2}, + ".": Command{HID: 55}, + "ù": Command{HID: 49}, + "2": Command{HID: 31}, + "6": Command{HID: 35}, + "ò": Command{HID: 51}, + ":": Command{HID: 55, Mode: 2}, + ">": Command{HID: 100, Mode: 2}, + "B": Command{HID: 5, Mode: 2}, + "F": Command{HID: 9, Mode: 2}, + "J": Command{HID: 13, Mode: 2}, + "N": Command{HID: 17, Mode: 2}, + "R": Command{HID: 21, Mode: 2}, + "V": Command{HID: 25, Mode: 2}, + "Z": Command{HID: 29, Mode: 2}, + "^": Command{HID: 46, Mode: 2}, + "b": Command{HID: 5}, + "f": Command{HID: 9}, + "j": Command{HID: 13}, + "n": Command{HID: 17}, + "r": Command{HID: 21}, + "v": Command{HID: 25}, + "z": Command{HID: 29}, + "!": Command{HID: 30, Mode: 2}, + "%": Command{HID: 34, Mode: 2}, + ")": Command{HID: 38, Mode: 2}, + "-": Command{HID: 56}, + "1": Command{HID: 30}, + "5": Command{HID: 34}, + "9": Command{HID: 38}, + "=": Command{HID: 39, Mode: 2}, + "A": Command{HID: 4, Mode: 2}, + "E": Command{HID: 8, Mode: 2}, + "I": Command{HID: 12, Mode: 2}, + "M": Command{HID: 16, Mode: 2}, + "Q": Command{HID: 20, Mode: 2}, + "U": Command{HID: 24, Mode: 2}, + "Y": Command{HID: 28, Mode: 2}, + "]": Command{HID: 48, Mode: 64}, + "a": Command{HID: 4}, + "e": Command{HID: 8}, + "i": Command{HID: 12}, + "m": Command{HID: 16}, + "q": Command{HID: 20}, + "u": Command{HID: 24}, + "y": Command{HID: 28}, + "}": Command{HID: 48, Mode: 66}, + }, + "us": KeyMap{ + " ": Command{HID: 44}, + "$": Command{HID: 33, Mode: 2}, + "(": Command{HID: 38, Mode: 2}, + ",": Command{HID: 54}, + "0": Command{HID: 39}, + "4": Command{HID: 33}, + "8": Command{HID: 37}, + "<": Command{HID: 54, Mode: 2}, + "@": Command{HID: 31, Mode: 2}, + "D": Command{HID: 7, Mode: 2}, + "H": Command{HID: 11, Mode: 2}, + "L": Command{HID: 15, Mode: 2}, + "P": Command{HID: 19, Mode: 2}, + "T": Command{HID: 23, Mode: 2}, + "X": Command{HID: 27, Mode: 2}, + "\\": Command{HID: 49}, + "`": Command{HID: 53}, + "d": Command{HID: 7}, + "h": Command{HID: 11}, + "l": Command{HID: 15}, + "p": Command{HID: 19}, + "t": Command{HID: 23}, + "x": Command{HID: 27}, + "|": Command{HID: 49, Mode: 2}, + "BACKSPACE": Command{HID: 42}, + "#": Command{HID: 32, Mode: 2}, + "'": Command{HID: 52}, + "+": Command{HID: 46, Mode: 2}, + "/": Command{HID: 56}, + "3": Command{HID: 32}, + "7": Command{HID: 36}, + ";": Command{HID: 51}, + "?": Command{HID: 56, Mode: 2}, + "C": Command{HID: 6, Mode: 2}, + "G": Command{HID: 10, Mode: 2}, + "K": Command{HID: 14, Mode: 2}, + "O": Command{HID: 18, Mode: 2}, + "S": Command{HID: 22, Mode: 2}, + "W": Command{HID: 26, Mode: 2}, + "[": Command{HID: 47}, + "_": Command{HID: 45, Mode: 2}, + "c": Command{HID: 6}, + "g": Command{HID: 10}, + "k": Command{HID: 14}, + "o": Command{HID: 18}, + "s": Command{HID: 22}, + "w": Command{HID: 26}, + "{": Command{HID: 47, Mode: 2}, + "\"": Command{HID: 52, Mode: 2}, + "&": Command{HID: 36, Mode: 2}, + "*": Command{HID: 37, Mode: 2}, + ".": Command{HID: 55}, + "2": Command{HID: 31}, + "6": Command{HID: 35}, + ":": Command{HID: 51, Mode: 2}, + ">": Command{HID: 55, Mode: 2}, + "B": Command{HID: 5, Mode: 2}, + "F": Command{HID: 9, Mode: 2}, + "J": Command{HID: 13, Mode: 2}, + "N": Command{HID: 17, Mode: 2}, + "R": Command{HID: 21, Mode: 2}, + "V": Command{HID: 25, Mode: 2}, + "Z": Command{HID: 29, Mode: 2}, + "^": Command{HID: 35, Mode: 2}, + "b": Command{HID: 5}, + "f": Command{HID: 9}, + "j": Command{HID: 13}, + "n": Command{HID: 17}, + "r": Command{HID: 21}, + "v": Command{HID: 25}, + "z": Command{HID: 29}, + "~": Command{HID: 53, Mode: 2}, + "!": Command{HID: 30, Mode: 2}, + "%": Command{HID: 34, Mode: 2}, + ")": Command{HID: 39, Mode: 2}, + "-": Command{HID: 45}, + "1": Command{HID: 30}, + "5": Command{HID: 34}, + "9": Command{HID: 38}, + "=": Command{HID: 46}, + "A": Command{HID: 4, Mode: 2}, + "E": Command{HID: 8, Mode: 2}, + "I": Command{HID: 12, Mode: 2}, + "M": Command{HID: 16, Mode: 2}, + "Q": Command{HID: 20, Mode: 2}, + "U": Command{HID: 24, Mode: 2}, + "Y": Command{HID: 28, Mode: 2}, + "]": Command{HID: 48}, + "a": Command{HID: 4}, + "e": Command{HID: 8}, + "i": Command{HID: 12}, + "m": Command{HID: 16}, + "q": Command{HID: 20}, + "u": Command{HID: 24}, + "y": Command{HID: 28}, + "}": Command{HID: 48, Mode: 2}, + }, + "sv": KeyMap{ + "ð": Command{HID: 7, Mode: 64}, + " ": Command{HID: 44}, + "$": Command{HID: 33, Mode: 64}, + "(": Command{HID: 37, Mode: 2}, + ",": Command{HID: 54}, + "0": Command{HID: 39}, + "4": Command{HID: 33}, + "8": Command{HID: 37}, + "<": Command{HID: 100}, + "@": Command{HID: 31, Mode: 64}, + "€": Command{HID: 8, Mode: 64}, + "D": Command{HID: 7, Mode: 2}, + "H": Command{HID: 11, Mode: 2}, + "L": Command{HID: 15, Mode: 2}, + "P": Command{HID: 19, Mode: 2}, + "§": Command{HID: 53}, + "T": Command{HID: 23, Mode: 2}, + "X": Command{HID: 27, Mode: 2}, + "\\": Command{HID: 45, Mode: 64}, + "`": Command{HID: 46, Mode: 2}, + "d": Command{HID: 7}, + "h": Command{HID: 11}, + "£": Command{HID: 32, Mode: 64}, + "l": Command{HID: 15}, + "p": Command{HID: 19}, + "t": Command{HID: 23}, + "x": Command{HID: 27}, + "|": Command{HID: 100, Mode: 64}, + "BACKSPACE": Command{HID: 42}, + "«": Command{HID: 33}, + "#": Command{HID: 32, Mode: 2}, + "'": Command{HID: 49}, + "+": Command{HID: 45}, + "/": Command{HID: 36, Mode: 2}, + "3": Command{HID: 32}, + "7": Command{HID: 36}, + ";": Command{HID: 54, Mode: 2}, + "?": Command{HID: 45, Mode: 2}, + "C": Command{HID: 6, Mode: 2}, + "G": Command{HID: 10, Mode: 2}, + "K": Command{HID: 14, Mode: 2}, + "O": Command{HID: 18, Mode: 2}, + "S": Command{HID: 22, Mode: 2}, + "W": Command{HID: 26, Mode: 2}, + "[": Command{HID: 37, Mode: 64}, + "_": Command{HID: 56, Mode: 2}, + "c": Command{HID: 6}, + "g": Command{HID: 10}, + "k": Command{HID: 14}, + "o": Command{HID: 18}, + "s": Command{HID: 22}, + "w": Command{HID: 26}, + "{": Command{HID: 36, Mode: 64}, + "Å": Command{HID: 47, Mode: 2}, + "Ä": Command{HID: 52, Mode: 2}, + "ß": Command{HID: 22, Mode: 64}, + "ä": Command{HID: 52}, + "Ö": Command{HID: 51, Mode: 2}, + "\"": Command{HID: 31, Mode: 2}, + "&": Command{HID: 35, Mode: 2}, + "*": Command{HID: 49, Mode: 2}, + "å": Command{HID: 47}, + ".": Command{HID: 55}, + "2": Command{HID: 31}, + "þ": Command{HID: 23, Mode: 64}, + "6": Command{HID: 35}, + ":": Command{HID: 55, Mode: 2}, + "ö": Command{HID: 51}, + ">": Command{HID: 100, Mode: 2}, + "B": Command{HID: 5, Mode: 2}, + "F": Command{HID: 9, Mode: 2}, + "J": Command{HID: 13, Mode: 2}, + "N": Command{HID: 17, Mode: 2}, + "R": Command{HID: 21, Mode: 2}, + "V": Command{HID: 25, Mode: 2}, + "Z": Command{HID: 29, Mode: 2}, + "^": Command{HID: 48, Mode: 2}, + "¤": Command{HID: 33, Mode: 2}, + "b": Command{HID: 5}, + "f": Command{HID: 9}, + "j": Command{HID: 13}, + "n": Command{HID: 17}, + "µ": Command{HID: 16, Mode: 64}, + "r": Command{HID: 21}, + "v": Command{HID: 25}, + "½": Command{HID: 53, Mode: 2}, + "z": Command{HID: 29}, + "!": Command{HID: 30, Mode: 2}, + "%": Command{HID: 34, Mode: 2}, + ")": Command{HID: 38, Mode: 2}, + "-": Command{HID: 56}, + "1": Command{HID: 30}, + "5": Command{HID: 34}, + "9": Command{HID: 38}, + "=": Command{HID: 39, Mode: 2}, + "A": Command{HID: 4, Mode: 2}, + "E": Command{HID: 8, Mode: 2}, + "I": Command{HID: 12, Mode: 2}, + "M": Command{HID: 16, Mode: 2}, + "Q": Command{HID: 20, Mode: 2}, + "U": Command{HID: 24, Mode: 2}, + "Y": Command{HID: 28, Mode: 2}, + "]": Command{HID: 38, Mode: 64}, + "a": Command{HID: 4}, + "e": Command{HID: 8}, + "i": Command{HID: 12}, + "m": Command{HID: 16}, + "q": Command{HID: 20}, + "u": Command{HID: 24}, + "y": Command{HID: 28}, + "}": Command{HID: 39, Mode: 64}, + }, + "si": KeyMap{ + "-": Command{HID: 56}, + " ": Command{HID: 44}, + "$": Command{HID: 33, Mode: 2}, + "(": Command{HID: 37, Mode: 2}, + ",": Command{HID: 54}, + "0": Command{HID: 39}, + "4": Command{HID: 33}, + "8": Command{HID: 37}, + "<": Command{HID: 100}, + "@": Command{HID: 25, Mode: 64}, + "€": Command{HID: 8, Mode: 64}, + "D": Command{HID: 7, Mode: 2}, + "H": Command{HID: 11, Mode: 2}, + "L": Command{HID: 15, Mode: 2}, + "P": Command{HID: 19, Mode: 2}, + "§": Command{HID: 16, Mode: 64}, + "T": Command{HID: 23, Mode: 2}, + "X": Command{HID: 27, Mode: 2}, + "\\": Command{HID: 20, Mode: 64}, + "`": Command{HID: 36, Mode: 64}, + "d": Command{HID: 7}, + "h": Command{HID: 11}, + "l": Command{HID: 15}, + "p": Command{HID: 19}, + "t": Command{HID: 23}, + "x": Command{HID: 27}, + "|": Command{HID: 26, Mode: 64}, + "#": Command{HID: 32, Mode: 2}, + "'": Command{HID: 45}, + "+": Command{HID: 46}, + "/": Command{HID: 36, Mode: 2}, + "I": Command{HID: 12, Mode: 2}, + "3": Command{HID: 32}, + "7": Command{HID: 36}, + ";": Command{HID: 54, Mode: 2}, + "?": Command{HID: 45, Mode: 2}, + "C": Command{HID: 6, Mode: 2}, + "G": Command{HID: 10, Mode: 2}, + "K": Command{HID: 14, Mode: 2}, + "O": Command{HID: 18, Mode: 2}, + "S": Command{HID: 22, Mode: 2}, + "W": Command{HID: 26, Mode: 2}, + "[": Command{HID: 9, Mode: 64}, + "_": Command{HID: 56, Mode: 2}, + "c": Command{HID: 6}, + "g": Command{HID: 10}, + "k": Command{HID: 14}, + "o": Command{HID: 18}, + "s": Command{HID: 22}, + "w": Command{HID: 26}, + "{": Command{HID: 5, Mode: 64}, + "ß": Command{HID: 52, Mode: 64}, + "×": Command{HID: 48, Mode: 64}, + "\"": Command{HID: 31, Mode: 2}, + "ˇ": Command{HID: 31, Mode: 64}, + "&": Command{HID: 35, Mode: 2}, + "*": Command{HID: 46, Mode: 2}, + ".": Command{HID: 55}, + "2": Command{HID: 31}, + "6": Command{HID: 35}, + "˛": Command{HID: 35, Mode: 64}, + "˙": Command{HID: 37, Mode: 64}, + ":": Command{HID: 55, Mode: 2}, + "÷": Command{HID: 47, Mode: 64}, + "˝": Command{HID: 39, Mode: 64}, + ">": Command{HID: 100, Mode: 2}, + "B": Command{HID: 5, Mode: 2}, + "F": Command{HID: 9, Mode: 2}, + "J": Command{HID: 13, Mode: 2}, + "N": Command{HID: 17, Mode: 2}, + "R": Command{HID: 21, Mode: 2}, + "V": Command{HID: 25, Mode: 2}, + "Z": Command{HID: 28, Mode: 2}, + "^": Command{HID: 32, Mode: 64}, + "¤": Command{HID: 49, Mode: 64}, + "b": Command{HID: 5}, + "f": Command{HID: 9}, + "j": Command{HID: 13}, + "¨": Command{HID: 45, Mode: 64}, + "n": Command{HID: 17}, + "´": Command{HID: 38, Mode: 64}, + "r": Command{HID: 21}, + "°": Command{HID: 34, Mode: 64}, + "v": Command{HID: 25}, + "z": Command{HID: 28}, + "¸": Command{HID: 46, Mode: 64}, + "~": Command{HID: 30, Mode: 64}, + "Ł": Command{HID: 15, Mode: 64}, + "ł": Command{HID: 14, Mode: 64}, + "!": Command{HID: 30, Mode: 2}, + "%": Command{HID: 34, Mode: 2}, + ")": Command{HID: 38, Mode: 2}, + "š": Command{HID: 47}, + "Š": Command{HID: 47, Mode: 2}, + "Ž": Command{HID: 49, Mode: 2}, + "ž": Command{HID: 49}, + "5": Command{HID: 34}, + "9": Command{HID: 38}, + "˘": Command{HID: 33, Mode: 64}, + "=": Command{HID: 39, Mode: 2}, + "A": Command{HID: 4, Mode: 2}, + "Č": Command{HID: 51, Mode: 2}, + "č": Command{HID: 51}, + "E": Command{HID: 8, Mode: 2}, + "Ć": Command{HID: 52, Mode: 2}, + "ć": Command{HID: 52}, + "M": Command{HID: 16, Mode: 2}, + "Q": Command{HID: 20, Mode: 2}, + "U": Command{HID: 24, Mode: 2}, + "Y": Command{HID: 29, Mode: 2}, + "]": Command{HID: 10, Mode: 64}, + "Đ": Command{HID: 48, Mode: 2}, + "đ": Command{HID: 48}, + "a": Command{HID: 4}, + "e": Command{HID: 8}, + "i": Command{HID: 12}, + "m": Command{HID: 16}, + "q": Command{HID: 20}, + "1": Command{HID: 30}, + "u": Command{HID: 24}, + "y": Command{HID: 29}, + "}": Command{HID: 17, Mode: 64}, + }, + "gb": KeyMap{ + " ": Command{HID: 44}, + "$": Command{HID: 33, Mode: 2}, + "(": Command{HID: 38, Mode: 2}, + ",": Command{HID: 54}, + "0": Command{HID: 39}, + "4": Command{HID: 33}, + "8": Command{HID: 37}, + "<": Command{HID: 54, Mode: 2}, + "@": Command{HID: 52, Mode: 2}, + "€": Command{HID: 33, Mode: 64}, + "D": Command{HID: 7, Mode: 2}, + "H": Command{HID: 11, Mode: 2}, + "L": Command{HID: 15, Mode: 2}, + "P": Command{HID: 19, Mode: 2}, + "T": Command{HID: 23, Mode: 2}, + "X": Command{HID: 27, Mode: 2}, + "\\": Command{HID: 100}, + "`": Command{HID: 53}, + "d": Command{HID: 7}, + "h": Command{HID: 11}, + "£": Command{HID: 32, Mode: 2}, + "l": Command{HID: 15}, + "p": Command{HID: 19}, + "t": Command{HID: 23}, + "x": Command{HID: 27}, + "|": Command{HID: 100, Mode: 2}, + "BACKSPACE": Command{HID: 42}, + "#": Command{HID: 50}, + "'": Command{HID: 52}, + "+": Command{HID: 46, Mode: 2}, + "/": Command{HID: 56}, + "3": Command{HID: 32}, + "7": Command{HID: 36}, + ";": Command{HID: 51}, + "?": Command{HID: 56, Mode: 2}, + "C": Command{HID: 6, Mode: 2}, + "G": Command{HID: 10, Mode: 2}, + "K": Command{HID: 14, Mode: 2}, + "O": Command{HID: 18, Mode: 2}, + "S": Command{HID: 22, Mode: 2}, + "W": Command{HID: 26, Mode: 2}, + "[": Command{HID: 47}, + "_": Command{HID: 45, Mode: 2}, + "c": Command{HID: 6}, + "g": Command{HID: 10}, + "k": Command{HID: 14}, + "o": Command{HID: 18}, + "s": Command{HID: 22}, + "w": Command{HID: 26}, + "{": Command{HID: 47, Mode: 2}, + "é": Command{HID: 8, Mode: 64}, + "\"": Command{HID: 31, Mode: 2}, + "í": Command{HID: 12, Mode: 64}, + "&": Command{HID: 36, Mode: 2}, + "*": Command{HID: 37, Mode: 2}, + ".": Command{HID: 55}, + "ú": Command{HID: 24, Mode: 64}, + "2": Command{HID: 31}, + "6": Command{HID: 35}, + "ó": Command{HID: 18, Mode: 64}, + ":": Command{HID: 51, Mode: 2}, + ">": Command{HID: 55, Mode: 2}, + "B": Command{HID: 5, Mode: 2}, + "F": Command{HID: 9, Mode: 2}, + "J": Command{HID: 13, Mode: 2}, + "N": Command{HID: 17, Mode: 2}, + "R": Command{HID: 21, Mode: 2}, + "V": Command{HID: 25, Mode: 2}, + "Z": Command{HID: 29, Mode: 2}, + "^": Command{HID: 35, Mode: 2}, + "¦": Command{HID: 53, Mode: 64}, + "b": Command{HID: 5}, + "f": Command{HID: 9}, + "¬": Command{HID: 53, Mode: 2}, + "j": Command{HID: 13}, + "n": Command{HID: 17}, + "r": Command{HID: 21}, + "v": Command{HID: 25}, + "z": Command{HID: 29}, + "~": Command{HID: 50, Mode: 2}, + "!": Command{HID: 30, Mode: 2}, + "%": Command{HID: 34, Mode: 2}, + ")": Command{HID: 39, Mode: 2}, + "-": Command{HID: 45}, + "1": Command{HID: 30}, + "5": Command{HID: 34}, + "9": Command{HID: 38}, + "=": Command{HID: 46}, + "A": Command{HID: 4, Mode: 2}, + "E": Command{HID: 8, Mode: 2}, + "I": Command{HID: 12, Mode: 2}, + "M": Command{HID: 16, Mode: 2}, + "Q": Command{HID: 20, Mode: 2}, + "U": Command{HID: 24, Mode: 2}, + "Y": Command{HID: 28, Mode: 2}, + "]": Command{HID: 48}, + "a": Command{HID: 4}, + "e": Command{HID: 8}, + "i": Command{HID: 12}, + "m": Command{HID: 16}, + "q": Command{HID: 20}, + "u": Command{HID: 24}, + "y": Command{HID: 28}, + "}": Command{HID: 48, Mode: 2}, + }, + "br": KeyMap{ + " ": Command{HID: 44}, + "$": Command{HID: 33, Mode: 2}, + "(": Command{HID: 38, Mode: 2}, + ",": Command{HID: 54}, + "0": Command{HID: 39}, + "4": Command{HID: 33}, + "8": Command{HID: 37}, + "<": Command{HID: 54, Mode: 2}, + "@": Command{HID: 31, Mode: 2}, + "D": Command{HID: 7, Mode: 2}, + "H": Command{HID: 11, Mode: 2}, + "L": Command{HID: 15, Mode: 2}, + "P": Command{HID: 19, Mode: 2}, + "b": Command{HID: 5}, + "T": Command{HID: 23, Mode: 2}, + "X": Command{HID: 27, Mode: 2}, + "\\": Command{HID: 100}, + "`": Command{HID: 47, Mode: 2}, + "d": Command{HID: 7}, + "h": Command{HID: 11}, + "l": Command{HID: 15}, + "p": Command{HID: 19}, + "t": Command{HID: 23}, + "x": Command{HID: 27}, + "|": Command{HID: 100, Mode: 2}, + "#": Command{HID: 32, Mode: 2}, + "'": Command{HID: 53}, + "+": Command{HID: 46, Mode: 2}, + "/": Command{HID: 20, Mode: 64}, + "3": Command{HID: 32}, + "7": Command{HID: 36}, + ";": Command{HID: 56}, + "?": Command{HID: 26, Mode: 64}, + "C": Command{HID: 6, Mode: 2}, + "G": Command{HID: 10, Mode: 2}, + "K": Command{HID: 14, Mode: 2}, + "O": Command{HID: 18, Mode: 2}, + "S": Command{HID: 22, Mode: 2}, + "W": Command{HID: 26, Mode: 2}, + "[": Command{HID: 48}, + "_": Command{HID: 45, Mode: 2}, + "c": Command{HID: 6}, + "g": Command{HID: 10}, + "k": Command{HID: 14}, + "o": Command{HID: 18}, + "s": Command{HID: 22}, + "w": Command{HID: 26}, + "{": Command{HID: 48, Mode: 2}, + "Ç": Command{HID: 51, Mode: 2}, + "\"": Command{HID: 53, Mode: 2}, + "&": Command{HID: 36, Mode: 2}, + "*": Command{HID: 37, Mode: 2}, + "ç": Command{HID: 51}, + ".": Command{HID: 55}, + "2": Command{HID: 31}, + "6": Command{HID: 35}, + ":": Command{HID: 56, Mode: 2}, + ">": Command{HID: 55, Mode: 2}, + "B": Command{HID: 5, Mode: 2}, + "F": Command{HID: 9, Mode: 2}, + "J": Command{HID: 13, Mode: 2}, + "N": Command{HID: 17, Mode: 2}, + "R": Command{HID: 21, Mode: 2}, + "V": Command{HID: 25, Mode: 2}, + "Z": Command{HID: 29, Mode: 2}, + "^": Command{HID: 52, Mode: 2}, + "§": Command{HID: 46, Mode: 64}, + "f": Command{HID: 9}, + "j": Command{HID: 13}, + "n": Command{HID: 17}, + "´": Command{HID: 47}, + "r": Command{HID: 21}, + "°": Command{HID: 8, Mode: 64}, + "v": Command{HID: 25}, + "z": Command{HID: 29}, + "~": Command{HID: 52}, + "!": Command{HID: 30, Mode: 2}, + "%": Command{HID: 34, Mode: 2}, + ")": Command{HID: 39, Mode: 2}, + "-": Command{HID: 45}, + "1": Command{HID: 30}, + "5": Command{HID: 34}, + "9": Command{HID: 38}, + "=": Command{HID: 46}, + "A": Command{HID: 4, Mode: 2}, + "E": Command{HID: 8, Mode: 2}, + "I": Command{HID: 12, Mode: 2}, + "M": Command{HID: 16, Mode: 2}, + "Q": Command{HID: 20, Mode: 2}, + "U": Command{HID: 24, Mode: 2}, + "Y": Command{HID: 28, Mode: 2}, + "]": Command{HID: 49}, + "a": Command{HID: 4}, + "e": Command{HID: 8}, + "i": Command{HID: 12}, + "m": Command{HID: 16}, + "q": Command{HID: 20}, + "u": Command{HID: 24}, + "y": Command{HID: 28}, + "}": Command{HID: 49, Mode: 2}, + }, + "ru": KeyMap{ + " ": Command{HID: 44}, + "$": Command{HID: 33, Mode: 2}, + "(": Command{HID: 38, Mode: 2}, + ",": Command{HID: 54, Mode: 2}, + "0": Command{HID: 39}, + "4": Command{HID: 33}, + "8": Command{HID: 37}, + "3": Command{HID: 32}, + ";": Command{HID: 54}, + "?": Command{HID: 56}, + "ё": Command{HID: 53}, + "#": Command{HID: 32, Mode: 2}, + "'": Command{HID: 36, Mode: 2}, + "/": Command{HID: 56, Mode: 2}, + "с": Command{HID: 22}, + "р": Command{HID: 21}, + "у": Command{HID: 11}, + "т": Command{HID: 28}, + "х": Command{HID: 27}, + "7": Command{HID: 36}, + "ц": Command{HID: 6}, + "щ": Command{HID: 48}, + "ш": Command{HID: 26}, + "ы": Command{HID: 24}, + "ъ": Command{HID: 46, Mode: 2}, + "ь": Command{HID: 16}, + "я": Command{HID: 20}, + "ю": Command{HID: 47}, + "в": Command{HID: 25}, + "г": Command{HID: 10}, + "а": Command{HID: 9}, + "б": Command{HID: 5}, + "ж": Command{HID: 52}, + "з": Command{HID: 29}, + "д": Command{HID: 7}, + "е": Command{HID: 8}, + "к": Command{HID: 14}, + "л": Command{HID: 15}, + "и": Command{HID: 18}, + "й": Command{HID: 13}, + "о": Command{HID: 19}, + "м": Command{HID: 16}, + "н": Command{HID: 17}, + "Т": Command{HID: 28, Mode: 2}, + "У": Command{HID: 11, Mode: 2}, + "Р": Command{HID: 9, Mode: 2}, + "С": Command{HID: 22, Mode: 2}, + "Ц": Command{HID: 6, Mode: 2}, + "Х": Command{HID: 27, Mode: 2}, + "Ъ": Command{HID: 46}, + "Ы": Command{HID: 24, Mode: 2}, + "Ш": Command{HID: 26, Mode: 2}, + "Щ": Command{HID: 48, Mode: 2}, + "Ю": Command{HID: 47, Mode: 2}, + "Я": Command{HID: 20, Mode: 2}, + "Ь": Command{HID: 16, Mode: 2}, + "В": Command{HID: 25, Mode: 2}, + "Г": Command{HID: 10, Mode: 2}, + "А": Command{HID: 4, Mode: 2}, + "Б": Command{HID: 5, Mode: 2}, + "Ж": Command{HID: 52, Mode: 2}, + "З": Command{HID: 29, Mode: 2}, + "Д": Command{HID: 7, Mode: 2}, + "Е": Command{HID: 8, Mode: 2}, + "К": Command{HID: 14, Mode: 2}, + "Л": Command{HID: 15, Mode: 2}, + "И": Command{HID: 18, Mode: 2}, + "Й": Command{HID: 13, Mode: 2}, + "О": Command{HID: 19, Mode: 2}, + "М": Command{HID: 16, Mode: 2}, + "Н": Command{HID: 17, Mode: 2}, + "№": Command{HID: 49, Mode: 2}, + "\"": Command{HID: 31, Mode: 2}, + "&": Command{HID: 35, Mode: 2}, + "*": Command{HID: 37, Mode: 2}, + ".": Command{HID: 55, Mode: 2}, + "2": Command{HID: 31}, + "_": Command{HID: 45, Mode: 2}, + "6": Command{HID: 35}, + ":": Command{HID: 55}, + "~": Command{HID: 49}, + "!": Command{HID: 30, Mode: 2}, + "%": Command{HID: 34, Mode: 2}, + ")": Command{HID: 39, Mode: 2}, + "-": Command{HID: 45}, + "1": Command{HID: 30}, + "Ё": Command{HID: 53, Mode: 2}, + "5": Command{HID: 34}, + "9": Command{HID: 38}, + }, + "fi": KeyMap{ + " ": Command{HID: 44}, + "$": Command{HID: 33, Mode: 64}, + "(": Command{HID: 37, Mode: 2}, + ",": Command{HID: 54}, + "0": Command{HID: 39}, + "4": Command{HID: 33}, + "8": Command{HID: 37}, + "<": Command{HID: 100}, + "@": Command{HID: 31, Mode: 64}, + "€": Command{HID: 8, Mode: 64}, + "D": Command{HID: 7, Mode: 2}, + "H": Command{HID: 11, Mode: 2}, + "L": Command{HID: 15, Mode: 2}, + "P": Command{HID: 19, Mode: 2}, + "§": Command{HID: 53}, + "T": Command{HID: 23, Mode: 2}, + "X": Command{HID: 27, Mode: 2}, + "\\": Command{HID: 45, Mode: 64}, + "`": Command{HID: 46, Mode: 2}, + "d": Command{HID: 7}, + "h": Command{HID: 11}, + "l": Command{HID: 15}, + "p": Command{HID: 19}, + "t": Command{HID: 23}, + "x": Command{HID: 27}, + "|": Command{HID: 100, Mode: 64}, + "#": Command{HID: 32, Mode: 2}, + "'": Command{HID: 49}, + "+": Command{HID: 45}, + "/": Command{HID: 36, Mode: 2}, + "3": Command{HID: 32}, + "7": Command{HID: 36}, + ";": Command{HID: 54, Mode: 2}, + "?": Command{HID: 45, Mode: 2}, + "C": Command{HID: 6, Mode: 2}, + "G": Command{HID: 10, Mode: 2}, + "K": Command{HID: 14, Mode: 2}, + "O": Command{HID: 18, Mode: 2}, + "S": Command{HID: 22, Mode: 2}, + "W": Command{HID: 26, Mode: 2}, + "[": Command{HID: 37, Mode: 64}, + "_": Command{HID: 56, Mode: 2}, + "c": Command{HID: 6}, + "g": Command{HID: 10}, + "k": Command{HID: 14}, + "o": Command{HID: 18}, + "s": Command{HID: 22}, + "w": Command{HID: 26}, + "{": Command{HID: 36, Mode: 64}, + "Ä": Command{HID: 52, Mode: 2}, + ".": Command{HID: 55}, + "Ö": Command{HID: 51, Mode: 2}, + "\"": Command{HID: 31, Mode: 2}, + "&": Command{HID: 35, Mode: 2}, + "*": Command{HID: 49, Mode: 2}, + "ä": Command{HID: 52}, + "2": Command{HID: 31}, + "6": Command{HID: 35}, + ":": Command{HID: 55, Mode: 2}, + "ö": Command{HID: 51}, + ">": Command{HID: 100, Mode: 2}, + "B": Command{HID: 5, Mode: 2}, + "F": Command{HID: 9, Mode: 2}, + "J": Command{HID: 13, Mode: 2}, + "N": Command{HID: 17, Mode: 2}, + "R": Command{HID: 21, Mode: 2}, + "V": Command{HID: 25, Mode: 2}, + "Z": Command{HID: 29, Mode: 2}, + "^": Command{HID: 48, Mode: 2}, + "¤": Command{HID: 33, Mode: 2}, + "b": Command{HID: 5}, + "f": Command{HID: 9}, + "j": Command{HID: 13}, + "n": Command{HID: 17}, + "´": Command{HID: 46}, + "µ": Command{HID: 16, Mode: 64}, + "r": Command{HID: 21}, + "v": Command{HID: 25}, + "z": Command{HID: 29}, + "~": Command{HID: 48, Mode: 64}, + "!": Command{HID: 30, Mode: 2}, + "%": Command{HID: 34, Mode: 2}, + ")": Command{HID: 38, Mode: 2}, + "-": Command{HID: 56}, + "1": Command{HID: 30}, + "5": Command{HID: 34}, + "9": Command{HID: 38}, + "=": Command{HID: 39, Mode: 2}, + "A": Command{HID: 4, Mode: 2}, + "E": Command{HID: 8, Mode: 2}, + "I": Command{HID: 12, Mode: 2}, + "M": Command{HID: 16, Mode: 2}, + "Q": Command{HID: 20, Mode: 2}, + "U": Command{HID: 24, Mode: 2}, + "Y": Command{HID: 28, Mode: 2}, + "]": Command{HID: 38, Mode: 64}, + "a": Command{HID: 4}, + "e": Command{HID: 8}, + "i": Command{HID: 12}, + "m": Command{HID: 16}, + "q": Command{HID: 20}, + "u": Command{HID: 24}, + "y": Command{HID: 28}, + "}": Command{HID: 39, Mode: 64}, + }, + "es": KeyMap{ + " ": Command{HID: 44}, + "$": Command{HID: 33, Mode: 2}, + "(": Command{HID: 37, Mode: 2}, + ",": Command{HID: 54}, + "0": Command{HID: 39}, + "4": Command{HID: 33}, + "8": Command{HID: 37}, + "<": Command{HID: 100}, + "@": Command{HID: 31, Mode: 64}, + "D": Command{HID: 7, Mode: 2}, + "H": Command{HID: 11, Mode: 2}, + "L": Command{HID: 15, Mode: 2}, + "P": Command{HID: 19, Mode: 2}, + "T": Command{HID: 23, Mode: 2}, + "X": Command{HID: 27, Mode: 2}, + "\\": Command{HID: 53, Mode: 64}, + "d": Command{HID: 7}, + "h": Command{HID: 11}, + "l": Command{HID: 15}, + "p": Command{HID: 19}, + "t": Command{HID: 23}, + "x": Command{HID: 27}, + "|": Command{HID: 30, Mode: 64}, + "#": Command{HID: 32, Mode: 64}, + "'": Command{HID: 45}, + "+": Command{HID: 48}, + "/": Command{HID: 36, Mode: 2}, + "3": Command{HID: 32}, + "7": Command{HID: 36}, + ";": Command{HID: 54, Mode: 2}, + "?": Command{HID: 45, Mode: 2}, + "C": Command{HID: 6, Mode: 2}, + "G": Command{HID: 10, Mode: 2}, + "K": Command{HID: 14, Mode: 2}, + "O": Command{HID: 18, Mode: 2}, + "S": Command{HID: 22, Mode: 2}, + "è": Command{HID: 47}, + "W": Command{HID: 26, Mode: 2}, + "[": Command{HID: 47, Mode: 64}, + "_": Command{HID: 56, Mode: 2}, + "c": Command{HID: 6}, + "g": Command{HID: 10}, + "k": Command{HID: 14}, + "ì": Command{HID: 46}, + "o": Command{HID: 18}, + "s": Command{HID: 22}, + "w": Command{HID: 26}, + "{": Command{HID: 47, Mode: 66}, + "à": Command{HID: 52}, + "é": Command{HID: 47, Mode: 2}, + "\"": Command{HID: 31, Mode: 2}, + "&": Command{HID: 35, Mode: 2}, + "*": Command{HID: 48, Mode: 2}, + ".": Command{HID: 55}, + "ù": Command{HID: 49}, + "2": Command{HID: 31}, + "6": Command{HID: 35}, + "ò": Command{HID: 51}, + ":": Command{HID: 55, Mode: 2}, + ">": Command{HID: 100, Mode: 2}, + "B": Command{HID: 5, Mode: 2}, + "F": Command{HID: 9, Mode: 2}, + "J": Command{HID: 13, Mode: 2}, + "N": Command{HID: 17, Mode: 2}, + "R": Command{HID: 21, Mode: 2}, + "V": Command{HID: 25, Mode: 2}, + "Z": Command{HID: 29, Mode: 2}, + "^": Command{HID: 46, Mode: 2}, + "b": Command{HID: 5}, + "f": Command{HID: 9}, + "j": Command{HID: 13}, + "n": Command{HID: 17}, + "r": Command{HID: 21}, + "v": Command{HID: 25}, + "z": Command{HID: 29}, + "º": Command{HID: 53}, + "~": Command{HID: 33, Mode: 64}, + "!": Command{HID: 30, Mode: 2}, + "%": Command{HID: 34, Mode: 2}, + ")": Command{HID: 38, Mode: 2}, + "-": Command{HID: 56}, + "1": Command{HID: 30}, + "5": Command{HID: 34}, + "9": Command{HID: 38}, + "=": Command{HID: 39, Mode: 2}, + "A": Command{HID: 4, Mode: 2}, + "E": Command{HID: 8, Mode: 2}, + "I": Command{HID: 12, Mode: 2}, + "M": Command{HID: 16, Mode: 2}, + "Q": Command{HID: 20, Mode: 2}, + "U": Command{HID: 24, Mode: 2}, + "Y": Command{HID: 28, Mode: 2}, + "]": Command{HID: 48, Mode: 64}, + "a": Command{HID: 4}, + "e": Command{HID: 8}, + "i": Command{HID: 12}, + "m": Command{HID: 16}, + "q": Command{HID: 20}, + "u": Command{HID: 24}, + "y": Command{HID: 28}, + "}": Command{HID: 48, Mode: 66}, + }, +} + +func KeyMapFor(lang string) KeyMap { + if m, found := KeyMaps[lang]; found { + mm := KeyMap{} + for k, cmd := range BaseMap { + mm[k] = cmd + } + for k, cmd := range m { + mm[k] = cmd + } + return mm + } + return nil +} diff --git a/modules/hid_recon/hid_logitech.go b/modules/hid_recon/hid_logitech.go new file mode 100644 index 00000000..441e6573 --- /dev/null +++ b/modules/hid_recon/hid_logitech.go @@ -0,0 +1,8 @@ +package hid_recon + +type LogitechBuilder struct { +} + +func (b LogitechBuilder) BuildFrames(commands []Command) { + +} diff --git a/modules/hid_recon/hid_recon.go b/modules/hid_recon/hid_recon.go index a2e06da8..c50dea39 100644 --- a/modules/hid_recon/hid_recon.go +++ b/modules/hid_recon/hid_recon.go @@ -1,6 +1,7 @@ package hid_recon import ( + "fmt" "sync" "time" @@ -30,6 +31,7 @@ type HIDRecon struct { pingPayload []byte inSniffMode bool inPromMode bool + keyMap string selector *utils.ViewSelector } @@ -50,6 +52,7 @@ func NewHIDRecon(s *session.Session) *HIDRecon { inSniffMode: false, inPromMode: false, pingPayload: []byte{0x0f, 0x0f, 0x0f, 0x0f}, + keyMap: "us", } mod.AddHandler(session.NewModuleHandler("hid.recon on", "", @@ -137,6 +140,12 @@ func (mod *HIDRecon) setSniffMode(mode string) error { return nil } +func (mod *HIDRecon) isSniffing() bool { + mod.sniffLock.Lock() + defer mod.sniffLock.Unlock() + return mod.sniffAddrRaw != nil +} + func (mod *HIDRecon) doHopping() { if mod.inPromMode == false { if err := mod.dongle.EnterPromiscMode(); err != nil { @@ -185,6 +194,100 @@ func (mod *HIDRecon) doPing() { } } } + + dev, found := mod.Session.HID.Get(mod.sniffAddr) + if found == false { + mod.Warning("could not find HID device %s", mod.sniffAddr) + return + } + + builder, found := FrameBuilders[dev.Type] + if found == false { + mod.Warning("HID frame injection is not supported for device type %s", dev.Type.String()) + return + } + + str := "hello world" + cmds := make([]Command, 0) + keyMap := KeyMapFor(mod.keyMap) + if keyMap == nil { + mod.Warning("could not find keymap for '%s' layout", mod.keyMap) + return + } + + for _, c := range str { + ch := fmt.Sprintf("%c", c) + if m, found := keyMap[ch]; found { + cmds = append(cmds, Command{ + Char: ch, + HID: m.HID, + Mode: m.Mode, + }) + } else { + mod.Warning("could not find HID command for '%c'", ch) + return + } + } + + builder.BuildFrames(cmds) + + mod.Info("injecting %d HID commands ...", len(cmds)) + + numFrames := 0 + szFrames := 0 + + for i, cmd := range cmds { + for j, frame := range cmd.Frames { + numFrames++ + if err := mod.dongle.TransmitPayload(frame, 250, 1); err != nil { + mod.Error("error sending frame #%d of HID command #%d: %v", j, i, err) + return + } else if cmd.Sleep > 0 { + szFrames += len(frame) + mod.Debug("sleeping %dms after frame #%d of command #%d ...", cmd.Sleep, j, i) + time.Sleep(time.Duration(cmd.Sleep) * time.Millisecond) + } + } + } + + mod.Info("send %d frames for %d bytes total", numFrames, szFrames) +} + +func (mod *HIDRecon) onSniffedBuffer(buf []byte) { + if sz := len(buf); sz > 0 && buf[0] == 0x00 { + buf = buf[1:] + mod.Debug("sniffed payload %x for %s", buf, mod.sniffAddr) + if dev, found := mod.Session.HID.Get(mod.sniffAddr); found { + dev.LastSeen = time.Now() + dev.AddPayload(buf) + dev.AddChannel(mod.channel) + } else { + mod.Warning("got a payload for unknown device %s", mod.sniffAddr) + } + } +} + +func (mod *HIDRecon) onDeviceDetected(buf []byte) { + if sz := len(buf); sz >= 5 { + addr, payload := buf[0:5], buf[5:] + mod.Debug("detected device %x on channel %d (payload:%x)\n", addr, mod.channel, payload) + if isNew, dev := mod.Session.HID.AddIfNew(addr, mod.channel, payload); isNew { + // sniff for a while in order to detect the device type + go func() { + defer func() { + mod.sniffLock.Unlock() + mod.setSniffMode("clear") + }() + + mod.setSniffMode(dev.Address) + // make sure nobody can sniff to another + // address until we're not done here... + mod.sniffLock.Lock() + + time.Sleep(mod.sniffPeriod) + }() + } + } } func (mod *HIDRecon) Start() error { @@ -198,11 +301,10 @@ func (mod *HIDRecon) Start() error { mod.Info("hopping on %d channels every %s", nrf24.TopChannel, mod.hopPeriod) for mod.Running() { - isSniffing := mod.sniffAddrRaw != nil - if !isSniffing { - mod.doHopping() - } else { + if mod.isSniffing() { mod.doPing() + } else { + mod.doHopping() } buf, err := mod.dongle.ReceivePayload() @@ -211,41 +313,10 @@ func (mod *HIDRecon) Start() error { continue } - sz := len(buf) - if isSniffing { - if sz > 0 && buf[0] == 0x00 { - buf = buf[1:] - mod.Debug("sniffed payload %x for %s", buf, mod.sniffAddr) - - if dev, found := mod.Session.HID.Get(mod.sniffAddr); found { - dev.LastSeen = time.Now() - dev.AddPayload(buf) - dev.AddChannel(mod.channel) - } else { - mod.Warning("got a payload for unknown device %s", mod.sniffAddr) - } - } + if mod.isSniffing() { + mod.onSniffedBuffer(buf) } else { - if sz >= 5 { - addr, payload := buf[0:5], buf[5:] - mod.Debug("detected device %x on channel %d (payload:%x)\n", addr, mod.channel, payload) - if isNew, dev := mod.Session.HID.AddIfNew(addr, mod.channel, payload); isNew { - // sniff for a while in order to detect the device type - go func() { - defer func() { - mod.sniffLock.Unlock() - mod.setSniffMode("clear") - }() - - mod.setSniffMode(dev.Address) - // make sure nobody can sniff to another - // address until we're not done here... - mod.sniffLock.Lock() - - time.Sleep(mod.sniffPeriod) - }() - } - } + mod.onDeviceDetected(buf) } }