mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-20 21:33:47 -07:00
initial working for single node
This commit is contained in:
parent
90d766a811
commit
83c54bb174
3 changed files with 77 additions and 3 deletions
|
@ -531,6 +531,28 @@ int send_rd_plain(uint8_t flags, uint16_t datalen, uint8_t *data, bool verbose,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a dump_service frame to the pm3 and prints response.
|
||||||
|
* @param flags to use for pm3 communication.
|
||||||
|
* @param datalen frame length.
|
||||||
|
* @param data frame to be send.
|
||||||
|
* @param verbose display additional output.
|
||||||
|
* @param dump_sv_resp frame in which the response will be saved.
|
||||||
|
* @param is_area true if the service is an area, false if it is a service.
|
||||||
|
* @return success if response was received.
|
||||||
|
*/
|
||||||
|
int send_dump_sv_plain(uint8_t flags, uint16_t datalen, uint8_t *data, bool verbose, felica_service_dump_response_t *dump_sv_resp, bool is_area) {
|
||||||
|
clear_and_send_command(flags, datalen, data, verbose);
|
||||||
|
PacketResponseNG resp;
|
||||||
|
if (waitCmdFelica(false, &resp, verbose) == false) {
|
||||||
|
PrintAndLogEx(ERR, "No response from card");
|
||||||
|
return PM3_ERFTRANS;
|
||||||
|
} else {
|
||||||
|
memcpy(dump_sv_resp, (felica_service_dump_response_t *)resp.data.asBytes, sizeof(felica_service_dump_response_t));
|
||||||
|
return PM3_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if last known card can be added to data and adds it if possible.
|
* Checks if last known card can be added to data and adds it if possible.
|
||||||
* @param custom_IDm
|
* @param custom_IDm
|
||||||
|
@ -1743,18 +1765,64 @@ static int CmdHFFelicaRequestService(const char *Cmd) {
|
||||||
return PM3_SUCCESS;
|
return PM3_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int CmdHFFelicaNotImplementedYet(const char *Cmd) {
|
static int CmdHFFelicaDumpServiceArea(const char *Cmd) {
|
||||||
CLIParserContext *ctx;
|
CLIParserContext *ctx;
|
||||||
CLIParserInit(&ctx, "hf felica scsvcode",
|
CLIParserInit(&ctx, "hf felica scsvcode",
|
||||||
"Feature not implemented yet. Feel free to contribute!",
|
"Dump all existing Area Code and Service Code.\n",
|
||||||
"hf felica scsvcode"
|
"hf felica scsvcode"
|
||||||
);
|
);
|
||||||
void *argtable[] = {
|
void *argtable[] = {
|
||||||
arg_param_begin,
|
arg_param_begin,
|
||||||
arg_param_end
|
arg_param_end
|
||||||
};
|
};
|
||||||
CLIExecWithReturn(ctx, Cmd, argtable, false);
|
|
||||||
|
CLIExecWithReturn(ctx, Cmd, argtable, true);
|
||||||
CLIParserFree(ctx);
|
CLIParserFree(ctx);
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t data[PM3_CMD_DATA_SIZE];
|
||||||
|
memset(data, 0, sizeof(data));
|
||||||
|
data[0] = 0x0C; // Static length
|
||||||
|
data[1] = 0x0A; // Command ID
|
||||||
|
|
||||||
|
uint16_t datalen = 12; // Length (1), Command ID (1), IDm (8), Cursor Node (2)
|
||||||
|
if (check_last_idm(data, datalen) == false) {
|
||||||
|
return PM3_EINVARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t flags = (FELICA_APPEND_CRC | FELICA_RAW);
|
||||||
|
|
||||||
|
// for each cursor stuff RFU
|
||||||
|
data[10] = 0x00; // Cursor Node
|
||||||
|
data[11] = 0x00; // Cursor Node
|
||||||
|
|
||||||
|
AddCrc(data, datalen);
|
||||||
|
|
||||||
|
felica_service_dump_response_t dump_sv_resp;
|
||||||
|
bool is_area = false;
|
||||||
|
|
||||||
|
if ((send_dump_sv_plain(flags, datalen + 2, data, 0, &dump_sv_resp, is_area) == PM3_SUCCESS)) {
|
||||||
|
if (dump_sv_resp.frame_response.cmd_code[0] != 0x0B) {
|
||||||
|
PrintAndLogEx(ERR, "Return command wrong. \nExpected 0x0B, got 0x%02X", dump_sv_resp.frame_response.cmd_code[0]);
|
||||||
|
return PM3_ERFTRANS;
|
||||||
|
} else {
|
||||||
|
if (dump_sv_resp.frame_response.length[0] == 0x0C) {
|
||||||
|
// service code read
|
||||||
|
PrintAndLogEx(SUCCESS, "Service Code Read 0x%02X%02X", dump_sv_resp.payload[0], dump_sv_resp.payload[1]);
|
||||||
|
} else if (dump_sv_resp.frame_response.length[0] == 0x0E) {
|
||||||
|
// service code read with area (this current parsing is wrong.)
|
||||||
|
PrintAndLogEx(SUCCESS, "Service Code Read 0x%02X%02X Area 0x%02X%02X", dump_sv_resp.payload[0], dump_sv_resp.payload[1], dump_sv_resp.payload[2], dump_sv_resp.payload[3]);
|
||||||
|
} else {
|
||||||
|
PrintAndLogEx(ERR, "Something went wrong, check your card");
|
||||||
|
return PM3_ERFTRANS;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
PrintAndLogEx(ERR, "Something went wrong, check your card");
|
||||||
|
return PM3_ERFTRANS;
|
||||||
|
}
|
||||||
|
|
||||||
return PM3_SUCCESS;
|
return PM3_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,5 +26,6 @@ int CmdHFFelica(const char *Cmd);
|
||||||
int read_felica_uid(bool loop, bool verbose);
|
int read_felica_uid(bool loop, bool verbose);
|
||||||
int send_request_service(uint8_t flags, uint16_t datalen, uint8_t *data, bool verbose);
|
int send_request_service(uint8_t flags, uint16_t datalen, uint8_t *data, bool verbose);
|
||||||
int send_rd_plain(uint8_t flags, uint16_t datalen, uint8_t *data, bool verbose, felica_read_without_encryption_response_t *rd_noCry_resp);
|
int send_rd_plain(uint8_t flags, uint16_t datalen, uint8_t *data, bool verbose, felica_read_without_encryption_response_t *rd_noCry_resp);
|
||||||
|
int send_dump_sv_plain(uint8_t flags, uint16_t datalen, uint8_t *data, bool verbose, felica_service_dump_response_t *dump_sv_resp, bool is_area);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -124,4 +124,9 @@ typedef struct {
|
||||||
uint8_t PMi[8];
|
uint8_t PMi[8];
|
||||||
} PACKED felica_auth2_response_t;
|
} PACKED felica_auth2_response_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
felica_frame_response_t frame_response;
|
||||||
|
uint8_t payload[4];
|
||||||
|
} PACKED felica_service_dump_response_t;
|
||||||
|
|
||||||
#endif // _ISO18_H_
|
#endif // _ISO18_H_
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue