protocol.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  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. #define PARADOX_DATA_SIZE (6)
  75. #define INDALA26_DATA_SIZE (4)
  76. #define VIKING_DATA_SIZE (4)
  77. const uint8_t uid_list_em4100[][EM4100_DATA_SIZE] = {
  78. {0x00, 0x00, 0x00, 0x00, 0x00}, // Null bytes
  79. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, // Only FF
  80. {0x11, 0x11, 0x11, 0x11, 0x11}, // Only 11
  81. {0x22, 0x22, 0x22, 0x22, 0x22}, // Only 22
  82. {0x33, 0x33, 0x33, 0x33, 0x33}, // Only 33
  83. {0x44, 0x44, 0x44, 0x44, 0x44}, // Only 44
  84. {0x55, 0x55, 0x55, 0x55, 0x55}, // Only 55
  85. {0x66, 0x66, 0x66, 0x66, 0x66}, // Only 66
  86. {0x77, 0x77, 0x77, 0x77, 0x77}, // Only 77
  87. {0x88, 0x88, 0x88, 0x88, 0x88}, // Only 88
  88. {0x99, 0x99, 0x99, 0x99, 0x99}, // Only 99
  89. {0x12, 0x34, 0x56, 0x78, 0x9A}, // Incremental UID
  90. {0x9A, 0x78, 0x56, 0x34, 0x12}, // Decremental UID
  91. {0x04, 0xd0, 0x9b, 0x0d, 0x6a}, // From arha
  92. {0x34, 0x00, 0x29, 0x3d, 0x9e}, // From arha
  93. {0x04, 0xdf, 0x00, 0x00, 0x01}, // From arha
  94. {0xCA, 0xCA, 0xCA, 0xCA, 0xCA}, // From arha
  95. };
  96. const uint8_t uid_list_hid[][HIDProx_DATA_SIZE] = {
  97. {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // Null bytes
  98. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, // Only FF
  99. {0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, // Only 11
  100. {0x22, 0x22, 0x22, 0x22, 0x22, 0x22}, // Only 22
  101. {0x33, 0x33, 0x33, 0x33, 0x33, 0x33}, // Only 33
  102. {0x44, 0x44, 0x44, 0x44, 0x44, 0x44}, // Only 44
  103. {0x55, 0x55, 0x55, 0x55, 0x55, 0x55}, // Only 55
  104. {0x66, 0x66, 0x66, 0x66, 0x66, 0x66}, // Only 66
  105. {0x77, 0x77, 0x77, 0x77, 0x77, 0x77}, // Only 77
  106. {0x88, 0x88, 0x88, 0x88, 0x88, 0x88}, // Only 88
  107. {0x99, 0x99, 0x99, 0x99, 0x99, 0x99}, // Only 99
  108. {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC}, // Incremental UID
  109. {0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12}, // Decremental UID
  110. {0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA}, // From arha
  111. };
  112. const uint8_t uid_list_pac[][PAC_DATA_SIZE] = {
  113. {0x00, 0x00, 0x00, 0x00}, // Null bytes
  114. {0xFF, 0xFF, 0xFF, 0xFF}, // Only FF
  115. {0x11, 0x11, 0x11, 0x11}, // Only 11
  116. {0x22, 0x22, 0x22, 0x22}, // Only 22
  117. {0x33, 0x33, 0x33, 0x33}, // Only 33
  118. {0x44, 0x44, 0x44, 0x44}, // Only 44
  119. {0x55, 0x55, 0x55, 0x55}, // Only 55
  120. {0x66, 0x66, 0x66, 0x66}, // Only 66
  121. {0x77, 0x77, 0x77, 0x77}, // Only 77
  122. {0x88, 0x88, 0x88, 0x88}, // Only 88
  123. {0x99, 0x99, 0x99, 0x99}, // Only 99
  124. {0x12, 0x34, 0x56, 0x78}, // Incremental UID
  125. {0x9A, 0x78, 0x56, 0x34}, // Decremental UID
  126. {0x04, 0xd0, 0x9b, 0x0d}, // From arha
  127. {0x34, 0x00, 0x29, 0x3d}, // From arha
  128. {0x04, 0xdf, 0x00, 0x00}, // From arha
  129. {0xCA, 0xCA, 0xCA, 0xCA}, // From arha
  130. };
  131. const uint8_t uid_list_h10301[][H10301_DATA_SIZE] = {
  132. {0x00, 0x00, 0x00}, // Null bytes
  133. {0xFF, 0xFF, 0xFF}, // Only FF
  134. {0x11, 0x11, 0x11}, // Only 11
  135. {0x22, 0x22, 0x22}, // Only 22
  136. {0x33, 0x33, 0x33}, // Only 33
  137. {0x44, 0x44, 0x44}, // Only 44
  138. {0x55, 0x55, 0x55}, // Only 55
  139. {0x66, 0x66, 0x66}, // Only 66
  140. {0x77, 0x77, 0x77}, // Only 77
  141. {0x88, 0x88, 0x88}, // Only 88
  142. {0x99, 0x99, 0x99}, // Only 99
  143. {0x12, 0x34, 0x56}, // Incremental UID
  144. {0x56, 0x34, 0x12}, // Decremental UID
  145. {0xCA, 0xCA, 0xCA}, // From arha
  146. };
  147. const uint8_t uid_list_ioproxxsf[][IOPROXXSF_DATA_SIZE] = {
  148. {0x00, 0x00, 0x00, 0x00}, // Null bytes
  149. {0xFF, 0xFF, 0xFF, 0xFF}, // Only FF
  150. {0x11, 0x11, 0x11, 0x11}, // Only 11
  151. {0x22, 0x22, 0x22, 0x22}, // Only 22
  152. {0x33, 0x33, 0x33, 0x33}, // Only 33
  153. {0x44, 0x44, 0x44, 0x44}, // Only 44
  154. {0x55, 0x55, 0x55, 0x55}, // Only 55
  155. {0x66, 0x66, 0x66, 0x66}, // Only 66
  156. {0x77, 0x77, 0x77, 0x77}, // Only 77
  157. {0x88, 0x88, 0x88, 0x88}, // Only 88
  158. {0x99, 0x99, 0x99, 0x99}, // Only 99
  159. {0x12, 0x34, 0x56, 0x78}, // Incremental UID
  160. {0x9A, 0x78, 0x56, 0x34}, // Decremental UID
  161. {0x04, 0xd0, 0x9b, 0x0d}, // From arha
  162. {0x34, 0x00, 0x29, 0x3d}, // From arha
  163. {0x04, 0xdf, 0x00, 0x00}, // From arha
  164. {0xCA, 0xCA, 0xCA, 0xCA}, // From arha
  165. };
  166. const uint8_t uid_list_paradox[][PARADOX_DATA_SIZE] = {
  167. {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // Null bytes
  168. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, //Only FF
  169. {0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, // Only 11
  170. {0x22, 0x22, 0x22, 0x22, 0x22, 0x22}, // Only 22
  171. {0x33, 0x33, 0x33, 0x33, 0x33, 0x33}, // Only 33
  172. {0x44, 0x44, 0x44, 0x44, 0x44, 0x44}, // Only 44
  173. {0x55, 0x55, 0x55, 0x55, 0x55, 0x55}, //Only 55
  174. {0x66, 0x66, 0x66, 0x66, 0x66, 0x66}, // Only 66
  175. {0x77, 0x77, 0x77, 0x77, 0x77, 0x77}, // Only 77
  176. {0x88, 0x88, 0x88, 0x88, 0x88, 0x88}, // Only 88
  177. {0x99, 0x99, 0x99, 0x99, 0x99, 0x99}, //Only 99
  178. {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC}, // Incremental UID
  179. {0xFF, 0xDE, 0xBC, 0x9A, 0x78, 0x56}, // Decremental UID
  180. {0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA}, // From arha
  181. };
  182. const uint8_t uid_list_indala26[][INDALA26_DATA_SIZE] = {
  183. {0x00, 0x00, 0x00, 0x00}, // Null bytes
  184. {0xFF, 0xFF, 0xFF, 0xFF}, //Only FF
  185. {0x11, 0x11, 0x11, 0x11}, // Only 11
  186. {0x22, 0x22, 0x22, 0x22}, // Only 22
  187. {0x33, 0x33, 0x33, 0x33}, // Only 33
  188. {0x44, 0x44, 0x44, 0x44}, // Only 44
  189. {0x55, 0x55, 0x55, 0x55}, //Only 55
  190. {0x66, 0x66, 0x66, 0x66}, // Only 66
  191. {0x77, 0x77, 0x77, 0x77}, // Only 77
  192. {0x88, 0x88, 0x88, 0x88}, // Only 88
  193. {0x99, 0x99, 0x99, 0x99}, //Only 99
  194. {0x12, 0x34, 0x56, 0x78}, // Incremental UID
  195. {0xFF, 0xDE, 0xBC, 0x9A}, // Decremental UID
  196. {0xCA, 0xCA, 0xCA, 0xCA}, // From arha
  197. };
  198. const uint8_t uid_list_viking[][VIKING_DATA_SIZE] = {
  199. {0x00, 0x00, 0x00, 0x00}, // Null bytes
  200. {0xFF, 0xFF, 0xFF, 0xFF}, //Only FF
  201. {0x11, 0x11, 0x11, 0x11}, // Only 11
  202. {0x22, 0x22, 0x22, 0x22}, // Only 22
  203. {0x33, 0x33, 0x33, 0x33}, // Only 33
  204. {0x44, 0x44, 0x44, 0x44}, // Only 44
  205. {0x55, 0x55, 0x55, 0x55}, //Only 55
  206. {0x66, 0x66, 0x66, 0x66}, // Only 66
  207. {0x77, 0x77, 0x77, 0x77}, // Only 77
  208. {0x88, 0x88, 0x88, 0x88}, // Only 88
  209. {0x99, 0x99, 0x99, 0x99}, //Only 99
  210. {0x12, 0x34, 0x56, 0x78}, // Incremental UID
  211. {0xFF, 0xDE, 0xBC, 0x9A}, // Decremental UID
  212. {0xCA, 0xCA, 0xCA, 0xCA}, // From arha
  213. };
  214. #if defined(RFID_125_PROTOCOL)
  215. const FuzzerProtocol fuzzer_proto_items[] = {
  216. // EM4100
  217. {
  218. .name = "EM4100",
  219. .data_size = EM4100_DATA_SIZE,
  220. .dict =
  221. {
  222. .val = (const uint8_t*)&uid_list_em4100,
  223. .len = COUNT_OF(uid_list_em4100),
  224. },
  225. },
  226. // HIDProx
  227. {
  228. .name = "HIDProx",
  229. .data_size = HIDProx_DATA_SIZE,
  230. .dict =
  231. {
  232. .val = (const uint8_t*)&uid_list_hid,
  233. .len = COUNT_OF(uid_list_hid),
  234. },
  235. },
  236. // PAC
  237. {
  238. .name = "PAC/Stanley",
  239. .data_size = PAC_DATA_SIZE,
  240. .dict =
  241. {
  242. .val = (const uint8_t*)&uid_list_pac,
  243. .len = COUNT_OF(uid_list_pac),
  244. },
  245. },
  246. // H10301
  247. {
  248. .name = "H10301",
  249. .data_size = H10301_DATA_SIZE,
  250. .dict =
  251. {
  252. .val = (const uint8_t*)&uid_list_h10301,
  253. .len = COUNT_OF(uid_list_h10301),
  254. },
  255. },
  256. // IoProxXSF
  257. {
  258. .name = "IoProxXSF",
  259. .data_size = IOPROXXSF_DATA_SIZE,
  260. .dict =
  261. {
  262. .val = (const uint8_t*)&uid_list_ioproxxsf,
  263. .len = COUNT_OF(uid_list_ioproxxsf),
  264. },
  265. },
  266. // Paradox
  267. {
  268. .name = "Paradox",
  269. .data_size = PARADOX_DATA_SIZE,
  270. .dict =
  271. {
  272. .val = (const uint8_t*)&uid_list_paradox,
  273. .len = COUNT_OF(uid_list_paradox),
  274. },
  275. },
  276. // Indala26
  277. {
  278. .name = "Indala26",
  279. .data_size = INDALA26_DATA_SIZE,
  280. .dict =
  281. {
  282. .val = (const uint8_t*)&uid_list_indala26,
  283. .len = COUNT_OF(uid_list_indala26),
  284. },
  285. },
  286. // Viking
  287. {
  288. .name = "Viking",
  289. .data_size = VIKING_DATA_SIZE,
  290. .dict =
  291. {
  292. .val = (const uint8_t*)&uid_list_viking,
  293. .len = COUNT_OF(uid_list_viking),
  294. },
  295. },
  296. };
  297. #else
  298. const FuzzerProtocol fuzzer_proto_items[] = {
  299. // DS1990
  300. {
  301. .name = "DS1990",
  302. .data_size = DS1990_DATA_SIZE,
  303. .dict =
  304. {
  305. .val = (const uint8_t*)&uid_list_ds1990,
  306. .len = COUNT_OF(uid_list_ds1990),
  307. },
  308. },
  309. // Metakom
  310. {
  311. .name = "Metakom",
  312. .data_size = Metakom_DATA_SIZE,
  313. .dict =
  314. {
  315. .val = (const uint8_t*)&uid_list_metakom,
  316. .len = COUNT_OF(uid_list_metakom),
  317. },
  318. },
  319. // Cyfral
  320. {
  321. .name = "Cyfral",
  322. .data_size = Cyfral_DATA_SIZE,
  323. .dict =
  324. {
  325. .val = (const uint8_t*)&uid_list_cyfral,
  326. .len = COUNT_OF(uid_list_cyfral),
  327. },
  328. },
  329. };
  330. #endif
  331. typedef struct {
  332. const char* menu_label;
  333. FuzzerAttackId attack_id;
  334. } FuzzerMenuItems;
  335. const FuzzerMenuItems fuzzer_menu_items[] = {
  336. {"Default Values", FuzzerAttackIdDefaultValues},
  337. #ifdef RFID_125_PROTOCOL
  338. {"BF Customer ID", FuzzerAttackIdBFCustomerID},
  339. #endif
  340. {"Load File", FuzzerAttackIdLoadFile},
  341. {"Load UIDs from file", FuzzerAttackIdLoadFileCustomUids},
  342. };
  343. FuzzerPayload* fuzzer_payload_alloc() {
  344. FuzzerPayload* payload = malloc(sizeof(FuzzerPayload));
  345. payload->data = malloc(sizeof(payload->data[0]) * MAX_PAYLOAD_SIZE);
  346. return payload;
  347. }
  348. void fuzzer_payload_free(FuzzerPayload* payload) {
  349. furi_assert(payload);
  350. if(payload->data) {
  351. free(payload->data);
  352. }
  353. free(payload);
  354. }
  355. const char* fuzzer_proto_get_name(FuzzerProtocolsID index) {
  356. return fuzzer_proto_items[index].name;
  357. }
  358. uint8_t fuzzer_proto_get_count_of_protocols() {
  359. return COUNT_OF(fuzzer_proto_items);
  360. }
  361. uint8_t fuzzer_proto_get_max_data_size() {
  362. return MAX_PAYLOAD_SIZE;
  363. }
  364. uint8_t fuzzer_proto_get_def_emu_time() {
  365. return PROTOCOL_DEF_EMU_TIME;
  366. }
  367. uint8_t fuzzer_proto_get_def_idle_time() {
  368. return PROTOCOL_DEF_IDLE_TIME;
  369. }
  370. const char* fuzzer_proto_get_menu_label(uint8_t index) {
  371. return fuzzer_menu_items[index].menu_label;
  372. }
  373. FuzzerAttackId fuzzer_proto_get_attack_id_by_index(uint8_t index) {
  374. return fuzzer_menu_items[index].attack_id;
  375. }
  376. uint8_t fuzzer_proto_get_count_of_menu_items() {
  377. return COUNT_OF(fuzzer_menu_items);
  378. }