mnemonic.c 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. #include <furi_hal.h>
  2. #include <furi_hal_usb_hid.h>
  3. #include "mnemonic.h"
  4. #define TAG "BadUSB"
  5. #define WORKER_TAG TAG "Worker"
  6. #define FILE_BUFFER_LEN 16
  7. #define SCRIPT_STATE_ERROR (-1)
  8. #define SCRIPT_STATE_END (-2)
  9. #define SCRIPT_STATE_NEXT_LINE (-3)
  10. #define BADUSB_ASCII_TO_KEY(script, x) \
  11. (((uint8_t)x < 128) ? (script->layout[(uint8_t)x]) : HID_KEYBOARD_NONE)
  12. static const uint8_t numpad_keys[10] = {
  13. HID_KEYPAD_0,
  14. HID_KEYPAD_1,
  15. HID_KEYPAD_2,
  16. HID_KEYPAD_3,
  17. HID_KEYPAD_4,
  18. HID_KEYPAD_5,
  19. HID_KEYPAD_6,
  20. HID_KEYPAD_7,
  21. HID_KEYPAD_8,
  22. HID_KEYPAD_9,
  23. };
  24. static bool ducky_get_number(const char* param, uint32_t* val) {
  25. uint32_t value = 0;
  26. if(sscanf(param, "%lu", &value) == 1) {
  27. *val = value;
  28. return true;
  29. }
  30. return false;
  31. }
  32. static void ducky_numlock_on() {
  33. if((furi_hal_hid_get_led_state() & HID_KB_LED_NUM) == 0) {
  34. furi_hal_hid_kb_press(HID_KEYBOARD_LOCK_NUM_LOCK);
  35. furi_hal_hid_kb_release(HID_KEYBOARD_LOCK_NUM_LOCK);
  36. }
  37. }
  38. static bool ducky_numpad_press(const char num) {
  39. if((num < '0') || (num > '9')) return false;
  40. uint16_t key = numpad_keys[num - '0'];
  41. furi_hal_hid_kb_press(key);
  42. furi_hal_hid_kb_release(key);
  43. return true;
  44. }
  45. static bool ducky_altchar(const char* charcode) {
  46. uint8_t i = 0;
  47. bool state = false;
  48. FURI_LOG_I(WORKER_TAG, "char %s", charcode);
  49. furi_hal_hid_kb_press(KEY_MOD_LEFT_ALT);
  50. while(!ducky_is_line_end(charcode[i])) {
  51. state = ducky_numpad_press(charcode[i]);
  52. if(state == false) break;
  53. i++;
  54. }
  55. furi_hal_hid_kb_release(KEY_MOD_LEFT_ALT);
  56. return state;
  57. }
  58. static bool ducky_altstring(const char* param) {
  59. uint32_t i = 0;
  60. bool state = false;
  61. while(param[i] != '\0') {
  62. if((param[i] < ' ') || (param[i] > '~')) {
  63. i++;
  64. continue; // Skip non-printable chars
  65. }
  66. char temp_str[4];
  67. snprintf(temp_str, 4, "%u", param[i]);
  68. state = ducky_altchar(temp_str);
  69. if(state == false) break;
  70. i++;
  71. }
  72. return state;
  73. }
  74. static bool ducky_string(BadUsbScript* bad_usb, const char* param) {
  75. uint32_t i = 0;
  76. while(param[i] != '\0') {
  77. uint16_t keycode = BADUSB_ASCII_TO_KEY(bad_usb, param[i]);
  78. if(keycode != HID_KEYBOARD_NONE) {
  79. furi_hal_hid_kb_press(keycode);
  80. furi_hal_hid_kb_release(keycode);
  81. if(bad_usb->stringdelay > 0) {
  82. furi_delay_ms(bad_usb->stringdelay);
  83. }
  84. }
  85. i++;
  86. }
  87. bad_usb->stringdelay = 0;
  88. return true;
  89. }
  90. int32_t ducky_fnc_noop(
  91. BadUsbScript* bad_usb,
  92. FuriString* line,
  93. const char* line_tmp,
  94. char* error,
  95. size_t error_len) {
  96. (void)bad_usb;
  97. (void)line;
  98. (void)line_tmp;
  99. (void)error;
  100. (void)error_len;
  101. return (0);
  102. }
  103. int32_t ducky_fnc_delay(
  104. BadUsbScript* bad_usb,
  105. FuriString* line,
  106. const char* line_tmp,
  107. char* error,
  108. size_t error_len) {
  109. bool state = false;
  110. (void)bad_usb;
  111. (void)line;
  112. line_tmp = &line_tmp[ducky_get_command_len(line_tmp) + 1];
  113. uint32_t delay_val = 0;
  114. state = ducky_get_number(line_tmp, &delay_val);
  115. if((state) && (delay_val > 0)) {
  116. return (int32_t)delay_val;
  117. }
  118. if(error != NULL) {
  119. snprintf(error, error_len, "Invalid number %s", line_tmp);
  120. }
  121. return SCRIPT_STATE_ERROR;
  122. }
  123. int32_t ducky_fnc_defdelay(
  124. BadUsbScript* bad_usb,
  125. FuriString* line,
  126. const char* line_tmp,
  127. char* error,
  128. size_t error_len) {
  129. bool state = false;
  130. (void)line;
  131. line_tmp = &line_tmp[ducky_get_command_len(line_tmp) + 1];
  132. state = ducky_get_number(line_tmp, &bad_usb->defdelay);
  133. if(!state && error != NULL) {
  134. snprintf(error, error_len, "Invalid number %s", line_tmp);
  135. }
  136. return (state) ? (0) : SCRIPT_STATE_ERROR;
  137. }
  138. int32_t ducky_fnc_strdelay(
  139. BadUsbScript* bad_usb,
  140. FuriString* line,
  141. const char* line_tmp,
  142. char* error,
  143. size_t error_len) {
  144. bool state = false;
  145. (void)line;
  146. line_tmp = &line_tmp[ducky_get_command_len(line_tmp) + 1];
  147. state = ducky_get_number(line_tmp, &bad_usb->stringdelay);
  148. if((state) && (bad_usb->stringdelay > 0)) {
  149. return state;
  150. }
  151. if(error != NULL) {
  152. snprintf(error, error_len, "Invalid number %s", line_tmp);
  153. }
  154. return SCRIPT_STATE_ERROR;
  155. }
  156. int32_t ducky_fnc_string(
  157. BadUsbScript* bad_usb,
  158. FuriString* line,
  159. const char* line_tmp,
  160. char* error,
  161. size_t error_len) {
  162. bool state = false;
  163. (void)line;
  164. line_tmp = &line_tmp[ducky_get_command_len(line_tmp) + 1];
  165. state = ducky_string(bad_usb, line_tmp);
  166. if(!state && error != NULL) {
  167. snprintf(error, error_len, "Invalid string %s", line_tmp);
  168. }
  169. return (state) ? (0) : SCRIPT_STATE_ERROR;
  170. }
  171. int32_t ducky_fnc_repeat(
  172. BadUsbScript* bad_usb,
  173. FuriString* line,
  174. const char* line_tmp,
  175. char* error,
  176. size_t error_len) {
  177. bool state = false;
  178. (void)line;
  179. line_tmp = &line_tmp[ducky_get_command_len(line_tmp) + 1];
  180. state = ducky_get_number(line_tmp, &bad_usb->repeat_cnt);
  181. if(!state && error != NULL) {
  182. snprintf(error, error_len, "Invalid number %s", line_tmp);
  183. }
  184. return (state) ? (0) : SCRIPT_STATE_ERROR;
  185. }
  186. int32_t ducky_fnc_sysrq(
  187. BadUsbScript* bad_usb,
  188. FuriString* line,
  189. const char* line_tmp,
  190. char* error,
  191. size_t error_len) {
  192. (void)error;
  193. (void)error_len;
  194. (void)line;
  195. line_tmp = &line_tmp[ducky_get_command_len(line_tmp) + 1];
  196. uint16_t key = ducky_get_keycode(bad_usb, line_tmp, true);
  197. furi_hal_hid_kb_press(KEY_MOD_LEFT_ALT | HID_KEYBOARD_PRINT_SCREEN);
  198. furi_hal_hid_kb_press(key);
  199. furi_hal_hid_kb_release_all();
  200. return (0);
  201. }
  202. int32_t ducky_fnc_altchar(
  203. BadUsbScript* bad_usb,
  204. FuriString* line,
  205. const char* line_tmp,
  206. char* error,
  207. size_t error_len) {
  208. bool state = false;
  209. (void)bad_usb;
  210. (void)line;
  211. line_tmp = &line_tmp[ducky_get_command_len(line_tmp) + 1];
  212. ducky_numlock_on();
  213. state = ducky_altchar(line_tmp);
  214. if(!state && error != NULL) {
  215. snprintf(error, error_len, "Invalid altchar %s", line_tmp);
  216. }
  217. return (state) ? (0) : SCRIPT_STATE_ERROR;
  218. }
  219. int32_t ducky_fnc_altstring(
  220. BadUsbScript* bad_usb,
  221. FuriString* line,
  222. const char* line_tmp,
  223. char* error,
  224. size_t error_len) {
  225. bool state = false;
  226. (void)bad_usb;
  227. (void)line;
  228. line_tmp = &line_tmp[ducky_get_command_len(line_tmp) + 1];
  229. ducky_numlock_on();
  230. state = ducky_altstring(line_tmp);
  231. if(!state && error != NULL) {
  232. snprintf(error, error_len, "Invalid altstring %s", line_tmp);
  233. }
  234. return (state) ? (0) : SCRIPT_STATE_ERROR;
  235. }
  236. int32_t ducky_fnc_stringln(
  237. BadUsbScript* bad_usb,
  238. FuriString* line,
  239. const char* line_tmp,
  240. char* error,
  241. size_t error_len) {
  242. bool state = false;
  243. (void)line;
  244. line_tmp = &line_tmp[ducky_get_command_len(line_tmp) + 1];
  245. state = ducky_string(bad_usb, line_tmp);
  246. if(!state && error != NULL) {
  247. snprintf(error, error_len, "Invalid string %s", line_tmp);
  248. }
  249. furi_hal_hid_kb_press(HID_KEYBOARD_RETURN);
  250. furi_hal_hid_kb_release(HID_KEYBOARD_RETURN);
  251. return (state) ? (0) : SCRIPT_STATE_ERROR;
  252. }
  253. int32_t ducky_fnc_hold(
  254. BadUsbScript* bad_usb,
  255. FuriString* line,
  256. const char* line_tmp,
  257. char* error,
  258. size_t error_len) {
  259. (void)line;
  260. line_tmp = &line_tmp[ducky_get_command_len(line_tmp) + 1];
  261. uint16_t key = ducky_get_keycode(bad_usb, line_tmp, true);
  262. if(key == HID_KEYBOARD_NONE) {
  263. if(error != NULL) {
  264. snprintf(error, error_len, "No keycode defined for %s", line_tmp);
  265. }
  266. return SCRIPT_STATE_ERROR;
  267. }
  268. furi_hal_hid_kb_press(key);
  269. return (0);
  270. }
  271. int32_t ducky_fnc_release(
  272. BadUsbScript* bad_usb,
  273. FuriString* line,
  274. const char* line_tmp,
  275. char* error,
  276. size_t error_len) {
  277. (void)line;
  278. line_tmp = &line_tmp[ducky_get_command_len(line_tmp) + 1];
  279. uint16_t key = ducky_get_keycode(bad_usb, line_tmp, true);
  280. if(key == HID_KEYBOARD_NONE) {
  281. if(error != NULL) {
  282. snprintf(error, error_len, "No keycode defined for %s", line_tmp);
  283. }
  284. return SCRIPT_STATE_ERROR;
  285. }
  286. furi_hal_hid_kb_release(key);
  287. return (0);
  288. }