protocol.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  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. #define IOPROXXSF_DATA_SIZE (4)
  74. const uint8_t uid_list_em4100[][EM4100_DATA_SIZE] = {
  75. {0x00, 0x00, 0x00, 0x00, 0x00}, // Null bytes
  76. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, // Only FF
  77. {0x11, 0x11, 0x11, 0x11, 0x11}, // Only 11
  78. {0x22, 0x22, 0x22, 0x22, 0x22}, // Only 22
  79. {0x33, 0x33, 0x33, 0x33, 0x33}, // Only 33
  80. {0x44, 0x44, 0x44, 0x44, 0x44}, // Only 44
  81. {0x55, 0x55, 0x55, 0x55, 0x55}, // Only 55
  82. {0x66, 0x66, 0x66, 0x66, 0x66}, // Only 66
  83. {0x77, 0x77, 0x77, 0x77, 0x77}, // Only 77
  84. {0x88, 0x88, 0x88, 0x88, 0x88}, // Only 88
  85. {0x99, 0x99, 0x99, 0x99, 0x99}, // Only 99
  86. {0x12, 0x34, 0x56, 0x78, 0x9A}, // Incremental UID
  87. {0x9A, 0x78, 0x56, 0x34, 0x12}, // Decremental UID
  88. {0x04, 0xd0, 0x9b, 0x0d, 0x6a}, // From arha
  89. {0x34, 0x00, 0x29, 0x3d, 0x9e}, // From arha
  90. {0x04, 0xdf, 0x00, 0x00, 0x01}, // From arha
  91. {0xCA, 0xCA, 0xCA, 0xCA, 0xCA}, // From arha
  92. };
  93. const uint8_t uid_list_hid[][HIDProx_DATA_SIZE] = {
  94. {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // Null bytes
  95. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, // Only FF
  96. {0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, // Only 11
  97. {0x22, 0x22, 0x22, 0x22, 0x22, 0x22}, // Only 22
  98. {0x33, 0x33, 0x33, 0x33, 0x33, 0x33}, // Only 33
  99. {0x44, 0x44, 0x44, 0x44, 0x44, 0x44}, // Only 44
  100. {0x55, 0x55, 0x55, 0x55, 0x55, 0x55}, // Only 55
  101. {0x66, 0x66, 0x66, 0x66, 0x66, 0x66}, // Only 66
  102. {0x77, 0x77, 0x77, 0x77, 0x77, 0x77}, // Only 77
  103. {0x88, 0x88, 0x88, 0x88, 0x88, 0x88}, // Only 88
  104. {0x99, 0x99, 0x99, 0x99, 0x99, 0x99}, // Only 99
  105. {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC}, // Incremental UID
  106. {0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12}, // Decremental UID
  107. {0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA}, // From arha
  108. };
  109. const uint8_t uid_list_pac[][PAC_DATA_SIZE] = {
  110. {0x00, 0x00, 0x00, 0x00}, // Null bytes
  111. {0xFF, 0xFF, 0xFF, 0xFF}, // Only FF
  112. {0x11, 0x11, 0x11, 0x11}, // Only 11
  113. {0x22, 0x22, 0x22, 0x22}, // Only 22
  114. {0x33, 0x33, 0x33, 0x33}, // Only 33
  115. {0x44, 0x44, 0x44, 0x44}, // Only 44
  116. {0x55, 0x55, 0x55, 0x55}, // Only 55
  117. {0x66, 0x66, 0x66, 0x66}, // Only 66
  118. {0x77, 0x77, 0x77, 0x77}, // Only 77
  119. {0x88, 0x88, 0x88, 0x88}, // Only 88
  120. {0x99, 0x99, 0x99, 0x99}, // Only 99
  121. {0x12, 0x34, 0x56, 0x78}, // Incremental UID
  122. {0x9A, 0x78, 0x56, 0x34}, // Decremental UID
  123. {0x04, 0xd0, 0x9b, 0x0d}, // From arha
  124. {0x34, 0x00, 0x29, 0x3d}, // From arha
  125. {0x04, 0xdf, 0x00, 0x00}, // From arha
  126. {0xCA, 0xCA, 0xCA, 0xCA}, // From arha
  127. };
  128. const uint8_t uid_list_h10301[][H10301_DATA_SIZE] = {
  129. {0x00, 0x00, 0x00}, // Null bytes
  130. {0xFF, 0xFF, 0xFF}, // Only FF
  131. {0x11, 0x11, 0x11}, // Only 11
  132. {0x22, 0x22, 0x22}, // Only 22
  133. {0x33, 0x33, 0x33}, // Only 33
  134. {0x44, 0x44, 0x44}, // Only 44
  135. {0x55, 0x55, 0x55}, // Only 55
  136. {0x66, 0x66, 0x66}, // Only 66
  137. {0x77, 0x77, 0x77}, // Only 77
  138. {0x88, 0x88, 0x88}, // Only 88
  139. {0x99, 0x99, 0x99}, // Only 99
  140. {0x12, 0x34, 0x56}, // Incremental UID
  141. {0x56, 0x34, 0x12}, // Decremental UID
  142. {0xCA, 0xCA, 0xCA}, // From arha
  143. };
  144. const uint8_t uid_list_ioproxxsf[][IOPROXXSF_DATA_SIZE] = {
  145. {0x00, 0x00, 0x00, 0x00}, // Null bytes
  146. {0xFF, 0xFF, 0xFF, 0xFF}, // Only FF
  147. {0x11, 0x11, 0x11, 0x11}, // Only 11
  148. {0x22, 0x22, 0x22, 0x22}, // Only 22
  149. {0x33, 0x33, 0x33, 0x33}, // Only 33
  150. {0x44, 0x44, 0x44, 0x44}, // Only 44
  151. {0x55, 0x55, 0x55, 0x55}, // Only 55
  152. {0x66, 0x66, 0x66, 0x66}, // Only 66
  153. {0x77, 0x77, 0x77, 0x77}, // Only 77
  154. {0x88, 0x88, 0x88, 0x88}, // Only 88
  155. {0x99, 0x99, 0x99, 0x99}, // Only 99
  156. {0x12, 0x34, 0x56, 0x78}, // Incremental UID
  157. {0x9A, 0x78, 0x56, 0x34}, // Decremental UID
  158. {0x04, 0xd0, 0x9b, 0x0d}, // From arha
  159. {0x34, 0x00, 0x29, 0x3d}, // From arha
  160. {0x04, 0xdf, 0x00, 0x00}, // From arha
  161. {0xCA, 0xCA, 0xCA, 0xCA}, // From arha
  162. };
  163. #if defined(RFID_125_PROTOCOL)
  164. const FuzzerProtocol fuzzer_proto_items[] = {
  165. // EM4100
  166. {
  167. .name = "EM4100",
  168. .data_size = EM4100_DATA_SIZE,
  169. .dict =
  170. {
  171. .val = (const uint8_t*)&uid_list_em4100,
  172. .len = COUNT_OF(uid_list_em4100),
  173. },
  174. },
  175. // HIDProx
  176. {
  177. .name = "HIDProx",
  178. .data_size = HIDProx_DATA_SIZE,
  179. .dict =
  180. {
  181. .val = (const uint8_t*)&uid_list_hid,
  182. .len = COUNT_OF(uid_list_hid),
  183. },
  184. },
  185. // PAC
  186. {
  187. .name = "PAC/Stanley",
  188. .data_size = PAC_DATA_SIZE,
  189. .dict =
  190. {
  191. .val = (const uint8_t*)&uid_list_pac,
  192. .len = COUNT_OF(uid_list_pac),
  193. },
  194. },
  195. // H10301
  196. {
  197. .name = "H10301",
  198. .data_size = H10301_DATA_SIZE,
  199. .dict =
  200. {
  201. .val = (const uint8_t*)&uid_list_h10301,
  202. .len = COUNT_OF(uid_list_h10301),
  203. },
  204. },
  205. // IoProxXSF
  206. {
  207. .name = "IoProxXSF",
  208. .data_size = IOPROXXSF_DATA_SIZE,
  209. .dict =
  210. {
  211. .val = (const uint8_t*)&uid_list_ioproxxsf,
  212. .len = COUNT_OF(uid_list_ioproxxsf),
  213. },
  214. },
  215. };
  216. #else
  217. const FuzzerProtocol fuzzer_proto_items[] = {
  218. // DS1990
  219. {
  220. .name = "DS1990",
  221. .data_size = DS1990_DATA_SIZE,
  222. .dict =
  223. {
  224. .val = (const uint8_t*)&uid_list_ds1990,
  225. .len = COUNT_OF(uid_list_ds1990),
  226. },
  227. },
  228. // Metakom
  229. {
  230. .name = "Metakom",
  231. .data_size = Metakom_DATA_SIZE,
  232. .dict =
  233. {
  234. .val = (const uint8_t*)&uid_list_metakom,
  235. .len = COUNT_OF(uid_list_metakom),
  236. },
  237. },
  238. // Cyfral
  239. {
  240. .name = "Cyfral",
  241. .data_size = Cyfral_DATA_SIZE,
  242. .dict =
  243. {
  244. .val = (const uint8_t*)&uid_list_cyfral,
  245. .len = COUNT_OF(uid_list_cyfral),
  246. },
  247. },
  248. };
  249. #endif
  250. typedef struct {
  251. const char* menu_label;
  252. FuzzerAttackId attack_id;
  253. } FuzzerMenuItems;
  254. const FuzzerMenuItems fuzzer_menu_items[] = {
  255. {"Default Values", FuzzerAttackIdDefaultValues},
  256. #ifdef RFID_125_PROTOCOL
  257. {"BF Customer ID", FuzzerAttackIdBFCustomerID},
  258. #endif
  259. {"Load File", FuzzerAttackIdLoadFile},
  260. {"Load UIDs from file", FuzzerAttackIdLoadFileCustomUids},
  261. };
  262. FuzzerPayload* fuzzer_payload_alloc() {
  263. FuzzerPayload* payload = malloc(sizeof(FuzzerPayload));
  264. payload->data = malloc(sizeof(payload->data[0]) * MAX_PAYLOAD_SIZE);
  265. return payload;
  266. }
  267. void fuzzer_payload_free(FuzzerPayload* payload) {
  268. furi_assert(payload);
  269. if(payload->data) {
  270. free(payload->data);
  271. }
  272. free(payload);
  273. }
  274. const char* fuzzer_proto_get_name(FuzzerProtocolsID index) {
  275. return fuzzer_proto_items[index].name;
  276. }
  277. uint8_t fuzzer_proto_get_count_of_protocols() {
  278. return COUNT_OF(fuzzer_proto_items);
  279. }
  280. uint8_t fuzzer_proto_get_max_data_size() {
  281. return MAX_PAYLOAD_SIZE;
  282. }
  283. uint8_t fuzzer_proto_get_def_emu_time() {
  284. return PROTOCOL_DEF_EMU_TIME;
  285. }
  286. uint8_t fuzzer_proto_get_def_idle_time() {
  287. return PROTOCOL_DEF_IDLE_TIME;
  288. }
  289. const char* fuzzer_proto_get_menu_label(uint8_t index) {
  290. return fuzzer_menu_items[index].menu_label;
  291. }
  292. FuzzerAttackId fuzzer_proto_get_attack_id_by_index(uint8_t index) {
  293. return fuzzer_menu_items[index].attack_id;
  294. }
  295. uint8_t fuzzer_proto_get_count_of_menu_items() {
  296. return COUNT_OF(fuzzer_menu_items);
  297. }