mirror of
https://github.com/Proxmark/proxmark3.git
synced 2025-08-22 06:13:27 -07:00
successfully receiving raw packet responses being sent from the Proxmark to the Lua code.
This commit is contained in:
parent
e069547c27
commit
d4c01572c7
3 changed files with 124 additions and 2 deletions
|
@ -80,6 +80,7 @@ end
|
||||||
|
|
||||||
local function sendToDevice(command, ignoreresponse)
|
local function sendToDevice(command, ignoreresponse)
|
||||||
core.clearCommandBuffer()
|
core.clearCommandBuffer()
|
||||||
|
print("Sent a UsbCommand via read14a.lua.")
|
||||||
local err = core.SendCommand(command:getBytes())
|
local err = core.SendCommand(command:getBytes())
|
||||||
if err then
|
if err then
|
||||||
print(err)
|
print(err)
|
||||||
|
@ -88,13 +89,14 @@ local function sendToDevice(command, ignoreresponse)
|
||||||
if ignoreresponse then return nil,nil end
|
if ignoreresponse then return nil,nil end
|
||||||
|
|
||||||
local response = core.WaitForResponseTimeout(cmds.CMD_ACK,TIMEOUT)
|
local response = core.WaitForResponseTimeout(cmds.CMD_ACK,TIMEOUT)
|
||||||
|
print("Received a UsbCommand packet in read14a.lua.")
|
||||||
return response,nil
|
return response,nil
|
||||||
end
|
end
|
||||||
|
|
||||||
-- This function does a connect and retrieves som einfo
|
-- This function does a connect and retrieves some info
|
||||||
-- @param dont_disconnect - if true, does not disable the field
|
-- @param dont_disconnect - if true, does not disable the field
|
||||||
-- @param no_rats - if true, skips ISO14443-4 select (RATS)
|
-- @param no_rats - if true, skips ISO14443-4 select (RATS)
|
||||||
-- @return if successfull: an table containing card info
|
-- @return if successfull: a table containing card info
|
||||||
-- @return if unsuccessfull : nil, error
|
-- @return if unsuccessfull : nil, error
|
||||||
local function read14443a(dont_disconnect, no_rats)
|
local function read14443a(dont_disconnect, no_rats)
|
||||||
local command, result, info, err, data
|
local command, result, info, err, data
|
||||||
|
@ -109,6 +111,7 @@ local function read14443a(dont_disconnect, no_rats)
|
||||||
end
|
end
|
||||||
local result,err = sendToDevice(command)
|
local result,err = sendToDevice(command)
|
||||||
if result then
|
if result then
|
||||||
|
print("Currently trying to decode the UsbCommand packet just received (an ACK of the connection).")
|
||||||
local count,cmd,arg0,arg1,arg2 = bin.unpack('LLLL',result)
|
local count,cmd,arg0,arg1,arg2 = bin.unpack('LLLL',result)
|
||||||
if arg0 == 0 then
|
if arg0 == 0 then
|
||||||
return nil, "iso14443a card select failed"
|
return nil, "iso14443a card select failed"
|
||||||
|
@ -143,6 +146,8 @@ end
|
||||||
local library = {
|
local library = {
|
||||||
read14443a = read14443a,
|
read14443a = read14443a,
|
||||||
read = read14443a,
|
read = read14443a,
|
||||||
|
read14443a = read14443a,
|
||||||
|
read = read14443a,
|
||||||
waitFor14443a = waitFor14443a,
|
waitFor14443a = waitFor14443a,
|
||||||
parse14443a = parse14443a,
|
parse14443a = parse14443a,
|
||||||
sendToDevice = sendToDevice,
|
sendToDevice = sendToDevice,
|
||||||
|
|
|
@ -102,6 +102,38 @@ static int l_WaitForResponseTimeout(lua_State *L){
|
||||||
|
|
||||||
if(WaitForResponseTimeout(cmd, &response, ms_timeout))
|
if(WaitForResponseTimeout(cmd, &response, ms_timeout))
|
||||||
{
|
{
|
||||||
|
//BEGIN ADDED CODE
|
||||||
|
uint8_t *recv;
|
||||||
|
char *hexout;
|
||||||
|
recv = response.d.asBytes;
|
||||||
|
uint8_t iLen = response.arg[0];
|
||||||
|
if (0){
|
||||||
|
iLen = response.arg[1];
|
||||||
|
if (iLen){
|
||||||
|
PrintAndLog("Card selected. UID[%i]:", iLen);
|
||||||
|
} else {
|
||||||
|
PrintAndLog("Can't select card.");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
PrintAndLog("received %i bytes:", iLen);
|
||||||
|
}
|
||||||
|
if(!iLen)
|
||||||
|
return 1;
|
||||||
|
hexout = (char *)malloc(iLen * 3 + 1);
|
||||||
|
if (hexout != NULL) {
|
||||||
|
for (int i = 0; i < iLen; i++) { // data in hex
|
||||||
|
sprintf(&hexout[i * 3], "%02X ", recv[i]);
|
||||||
|
}
|
||||||
|
PrintAndLog("%s", hexout);
|
||||||
|
free(hexout);
|
||||||
|
} else {
|
||||||
|
PrintAndLog("malloc failed your client has low memory?");
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
printf("Command response just sent back to Lua script with the bytes which were just printed. Should get sent to read14a.lua.\n");
|
||||||
|
//END ADDED CODE
|
||||||
|
|
||||||
|
|
||||||
//Push it as a string
|
//Push it as a string
|
||||||
lua_pushlstring(L,(const char *)&response,sizeof(UsbCommand));
|
lua_pushlstring(L,(const char *)&response,sizeof(UsbCommand));
|
||||||
|
|
||||||
|
@ -109,6 +141,7 @@ static int l_WaitForResponseTimeout(lua_State *L){
|
||||||
}else{
|
}else{
|
||||||
//Push a Nil instead
|
//Push a Nil instead
|
||||||
lua_pushnil(L);
|
lua_pushnil(L);
|
||||||
|
printf("Nil pushed back to Lua script - no response received.\n");
|
||||||
return 1;// one return value
|
return 1;// one return value
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
84
client/scripts/myscript.lua
Normal file
84
client/scripts/myscript.lua
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
local cmds = require('commands')
|
||||||
|
local lib14a = require('read14a')
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
-- This is only meant to be used when errors occur
|
||||||
|
function oops(err)
|
||||||
|
print("ERROR: ",err)
|
||||||
|
end
|
||||||
|
|
||||||
|
function sendRaw(rawdata, crc)
|
||||||
|
print(">> ", rawdata)
|
||||||
|
|
||||||
|
-- if crc
|
||||||
|
-- then local flags = lib14a.ISO14A_COMMAND.ISO14A_NO_DISCONNECT + lib14a.ISO14A_COMMAND.ISO14A_RAW
|
||||||
|
-- else local flags = lib14a.ISO14A_COMMAND.ISO14A_NO_DISCONNECT + lib14a.ISO14A_COMMAND.ISO14A_RAW + lib14a.ISO14A_APPEND_CRC
|
||||||
|
-- end
|
||||||
|
|
||||||
|
local flags = lib14a.ISO14A_COMMAND.ISO14A_NO_DISCONNECT + lib14a.ISO14A_COMMAND.ISO14A_RAW + lib14a.ISO14A_COMMAND.ISO14A_APPEND_CRC
|
||||||
|
|
||||||
|
-- local flags = lib14a.ISO14A_COMMAND.ISO14A_NO_DISCONNECT + lib14a.ISO14A_COMMAND.ISO14A_RAW
|
||||||
|
|
||||||
|
local command = Command:new{cmd = cmds.CMD_READER_ISO_14443a,
|
||||||
|
arg1 = flags, -- Send raw
|
||||||
|
arg2 = string.len(rawdata) / 2, -- arg2 contains the length, which is half the length of the ASCII-string rawdata
|
||||||
|
data = rawdata}
|
||||||
|
local ignore_response = false
|
||||||
|
return lib14a.sendToDevice(command, ignore_response)
|
||||||
|
end
|
||||||
|
|
||||||
|
---
|
||||||
|
-- The main entry point
|
||||||
|
function main(args)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- Manually send the card the init commands
|
||||||
|
-- firstcommand = Command:new{cmd = cmds.CMD_READER_ISO_14443a,
|
||||||
|
-- arg1 = lib14a.ISO14A_COMMAND.ISO14A_CONNECT + lib14a.ISO14A_COMMAND.ISO14A_NO_DISCONNECT,
|
||||||
|
-- arg2 = 0,
|
||||||
|
-- data = ""}
|
||||||
|
-- local restwo,errtwo = lib14a.sendToDevice(firstcommand)
|
||||||
|
-- print(firstcommand.arg1)
|
||||||
|
|
||||||
|
-- Call the program via the command line
|
||||||
|
-- result = core.console("hf 14a raw -p -b 7 -a 26") --I can do this from the command line, but I can't capture the output easily
|
||||||
|
-- print(result)
|
||||||
|
|
||||||
|
-- Send the card the init commands using the read14a library, reusing the connect functionality from a common library
|
||||||
|
info,err = lib14a.read14443a(true, no_rats)
|
||||||
|
if err
|
||||||
|
then oops(err)
|
||||||
|
else print(("Connected to card with a UID of %s"):format(info.uid))
|
||||||
|
end
|
||||||
|
|
||||||
|
--Attempt to send raw data
|
||||||
|
getvers = "0360" -- 0x0360 should begin the "get version" commands
|
||||||
|
--print(string.byte(getvers, 1, 99999))
|
||||||
|
--crc = core.crc16(getvers) -- under the hood, calls ComputeCrc14443, which is the same function which is called by "hf 14a raw"
|
||||||
|
--print(string.byte(crc, 1, 99999))
|
||||||
|
|
||||||
|
local result,err = sendRaw(getvers, true)
|
||||||
|
if result then
|
||||||
|
print("Currently trying to decode raw UsbCommand packet received.")
|
||||||
|
print(result)
|
||||||
|
|
||||||
|
local count,cmd,arg1,arg2,arg3,data = bin.unpack('LLLLH512',result)
|
||||||
|
print(data)
|
||||||
|
--data = string.sub(result,count)
|
||||||
|
--local cmd_response = Command.parse(res)
|
||||||
|
else
|
||||||
|
err ="No response from card"
|
||||||
|
end
|
||||||
|
-- local cmd_response = Command.parse(res)
|
||||||
|
-- local len = tonumber(cmd_response.arg1) *2
|
||||||
|
-- print("data length:",len)
|
||||||
|
-- local data = string.sub(tostring(cmd_response.data), 0, len);
|
||||||
|
-- print("<< ",data)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
main(args) -- Call the main function
|
Loading…
Add table
Add a link
Reference in a new issue