1
1
#include <furi_hal.h>
2
+ #include <lib/toolbox/strint.h>
2
3
#include "ducky_script.h"
3
4
#include "ducky_script_i.h"
4
5
@@ -124,34 +125,58 @@ static int32_t ducky_fnc_altstring(BadUsbScript* bad_usb, const char* line, int3
124
125
125
126
static int32_t ducky_fnc_hold (BadUsbScript * bad_usb , const char * line , int32_t param ) {
126
127
UNUSED (param );
127
-
128
128
line = & line [ducky_get_command_len (line ) + 1 ];
129
- uint16_t key = ducky_get_keycode (bad_usb , line , true);
130
- if (key == HID_KEYBOARD_NONE ) {
131
- return ducky_error (bad_usb , "No keycode defined for %s" , line );
132
- }
133
- bad_usb -> key_hold_nb ++ ;
129
+
134
130
if (bad_usb -> key_hold_nb > (HID_KB_MAX_KEYS - 1 )) {
135
- return ducky_error (bad_usb , "Too many keys are hold " );
131
+ return ducky_error (bad_usb , "Too many keys are held " );
136
132
}
137
- bad_usb -> hid -> kb_press (bad_usb -> hid_inst , key );
138
- return 0 ;
133
+
134
+ // Handle Mouse Keys here
135
+ uint16_t key = ducky_get_mouse_keycode_by_name (line );
136
+ if (key != HID_MOUSE_NONE ) {
137
+ bad_usb -> key_hold_nb ++ ;
138
+ bad_usb -> hid -> mouse_press (bad_usb -> hid_inst , key );
139
+ return 0 ;
140
+ }
141
+
142
+ // Handle Keyboard keys here
143
+ key = ducky_get_keycode (bad_usb , line , true);
144
+ if (key != HID_KEYBOARD_NONE ) {
145
+ bad_usb -> key_hold_nb ++ ;
146
+ bad_usb -> hid -> kb_press (bad_usb -> hid_inst , key );
147
+ return 0 ;
148
+ }
149
+
150
+ // keyboard and mouse were none
151
+ return ducky_error (bad_usb , "Unknown keycode for %s" , line );
139
152
}
140
153
141
154
static int32_t ducky_fnc_release (BadUsbScript * bad_usb , const char * line , int32_t param ) {
142
155
UNUSED (param );
143
-
144
156
line = & line [ducky_get_command_len (line ) + 1 ];
145
- uint16_t key = ducky_get_keycode (bad_usb , line , true);
146
- if (key == HID_KEYBOARD_NONE ) {
147
- return ducky_error (bad_usb , "No keycode defined for %s" , line );
148
- }
157
+
149
158
if (bad_usb -> key_hold_nb == 0 ) {
150
- return ducky_error (bad_usb , "No keys are hold " );
159
+ return ducky_error (bad_usb , "No keys are held " );
151
160
}
152
- bad_usb -> key_hold_nb -- ;
153
- bad_usb -> hid -> kb_release (bad_usb -> hid_inst , key );
154
- return 0 ;
161
+
162
+ // Handle Mouse Keys here
163
+ uint16_t key = ducky_get_mouse_keycode_by_name (line );
164
+ if (key != HID_MOUSE_NONE ) {
165
+ bad_usb -> key_hold_nb -- ;
166
+ bad_usb -> hid -> mouse_release (bad_usb -> hid_inst , key );
167
+ return 0 ;
168
+ }
169
+
170
+ //Handle Keyboard Keys here
171
+ key = ducky_get_keycode (bad_usb , line , true);
172
+ if (key != HID_KEYBOARD_NONE ) {
173
+ bad_usb -> key_hold_nb -- ;
174
+ bad_usb -> hid -> kb_release (bad_usb -> hid_inst , key );
175
+ return 0 ;
176
+ }
177
+
178
+ // keyboard and mouse were none
179
+ return ducky_error (bad_usb , "No keycode defined for %s" , line );
155
180
}
156
181
157
182
static int32_t ducky_fnc_media (BadUsbScript * bad_usb , const char * line , int32_t param ) {
@@ -191,6 +216,43 @@ static int32_t ducky_fnc_waitforbutton(BadUsbScript* bad_usb, const char* line,
191
216
return SCRIPT_STATE_WAIT_FOR_BTN ;
192
217
}
193
218
219
+ static int32_t ducky_fnc_mouse_scroll (BadUsbScript * bad_usb , const char * line , int32_t param ) {
220
+ UNUSED (param );
221
+
222
+ line = & line [strcspn (line , " " ) + 1 ];
223
+ int32_t mouse_scroll_dist = 0 ;
224
+
225
+ if (strint_to_int32 (line , NULL , & mouse_scroll_dist , 10 ) != StrintParseNoError ) {
226
+ return ducky_error (bad_usb , "Invalid Number %s" , line );
227
+ }
228
+
229
+ bad_usb -> hid -> mouse_scroll (bad_usb -> hid_inst , mouse_scroll_dist );
230
+
231
+ return 0 ;
232
+ }
233
+
234
+ static int32_t ducky_fnc_mouse_move (BadUsbScript * bad_usb , const char * line , int32_t param ) {
235
+ UNUSED (param );
236
+
237
+ line = & line [strcspn (line , " " ) + 1 ];
238
+ int32_t mouse_move_x = 0 ;
239
+ int32_t mouse_move_y = 0 ;
240
+
241
+ if (strint_to_int32 (line , NULL , & mouse_move_x , 10 ) != StrintParseNoError ) {
242
+ return ducky_error (bad_usb , "Invalid Number %s" , line );
243
+ }
244
+
245
+ line = & line [strcspn (line , " " ) + 1 ];
246
+
247
+ if (strint_to_int32 (line , NULL , & mouse_move_y , 10 ) != StrintParseNoError ) {
248
+ return ducky_error (bad_usb , "Invalid Number %s" , line );
249
+ }
250
+
251
+ bad_usb -> hid -> mouse_move (bad_usb -> hid_inst , mouse_move_x , mouse_move_y );
252
+
253
+ return 0 ;
254
+ }
255
+
194
256
static const DuckyCmd ducky_commands [] = {
195
257
{"REM" , NULL , -1 },
196
258
{"ID" , NULL , -1 },
@@ -213,6 +275,10 @@ static const DuckyCmd ducky_commands[] = {
213
275
{"WAIT_FOR_BUTTON_PRESS" , ducky_fnc_waitforbutton , -1 },
214
276
{"MEDIA" , ducky_fnc_media , -1 },
215
277
{"GLOBE" , ducky_fnc_globe , -1 },
278
+ {"MOUSEMOVE" , ducky_fnc_mouse_move , -1 },
279
+ {"MOUSE_MOVE" , ducky_fnc_mouse_move , -1 },
280
+ {"MOUSESCROLL" , ducky_fnc_mouse_scroll , -1 },
281
+ {"MOUSE_SCROLL" , ducky_fnc_mouse_scroll , -1 },
216
282
};
217
283
218
284
#define TAG "BadUsb"
0 commit comments