protocol.c 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. #include "protocol_i.h"
  2. #include "furi.h"
  3. // #######################
  4. // ## Ibutton Protocols ##
  5. // #######################
  6. #define DS1990_DATA_SIZE (8)
  7. #define Metakom_DATA_SIZE (4)
  8. #define Cyfral_DATA_SIZE (2)
  9. const uint8_t uid_list_ds1990[][DS1990_DATA_SIZE] = {
  10. {0x01, 0xBE, 0x40, 0x11, 0x5A, 0x36, 0x00, 0xE1}, //– код универсального ключа, для Vizit
  11. {0x01, 0xBE, 0x40, 0x11, 0x5A, 0x56, 0x00, 0xBB}, //- проверен работает
  12. {0x01, 0xBE, 0x40, 0x11, 0x00, 0x00, 0x00, 0x77}, //- проверен работает
  13. {0x01, 0xBE, 0x40, 0x11, 0x0A, 0x00, 0x00, 0x1D}, //- проверен работает Визит иногда КЕЙМАНЫ
  14. {0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F}, //- проверен(метаком, цифрал, ВИЗИТ).
  15. {0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x9B}, //- проверен Визит, Метакомы, КОНДОР
  16. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x14}, //???-Открываает 98% Метаком и некоторые Цифрал
  17. {0x01, 0x00, 0x00, 0x00, 0x00, 0x90, 0x19, 0xFF}, //???-Отлично работает на старых домофонах
  18. {0x01, 0x6F, 0x2E, 0x88, 0x8A, 0x00, 0x00, 0x4D}, //???-Открывать что-то должен
  19. {0x01, 0x53, 0xD4, 0xFE, 0x00, 0x00, 0x7E, 0x88}, //???-Cyfral, Metakom
  20. {0x01, 0x53, 0xD4, 0xFE, 0x00, 0x00, 0x00, 0x6F}, //???-домофоны Визит (Vizit) - до 99%
  21. {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D}, //???-домофоны Cyfral CCD-20 - до 70%
  22. {0x01, 0x00, 0xBE, 0x11, 0xAA, 0x00, 0x00, 0xFB}, //???-домофоны Кейман (KEYMAN)
  23. {0x01, 0x76, 0xB8, 0x2E, 0x0F, 0x00, 0x00, 0x5C}, //???-домофоны Форвард
  24. {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // Null bytes
  25. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x14}, // Only FF
  26. {0x01, 0x78, 0x00, 0x48, 0xFD, 0xFF, 0xFF, 0xD1}, // StarNew Uni5
  27. {0x01, 0xA9, 0xE4, 0x3C, 0x09, 0x00, 0x00, 0xE6}, // Eltis Uni
  28. };
  29. const uint8_t uid_list_metakom[][Metakom_DATA_SIZE] = {
  30. {0x00, 0x00, 0x00, 0x00}, // Null bytes
  31. {0xFF, 0xFF, 0xFF, 0xFF}, // Only FF
  32. {0x11, 0x11, 0x11, 0x11}, // Only 11
  33. {0x22, 0x22, 0x22, 0x22}, // Only 22
  34. {0x33, 0x33, 0x33, 0x33}, // Only 33
  35. {0x44, 0x44, 0x44, 0x44}, // Only 44
  36. {0x55, 0x55, 0x55, 0x55}, // Only 55
  37. {0x66, 0x66, 0x66, 0x66}, // Only 66
  38. {0x77, 0x77, 0x77, 0x77}, // Only 77
  39. {0x88, 0x88, 0x88, 0x88}, // Only 88
  40. {0x99, 0x99, 0x99, 0x99}, // Only 99
  41. {0x12, 0x34, 0x56, 0x78}, // Incremental UID
  42. {0x9A, 0x78, 0x56, 0x34}, // Decremental UID
  43. {0x04, 0xd0, 0x9b, 0x0d}, // ??
  44. {0x34, 0x00, 0x29, 0x3d}, // ??
  45. {0x04, 0xdf, 0x00, 0x00}, // ??
  46. {0xCA, 0xCA, 0xCA, 0xCA}, // ??
  47. };
  48. const uint8_t uid_list_cyfral[][Cyfral_DATA_SIZE] = {
  49. {0x00, 0x00}, // Null bytes
  50. {0xFF, 0xFF}, // Only FF
  51. {0x11, 0x11}, // Only 11
  52. {0x22, 0x22}, // Only 22
  53. {0x33, 0x33}, // Only 33
  54. {0x44, 0x44}, // Only 44
  55. {0x55, 0x55}, // Only 55
  56. {0x66, 0x66}, // Only 66
  57. {0x77, 0x77}, // Only 77
  58. {0x88, 0x88}, // Only 88
  59. {0x99, 0x99}, // Only 99
  60. {0x12, 0x34}, // Incremental UID
  61. {0x56, 0x34}, // Decremental UID
  62. {0xCA, 0xCA}, // ??
  63. {0x8E, 0xC9}, // Elevator code
  64. {0x6A, 0x50}, // VERY fresh code from smartkey
  65. };
  66. // ###########################
  67. // ## Rfid_125khz Protocols ##
  68. // ###########################
  69. #define EM4100_DATA_SIZE (5)
  70. #define HIDProx_DATA_SIZE (6)
  71. #define PAC_DATA_SIZE (4)
  72. #define H10301_DATA_SIZE (3)
  73. const uint8_t uid_list_em4100[][EM4100_DATA_SIZE] = {
  74. {0x00, 0x00, 0x00, 0x00, 0x00}, // Null bytes
  75. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, // Only FF
  76. {0x11, 0x11, 0x11, 0x11, 0x11}, // Only 11
  77. {0x22, 0x22, 0x22, 0x22, 0x22}, // Only 22
  78. {0x33, 0x33, 0x33, 0x33, 0x33}, // Only 33
  79. {0x44, 0x44, 0x44, 0x44, 0x44}, // Only 44
  80. {0x55, 0x55, 0x55, 0x55, 0x55}, // Only 55
  81. {0x66, 0x66, 0x66, 0x66, 0x66}, // Only 66
  82. {0x77, 0x77, 0x77, 0x77, 0x77}, // Only 77
  83. {0x88, 0x88, 0x88, 0x88, 0x88}, // Only 88
  84. {0x99, 0x99, 0x99, 0x99, 0x99}, // Only 99
  85. {0x12, 0x34, 0x56, 0x78, 0x9A}, // Incremental UID
  86. {0x9A, 0x78, 0x56, 0x34, 0x12}, // Decremental UID
  87. {0x04, 0xd0, 0x9b, 0x0d, 0x6a}, // From arha
  88. {0x34, 0x00, 0x29, 0x3d, 0x9e}, // From arha
  89. {0x04, 0xdf, 0x00, 0x00, 0x01}, // From arha
  90. {0xCA, 0xCA, 0xCA, 0xCA, 0xCA}, // From arha
  91. };
  92. const uint8_t uid_list_hid[][HIDProx_DATA_SIZE] = {
  93. {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // Null bytes
  94. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, // Only FF
  95. {0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, // Only 11
  96. {0x22, 0x22, 0x22, 0x22, 0x22, 0x22}, // Only 22
  97. {0x33, 0x33, 0x33, 0x33, 0x33, 0x33}, // Only 33
  98. {0x44, 0x44, 0x44, 0x44, 0x44, 0x44}, // Only 44
  99. {0x55, 0x55, 0x55, 0x55, 0x55, 0x55}, // Only 55
  100. {0x66, 0x66, 0x66, 0x66, 0x66, 0x66}, // Only 66
  101. {0x77, 0x77, 0x77, 0x77, 0x77, 0x77}, // Only 77
  102. {0x88, 0x88, 0x88, 0x88, 0x88, 0x88}, // Only 88
  103. {0x99, 0x99, 0x99, 0x99, 0x99, 0x99}, // Only 99
  104. {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC}, // Incremental UID
  105. {0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12}, // Decremental UID
  106. {0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA}, // From arha
  107. };
  108. const uint8_t uid_list_pac[][PAC_DATA_SIZE] = {
  109. {0x00, 0x00, 0x00, 0x00}, // Null bytes
  110. {0xFF, 0xFF, 0xFF, 0xFF}, // Only FF
  111. {0x11, 0x11, 0x11, 0x11}, // Only 11
  112. {0x22, 0x22, 0x22, 0x22}, // Only 22
  113. {0x33, 0x33, 0x33, 0x33}, // Only 33
  114. {0x44, 0x44, 0x44, 0x44}, // Only 44
  115. {0x55, 0x55, 0x55, 0x55}, // Only 55
  116. {0x66, 0x66, 0x66, 0x66}, // Only 66
  117. {0x77, 0x77, 0x77, 0x77}, // Only 77
  118. {0x88, 0x88, 0x88, 0x88}, // Only 88
  119. {0x99, 0x99, 0x99, 0x99}, // Only 99
  120. {0x12, 0x34, 0x56, 0x78}, // Incremental UID
  121. {0x9A, 0x78, 0x56, 0x34}, // Decremental UID
  122. {0x04, 0xd0, 0x9b, 0x0d}, // From arha
  123. {0x34, 0x00, 0x29, 0x3d}, // From arha
  124. {0x04, 0xdf, 0x00, 0x00}, // From arha
  125. {0xCA, 0xCA, 0xCA, 0xCA}, // From arha
  126. };
  127. const uint8_t uid_list_h10301[][H10301_DATA_SIZE] = {
  128. {0x00, 0x00, 0x00}, // Null bytes
  129. {0xFF, 0xFF, 0xFF}, // Only FF
  130. {0x11, 0x11, 0x11}, // Only 11
  131. {0x22, 0x22, 0x22}, // Only 22
  132. {0x33, 0x33, 0x33}, // Only 33
  133. {0x44, 0x44, 0x44}, // Only 44
  134. {0x55, 0x55, 0x55}, // Only 55
  135. {0x66, 0x66, 0x66}, // Only 66
  136. {0x77, 0x77, 0x77}, // Only 77
  137. {0x88, 0x88, 0x88}, // Only 88
  138. {0x99, 0x99, 0x99}, // Only 99
  139. {0x12, 0x34, 0x56}, // Incremental UID
  140. {0x56, 0x34, 0x12}, // Decremental UID
  141. {0xCA, 0xCA, 0xCA}, // From arha
  142. };
  143. #if defined(RFID_125_PROTOCOL)
  144. const FuzzerProtocol fuzzer_proto_items[] = {
  145. // EM4100
  146. {
  147. .name = "EM4100",
  148. .data_size = EM4100_DATA_SIZE,
  149. .dict =
  150. {
  151. .val = (const uint8_t*)&uid_list_em4100,
  152. .len = COUNT_OF(uid_list_em4100),
  153. },
  154. },
  155. // HIDProx
  156. {
  157. .name = "HIDProx",
  158. .data_size = HIDProx_DATA_SIZE,
  159. .dict =
  160. {
  161. .val = (const uint8_t*)&uid_list_hid,
  162. .len = COUNT_OF(uid_list_hid),
  163. },
  164. },
  165. // PAC
  166. {
  167. .name = "PAC/Stanley",
  168. .data_size = PAC_DATA_SIZE,
  169. .dict =
  170. {
  171. .val = (const uint8_t*)&uid_list_pac,
  172. .len = COUNT_OF(uid_list_pac),
  173. },
  174. },
  175. // H10301
  176. {
  177. .name = "H10301",
  178. .data_size = H10301_DATA_SIZE,
  179. .dict =
  180. {
  181. .val = (const uint8_t*)&uid_list_h10301,
  182. .len = COUNT_OF(uid_list_h10301),
  183. },
  184. },
  185. };
  186. #else
  187. const FuzzerProtocol fuzzer_proto_items[] = {
  188. // DS1990
  189. {
  190. .name = "DS1990",
  191. .data_size = DS1990_DATA_SIZE,
  192. .dict =
  193. {
  194. .val = (const uint8_t*)&uid_list_ds1990,
  195. .len = COUNT_OF(uid_list_ds1990),
  196. },
  197. },
  198. // Metakom
  199. {
  200. .name = "Metakom",
  201. .data_size = Metakom_DATA_SIZE,
  202. .dict =
  203. {
  204. .val = (const uint8_t*)&uid_list_metakom,
  205. .len = COUNT_OF(uid_list_metakom),
  206. },
  207. },
  208. // Cyfral
  209. {
  210. .name = "Cyfral",
  211. .data_size = Cyfral_DATA_SIZE,
  212. .dict =
  213. {
  214. .val = (const uint8_t*)&uid_list_cyfral,
  215. .len = COUNT_OF(uid_list_cyfral),
  216. },
  217. },
  218. };
  219. #endif
  220. typedef struct {
  221. const char* menu_label;
  222. FuzzerAttackId attack_id;
  223. } FuzzerMenuItems;
  224. const FuzzerMenuItems fuzzer_menu_items[] = {
  225. {"Default Values", FuzzerAttackIdDefaultValues},
  226. #ifdef RFID_125_PROTOCOL
  227. {"BF Customer ID", FuzzerAttackIdBFCustomerID},
  228. #endif
  229. {"Load File", FuzzerAttackIdLoadFile},
  230. {"Load UIDs from file", FuzzerAttackIdLoadFileCustomUids},
  231. };
  232. FuzzerPayload* fuzzer_payload_alloc() {
  233. FuzzerPayload* payload = malloc(sizeof(FuzzerPayload));
  234. payload->data = malloc(sizeof(payload->data[0]) * MAX_PAYLOAD_SIZE);
  235. return payload;
  236. }
  237. void fuzzer_payload_free(FuzzerPayload* payload) {
  238. furi_assert(payload);
  239. if(payload->data) {
  240. free(payload->data);
  241. }
  242. free(payload);
  243. }
  244. const char* fuzzer_proto_get_name(FuzzerProtocolsID index) {
  245. return fuzzer_proto_items[index].name;
  246. }
  247. uint8_t fuzzer_proto_get_count_of_protocols() {
  248. return COUNT_OF(fuzzer_proto_items);
  249. }
  250. uint8_t fuzzer_proto_get_max_data_size() {
  251. return MAX_PAYLOAD_SIZE;
  252. }
  253. uint8_t fuzzer_proto_get_def_emu_time() {
  254. return PROTOCOL_DEF_EMU_TIME;
  255. }
  256. uint8_t fuzzer_proto_get_def_idle_time() {
  257. return PROTOCOL_DEF_IDLE_TIME;
  258. }
  259. const char* fuzzer_proto_get_menu_label(uint8_t index) {
  260. return fuzzer_menu_items[index].menu_label;
  261. }
  262. FuzzerAttackId fuzzer_proto_get_attack_id_by_index(uint8_t index) {
  263. return fuzzer_menu_items[index].attack_id;
  264. }
  265. uint8_t fuzzer_proto_get_count_of_menu_items() {
  266. return COUNT_OF(fuzzer_menu_items);
  267. }