Welcome to HID Hacker Inside Dude’s documentation!¶
Contents:
Introduction.¶
We started the HID project to get both open hardware and open software to use during our Red Teaming activities.
Quickstart
git clone https://github.com/immunity-systems/hidude.git
cd hidude
virutalenv env
source env/bin/activate
pip install -r requirements.txt
python HackerInsideDude.py
And now funny part begin. See image below:

Why?¶
To make some input into open source community.
For whom?¶
It’s for white hats, engineers and all other who wants to play with it.
Disclaimer.¶
The HID project is for demosration and ethical hacking activities. Mind that in most countries hacking is illegal and such activities can hava some legal consequeces.
Mind also that the project is in early stage, and the documentation is not yet completed.
Licence.¶
Copyright (c) 2017, Immunity Systems (www.immunity-systems.com).
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the Immunity Systems.
- Neither the name of the Immunity Systems nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY IMMUNITY SYSTEMS ‘’AS IS’’ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL IMMUNITY SYSTEMS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Authors¶
Karol Celiński¶
Immunity Systems
Paweł Maziarz¶
Immunity Systems
Andrzej Nowodworski¶
Immunity Systems
Immunity Systems¶
This project is held by Immunity Systems.
Immunity Systems is a young, highly specialized company engaged in the full range of issues related to IT security. The main asset of the company is a team of enthusiasts with over ten years experience in the IT security offensive and defensive including system implementation and verification of the levels of security systems implemented. The company’s goal is to provide customers with systems and services that will ensure the highest level of security of their information and business processes while maintaining an optimal level of costs incurred.
Project requirements.¶
Modules.¶
There are several modules required to run Hacker Inside Dude. Below is the list of those, which are uncommon, and you’ll probably need to install them.
- intelhex
- cmd2
Privilidges.¶
The user running Hacker Inside Dude should have access to USB drivers.
Quick start Guide.¶
The following guide is for those who just want to start using Hacker Inside Dude. If you are going to contribute to the project or want to dig in deep into the code, please refer to the API documentation.
Concept.¶
The basic concept of the HID is going about relation between modules, devices and payloads. First two are required and third one is optional. So main thing is to select the module and then the device. It is enough to configure your required action and program it on the selected device. Additionaly you can choose or define your custom payload for each module.
The simple usage is as follows:
python HackerInsideDude.py
use module <module_name>
use device <device>
execute
Getting help.¶
If you need some help at any time you can type:
help
To get more specified help you can type:
help <command_name>
There is always an option to get some detailed informations about modules, devices and payloads. To get it just type:
info
to get informations and actual configuration of current module, device and payload. Or you can type:
info module <module_name>
info device <device_name>
info payload <payload_name>
info action <action_name>
info parameter <parameter_name>
to get revelant informations about specific module, device, payload, action or parameter.
Modules.¶
Modules are determining witch kind of USB device we will be simulating on the device. For now it could be keyboard, mouse or both at the same time. To list all avaliable modules just type:
list_modules
To use some module just type:
use module <module_name>
At any time you can get detailed informations about modules by typing:
info module <module_name>
or if you’ve already selected module just type:
info
In that second option you will get all informations and actual configuration of current module you are using.
Devices.¶
The devices are used in natural way. You just select on which device you are going to program your activities. Currently we are supporting two different devices: EspusbWS and Digispark. To list all avaliable devices just type:
list_devices
When you are listing the devices at the end of the line in [ brackets, there are modules names, which are supported by each device. To use a specific device with your module just type:
use device <device_name>
At any time you can get the detailed informations about devices by typing:
info device <device_name>
or if you’ve already selected device just type:
info
In that case you will get all informations and actual configuration of current module and current device.
Payloads.¶
In each module there is a possibility to use defined or custom payload. To list avaliable payloads just type:
list_payloads
When you are listing the payloads at the end of the line in [ brackets, there are modules names in which you can use specified payload. To use a specific payload with your module just type:
use payload <payload_name>
At any time you can get the detailed informations about payload by typing:
info payload <payload_name>
or if you’ve already selected the payload or defined your custom one just type:
info
In that second option you will get all informations and actual configuration of current module, device and payload you are using. Instead of using avaliable payloads you can define your own, custom one. To do that you have to set payload parametr and within it, specify your all payload options. An example of custom payload is as follows:
set payload ``
There is a list of avaliable keys you can use in your payload in here.
Actions.¶
Actions are connected with devices. They specify what kind of actions are allowed on spiecified device. To list all allowed action just type:
list_actions
When you are listing the payloads at the end of the line in [ brackets, there are devices names for which actions are allowed. You can use the actions within a payload. The special action program is used by execute command to program the device.
Writting your own module/device/payload.¶
You can write your own module, device or payload code. Just mind the concept of that project. Below there are some code examples.
Module:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | from action_manager import action_manager
class Module:
name = None
short_description = None
description = None
required_actions = []
parameters = {
'param': {
'description':"Param description",
'default':"DEFAULT VALUE",
'required':"True",
}
}
payload_actions = []
def get_available_devices(self):
return action_manager.get_supported_devices(self.required_actions)
def validate(self):
"""
Should validate all parameters. This method is called in execute.
Return error message or empty string.
"""
return ""
def execute(self, paylad, device):
"""
It's executed after all parameters all set.
If all ok return "" else return error string.
"""
pass
def __str__(self):
return self.name
|
Device:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | class Device:
name = "abstract class"
info = ""
short_description = ""
"""
Device parameters
"""
parameters = {
'param': {
'description':"Param description",
'default':"DEFAULT VALUE",
'required':"True",
'value':"DEFAULT VALUE"
}
}
def dependency_check(self):
"""
Check if device got all required library on this machine
Return error message or empty string if all is ok.
"""
pass
def get_actions(self):
"""
Return actions provided by device.
"""
actions = []
for m in dir(self):
if m.startswith("action_"):
actions.append(m.strip("action_"))
return actions
def perform_action(self,ability,input):
"""
Execute action
"""
if "action_"+ability not in dir(self):
raise "Unknown action!"
return getattr(self,"action_"+ability)(input)
def info(self):
"""
Return some information about device.
"""
return info
def validate(self):
"""
Should validate all parameters. This method is called in execute.
Return error message or empty string.
"""
return ""
def __str__(self):
"""
Print name of device.
"""
return self.name
|
Payload:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | class Payload:
"""
Name of payload.
"""
name = None
"""
Description.
"""
info = None
"""
Shor description
"""
short_description = None
"""
Actions that are satisfied by payload.
"""
satisfied_actions = []
"""
Payload parameters
"""
parameters = {
'param': {
'description':"Param description",
'default':"DEFAULT VALUE",
'required':"True",
"value":"DEFAULT VALUE"
}
}
def get_payload(self):
return None
def validate(self):
"""
Should validate all parameters. This method is called before get_payload in execute.
Return error message or empty string.
"""
return ""
def __str__(self):
return self.name
|
Also please refere to list of keywords for special and functional keys, which can be foud Keyboard keys keywords..
Keyboard keys keywords.¶
Here is a list of keywords for functional and special keys:
- Again
- AlternateErase
- Application
- Cancel
- CapsLock
- Clear
- Clear
- ClearAgain
- Copy
- CrSelProps
- Cut
- DELETE
- DeleteForward
- DownArrow
- End
- ENTER
- ESCAPE
- Execute
- ExSel
- F1
- F10
- F11
- F12
- F13
- F14
- F15
- F16
- F17
- F18
- F19
- F2
- F20
- F21
- F22
- F23
- F24
- F3
- F4
- F5
- F6
- F7
- F8
- F9
- Find
- GraveAccent
- Help
- Home
- Insert
- International1
- International2
- International3
- International4
- International5
- International6
- International7
- International8
- International9
- KeypadAsterisk
- KeypadComma
- KeypadDelete
- KeypadDot
- KeypadDownArrow
- KeypadEight
- KeypadEnd
- KeypadENTER
- KeypadEqualSign
- KeypadEqualSign
- KeypadFive
- KeypadFour
- KeypadHome
- KeypadInsert
- KeypadLeftArrow
- KeypadMinus
- KeypadNine
- KeypadNumLock
- KeypadOne
- KeypadPageDn
- KeypadPageUp
- KeypadPlus
- KeypadRightArrow
- KeypadSeven
- KeypadSix
- KeypadSlash
- KeypadThree
- KeypadTwo
- KeypadUpArrow
- KeypadZero
- LANG1
- LANG2
- LANG3
- LANG4
- LANG5
- LANG6
- LANG7
- LANG8
- LANG9
- LeftAlt
- LeftArrow
- LeftControl
- LeftGUI
- LeftShift
- LockingCapsLock
- LockingNumLock
- LockingScrollLock
- Menu
- Mute
- NonUSBackslash
- NonUSHash
- NonUSPipe
- Oper
- Out
- PageDown
- PageUp
- Paste
- Pause
- Power
- PrintScreen
- Prior
- Return
- RighShift
- RightAlt
- RightArrow
- RightControl
- RightGUI
- ScrollLock
- Select
- Separator
- Spacebar or ‘ ‘
- Stop
- SysReq
- Tab
- Tilde
- Undo
- UpArrow
- VolumeDown
- VolumeUp
For detailed list of supported keys please refer to keyboard_write.py source code from core/actions.
API Documentation¶
Below you can find an API docs.
HackerInsideDude module¶
-
class
HackerInsideDude.
HID
(completekey='tab', stdin=None, stdout=None, use_ipython=False)¶ Bases:
cmd2.Cmd
-
active_device
= None¶
-
active_module
= None¶
-
active_payload
= None¶
-
complete_info
(text, line, begidx, endidx)¶
-
complete_set
(text, line, begidx, endidx)¶
-
complete_use
(text, line, begidx, endidx)¶
-
current_parameters
= {'device': [], 'payload': [], 'module': []}¶
-
default
(line)¶
-
do_execute
(line)¶ Execute module. To use commend first use module, device and set payload !
Usage: just type execute and voilla!
-
do_help
(arg)¶ List available commands with “help” or detailed help with “help cmd”.
-
do_info
(line)¶ Print information about components.
Usage: info [COMPONENT ARGUMENT] Where COMPONENT is one of module, device, payload, parameter.
Syntax: * info - print info about active module, device and payload. * info device [DEVICE_NAME] - print info about device (submitted as argument or active). * info module [MODULE_NAME] - print info about module (submitted as argument or active). * info payload [PAYLOAD_NAME] - print info about payload (submitted as argument or active). * info action [ACTION_NAME] - print info about action (see list_actions for available names). * info parameter OPTION_NAME - print info about parameter in active module, payload or device.
-
do_list_actions
(line)¶ List all loaded actions with short description and devices supporting them.
Usage: Just type list_actions without arguments to see what was loaded.
-
do_list_devices
(line)¶ List all loaded devices with short description and modules able to use them.
Usage: Just type list_devices without arguments to see what was loaded.
-
do_list_modules
(line)¶ List all loaded modules with short description and supported devices.
Usage: Just type list_modules without arguments to see what was loaded.
-
do_list_payloads
(line)¶ List all loaded payloads with short description and modules able to use them.
Usage: Just type list_payloads without arguments to see what was loaded.
-
do_set
(line)¶ Sets a settable parameter.
Accepts abbreviated parameter names so long as there is no ambiguity. Call without arguments for a list of settable parameters with their values. Command can be used to set parameter of active module, payload, device or global options.
To set custom payload just use: set payload “some value” To load payload from predefined list see help use.
-
do_show
(instance, arg)¶ Shows value of a parameter. Usage: show [options] arg
- Options:
-h, --help show this help message and exit -l, --long describe function of parameter
Usage: show [options] arg
- Options:
-h, --help show this help message and exit -l, --long describe function of parameter
-
do_use
(line)¶ Activate selected module, payload or device.
- Usage:
- use module <module name> use device <device name> - only when module is selected! use payload <payload name> - only when module is selected!
Please use TAB for completion.
-
doc_header
= 'to be initialized'¶
-
get_names_hack
()¶
-
important_commands
= ['do_list_devices', 'do_list_modules', 'do_list_payloads', 'do_list_actions', 'do_info', 'do_use', 'do_show', 'do_execute']¶
-
info_action
(arg)¶
-
info_device
(arg)¶
-
info_module
(arg)¶
-
info_parameter
(arg)¶
-
info_payload
(arg)¶
-
intro
= '\x1b[34m .-:/+osyhhddmmmNNNNNmmmddhyso+: \n .:+sydNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMy \n ./sdNMMMMMMMMMMMMMNmddhyyysssyyyhhdNMMMMMMM+ \n .+yNMMMMMMMMMmhs+/-.` `-/sdMM. \n :smMMMMMMNds+:. `hyso/-` `- \n -sNMMMMMds/. `MMMMMMMNds/` \n .omMMMMms:` `MMMMMMMMMMMMdo. \n -yMMMMd+. -:/osydNMMMMMMMd/ \n -hMMMNs. sdhs `:ohNMMMMm/ \n `sMMMm+` dMMh yMN:/dd+ :yMMMMd. \n .mMMNo` dMMo .smNmh.yMMdso/ `oNMMN/ \n :NMMd. ---` dMM/ :/`.NMd`hM/sMMs .hMMM/ \n -NMMs NMMh -/:` dMM:hMy.oMMydd+ oMM- sMMN. \n `mMM+ mMMs -- :mMmNM+ hMMMm: yMM:`-+.+MM. sMMy \n +MMs dMM/ .hMMMd: :MMh`oMy yMM+hMm./MMsdMm:-sy` `NMN` \n mMN` dMM--yy+``mMh.dMm mMm ` yMN `mMy -oys: +Nm+ sMM- \n`MMs dMMyNNMMs`/+/+mMM NMy .sMd`sMm oMN. .- oMMo `+hhy+ +MM: \n-MM/ dMM+ :MMh`yMmydMM`.yNdMm+` `` .mMh oMM/ .mMm/NMo oMM. \n:MM: dMN NMm.NmoodMM. .. :o. ``. +dNMMM/`mMm:hMN: mMm \n-MMs hMd hMN .oys+yh.`-` +NMMy hMM. yMM/oMM//MMmds//. +MM/ \n NMN. :s+ :yy yMh`ymd:.ss+``mMMd+. sMM`:MM+ sMM--MM/ +NMs +MMs \n :MMm` `/+/ yMMhdmMM/`hMN: sMM`yMM`.dMM- -smNNs. `sMMs \n /MMN: .MMN yMMd`:MMs .oNNo +MM`+MMmNoMM- `+NMN: \n -mMMh. `MMm sMM: `NMm .mMM.:MM -oo. ym: .sNMNo` \n `sMMMh: MMh oMM- yMM-`sMMN: -- .+dMMNo` \n .sNMMms- MMy /NM. :MMs.yh+` `:smMMMd/` \n `+mMMMNho-` dMy -/: -+smMMMMmo. \n -odMMMMMmyo:. .-/ohmMMMMMMdo- \n `/smMMMMMMMNdhso+/:::--:://+osyhdNMMMMMMMMNds:` \n `-+sdNMMMMMMMMMMMMMMMMMMMMMMMMMNmhs+:. \n `-:/+osyyhhhdhhhyyso+/:.` \n\x1b[39m\x1b[31m\n DUDE... \n\x1b[39m'¶
-
modules
= {}¶
-
option_argument_complete
(text, line, begidx, endidx, option_arguments_map)¶
-
payload
= ''¶
-
payloads
= {}¶
-
preloop
()¶
-
prompt
= '\x1b[32mHID > \x1b[39m'¶
-
ruler
= ''¶
-
use_device
(line)¶
-
use_module
(line)¶
-
use_payload
(line)¶
-
core package¶
Subpackages¶
Submodules¶
core.action module¶
core.action_manager module¶
-
class
core.action_manager.
ActionManager
¶ -
actions
= {'mouse_move': <core.actions.mouse_move.mouse_move instance>, 'program': <core.actions.program.program instance>, 'sleep': <core.actions.sleep.sleep instance>, 'keyboard_write': <core.actions.keyboard_write.keyboard_write instance>}¶
-
actions_map
= {}¶
-
device_map
= {}¶
-
devices
= []¶
-
filter_supported_modules
(obj, module_list)¶
-
get_all_devices
()¶
-
get_all_devices_str
()¶
-
get_supported_devices
(required_actions)¶
-
parse_payload
(payload)¶
-
register_device
(device)¶
-
validate_payload
(payload)¶
-
core.consts module¶
core.device module¶
-
class
core.device.
Device
¶ -
dependency_check
()¶ Check if device got all required library on this machine
-
get_actions
()¶ Return actions provided by device.
-
info
()¶ Return some information about device.
-
name
= 'abstract class'¶
-
parameters
= {'param': {'default': 'DEFAULT VALUE', 'required': 'True', 'description': 'Param description', 'value': 'DEFAULT VALUE'}}¶
-
perform_action
(ability, input)¶ Execute action
-
short_description
= ''¶ Device parameters
-
validate
()¶ Should validate all parameters. This method is called in execute. Return error message or empty string.
-
core.module module¶
-
class
core.module.
Module
¶ -
description
= None¶
-
execute
(paylad, device)¶ It’s executed after all parameters all set. If all ok return “” else return error string.
-
get_available_devices
()¶
-
name
= None¶
-
parameters
= {'param': {'default': 'DEFAULT VALUE', 'required': 'True', 'description': 'Param description'}}¶
-
payload_actions
= []¶
-
required_actions
= []¶
-
short_description
= None¶
-
validate
()¶ Should validate all parameters. This method is called in execute. Return error message or empty string.
-
core.payload module¶
-
class
core.payload.
Payload
¶ Name of payload.
-
get_payload
()¶
-
info
= None¶ Shor description
-
name
= None¶ Description.
-
parameters
= {'param': {'default': 'DEFAULT VALUE', 'required': 'True', 'description': 'Param description', 'value': 'DEFAULT VALUE'}}¶
-
satisfied_actions
= []¶ Payload parameters
-
short_description
= None¶ Actions that are satisfied by payload.
-
validate
()¶ Should validate all parameters. This method is called before get_payload in execute. Return error message or empty string.
-
core.various module¶
-
core.various.
bold
(txt)¶
-
core.various.
colorize
(color, text)¶
-
core.various.
print_color
(color, text)¶
-
core.various.
print_warning
(text)¶
-
core.various.
strip_escape
(txt)¶
Module contents¶
core.actions package¶
Submodules¶
core.actions.keyboard_write module¶
-
core.actions.keyboard_write.
init
()¶
-
class
core.actions.keyboard_write.
keyboard_write
¶ Bases:
core.action.Action
-
info
= 'move_move is action that command device to move cursor in x and y direction (values can be negative). \n\nBelowe payload will command device to move mouse 10 in x and y, wait 1s and go back:\n\nmouse_move(10,10);\nsleep(1000);\nmouse_move(-10,-10);\n '¶
-
name
= 'keyboard_write'¶
-
short_description
= 'Move mouse in in x,y direction. Arguments can be negative'¶
-
validate
(payload)¶
-
core.actions.mouse_move module¶
-
core.actions.mouse_move.
init
()¶
-
class
core.actions.mouse_move.
mouse_move
¶ Bases:
core.action.Action
-
info
= 'move_move is action that command device to move cursor in x and y direction (values can be negative). \n\nBelowe payload will command device to move mouse 10 in x and y, wait 1s and go back:\n\nmouse_move(10,10);\nsleep(1000);\nmouse_move(-10,-10);\n '¶
-
name
= 'mouse_move'¶
-
short_description
= 'Move mouse in in x,y direction. Arguments can be negative'¶
-
validate
(payload)¶
-
core.actions.sleep module¶
-
core.actions.sleep.
init
()¶
-
class
core.actions.sleep.
sleep
¶ Bases:
core.action.Action
-
info
= 'Sleep is action that command device to wait fixed miliseconds before execute next action. \n\nBelowe payload will command device to wait 1s before executing next action:\n\nsleep(1000)\n '¶
-
name
= 'sleep'¶
-
short_description
= 'Sleep provided number of miliseconds'¶
-
validate
(payload)¶
-
Module contents¶
modules package¶
Submodules¶
modules.hid_keyboard module¶
-
class
modules.hid_keyboard.
hid_keyboard
¶ Bases:
core.module.Module
-
description
= 'Parameters examples etc.'¶
-
execute
(paylad, device)¶ It’s executed after all parameters all set.
-
name
= 'hid_keyboard'¶
-
parameters
= {'sleep_enabled': {'default': 'True', 'required': 'True', 'description': 'Does device have to sleep before start after power on.'}, 'sleep_time': {'default': '10', 'required': 'True', 'description': 'Number of seconds to sleep.'}}¶
-
payload_actions
= ['keyboard_write', 'sleep']¶
-
payload_description
= 'Information about how we can construct payload'¶
-
required_actions
= ['keyboard_write', 'sleep', 'program']¶
-
short_description
= 'Turns device into HID keyboard that sends constant payload after plugin'¶
-
validate
()¶
-
-
modules.hid_keyboard.
init
()¶
Module contents¶
devices package¶
Submodules¶
devices.digispark module¶
-
class
devices.digispark.
Digispark
¶ Bases:
core.device.Device
-
action_keyboard_write
(input)¶
-
action_mouse_move
(input)¶
-
action_program
(input)¶
-
action_sleep
(input)¶
-
dependency_check
()¶
-
dev_info
= None¶
-
get_info
()¶
-
info
= '\n The Digispark is an Attiny85 based microcontroller development board \n similar to the Arduino line, only cheaper, smaller, and a bit less \n powerful. With a whole host of shields to extend its functionality \n and the action to use the familiar Arduino IDE the Digispark is a \n great way to jump into electronics, or perfect for when an Arduino \n is too big or too much.\n '¶
-
name
= 'Digispark'¶
-
parameters
= {'print_dev_info': {'default': 'True', 'required': 'True', 'description': 'If true, device information will be printed when programing.', 'value': 'True'}}¶
-
print_info
()¶
-
short_description
= 'AVR Attiny85 uC based cheap device with software USB support.'¶
-
validate
()¶
-
-
devices.digispark.
init
()¶
Module contents¶
payloads package¶
Submodules¶
payloads.keyboard_hello_world module¶
-
payloads.keyboard_hello_world.
init
()¶
-
class
payloads.keyboard_hello_world.
keyboard_hello_world
¶ Bases:
core.payload.Payload
Name of payload.
-
get_payload
()¶
-
info
= "PoC for testing new device with keyboard abilities\nIt's simple sending constant string 'Hello World' and does nothing else ;-).\n "¶ Shor description
-
name
= 'keyboard_hello_world'¶ Description.
-
parameters
= {'uppercase': {'default': 'False', 'required': 'True', 'description': 'If true module will output uppercase HELLO WORLD.', 'value': 'False'}}¶
-
satisfied_actions
= ['keyboard_write', 'sleep']¶
-
short_description
= "Device after plugin writes 'Hello World' as a keyboard."¶ Abilities that is required by payload.
-
validate
()¶
-