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)
|
||||
core.clearCommandBuffer()
|
||||
print("Sent a UsbCommand via read14a.lua.")
|
||||
local err = core.SendCommand(command:getBytes())
|
||||
if err then
|
||||
print(err)
|
||||
|
@ -88,13 +89,14 @@ local function sendToDevice(command, ignoreresponse)
|
|||
if ignoreresponse then return nil,nil end
|
||||
|
||||
local response = core.WaitForResponseTimeout(cmds.CMD_ACK,TIMEOUT)
|
||||
print("Received a UsbCommand packet in read14a.lua.")
|
||||
return response,nil
|
||||
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 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
|
||||
local function read14443a(dont_disconnect, no_rats)
|
||||
local command, result, info, err, data
|
||||
|
@ -109,6 +111,7 @@ local function read14443a(dont_disconnect, no_rats)
|
|||
end
|
||||
local result,err = sendToDevice(command)
|
||||
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)
|
||||
if arg0 == 0 then
|
||||
return nil, "iso14443a card select failed"
|
||||
|
@ -141,6 +144,8 @@ local function waitFor14443a()
|
|||
end
|
||||
|
||||
local library = {
|
||||
read14443a = read14443a,
|
||||
read = read14443a,
|
||||
read14443a = read14443a,
|
||||
read = read14443a,
|
||||
waitFor14443a = waitFor14443a,
|
||||
|
|
|
@ -102,6 +102,38 @@ static int l_WaitForResponseTimeout(lua_State *L){
|
|||
|
||||
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
|
||||
lua_pushlstring(L,(const char *)&response,sizeof(UsbCommand));
|
||||
|
||||
|
@ -109,6 +141,7 @@ static int l_WaitForResponseTimeout(lua_State *L){
|
|||
}else{
|
||||
//Push a Nil instead
|
||||
lua_pushnil(L);
|
||||
printf("Nil pushed back to Lua script - no response received.\n");
|
||||
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