allow setting of UID for special 'chinese' ultralight cards

This commit is contained in:
Adam Laurie 2013-08-31 16:15:27 +01:00
parent f6fff26f0f
commit 07c54cd91b
2 changed files with 17 additions and 5 deletions

View file

@ -20,6 +20,9 @@ Be cautious that some parts of a Ultralight memory can be written only once
and some parts are used as lock bits, so please read the tag documentation and some parts are used as lock bits, so please read the tag documentation
before experimenting too much! before experimenting too much!
To set the UID of a special writeable UID card, edit the first 7 bytes of a dump file and
then write it back, answering 'Y' to the question 'Write UID bytes?'.
.SH OPTIONS .SH OPTIONS
.BR r " | " w .BR r " | " w
Perform read from ( Perform read from (

View file

@ -9,6 +9,7 @@
* Copyright (C) 2012-2013 Ludovic Rousseau * Copyright (C) 2012-2013 Ludovic Rousseau
* See AUTHORS file for a more comprehensive list of contributors. * See AUTHORS file for a more comprehensive list of contributors.
* Additional contributors of this file: * Additional contributors of this file:
* Copyright (C) 2013 Adam Laurie
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
@ -112,11 +113,12 @@ write_card(void)
uint32_t uiBlock = 0; uint32_t uiBlock = 0;
bool bFailure = false; bool bFailure = false;
uint32_t uiWritenPages = 0; uint32_t uiWritenPages = 0;
uint32_t uiSkippedPages; uint32_t uiSkippedPages = 0;
char buffer[BUFSIZ]; char buffer[BUFSIZ];
bool write_otp; bool write_otp;
bool write_lock; bool write_lock;
bool write_uid;
printf("Write OTP bytes ? [yN] "); printf("Write OTP bytes ? [yN] ");
if (!fgets(buffer, BUFSIZ, stdin)) { if (!fgets(buffer, BUFSIZ, stdin)) {
@ -128,13 +130,20 @@ write_card(void)
ERR("Unable to read standard input."); ERR("Unable to read standard input.");
} }
write_lock = ((buffer[0] == 'y') || (buffer[0] == 'Y')); write_lock = ((buffer[0] == 'y') || (buffer[0] == 'Y'));
printf("Write UID bytes (only for special writeable UID cards) ? [yN] ");
if (!fgets(buffer, BUFSIZ, stdin)) {
ERR("Unable to read standard input.");
}
write_uid = ((buffer[0] == 'y') || (buffer[0] == 'Y'));
printf("Writing %d pages |", uiBlocks + 1); printf("Writing %d pages |", uiBlocks + 1);
/* We need to skip 2 first pages. */ /* We may need to skip 2 first pages. */
printf("ss"); if(!write_uid) {
uiSkippedPages = 2; printf("ss");
uiSkippedPages = 2;
}
for (int page = 0x2; page <= 0xF; page++) { for (int page = uiSkippedPages; page <= 0xF; page++) {
if ((page == 0x2) && (!write_lock)) { if ((page == 0x2) && (!write_lock)) {
printf("s"); printf("s");
uiSkippedPages++; uiSkippedPages++;