]>
cvs.zerfleddert.de Git - proxmark3-svn/blob - client/scripting.c
edaa926c73a0a5d4b7077143af0b0e42773a1b09
   1 //----------------------------------------------------------------------------- 
   2 // Copyright (C) 2013 m h swende <martin at swende.se> 
   4 // This code is licensed to you under the terms of the GNU GPL, version 2 or, 
   5 // at your option, any later version. See the LICENSE.txt file for the text of 
   7 //----------------------------------------------------------------------------- 
   8 // Some lua scripting glue to proxmark core. 
   9 //----------------------------------------------------------------------------- 
  14 #include "proxmark3.h" 
  17 #include "scripting.h" 
  20  * The following params expected: 
  26 static int l_SendCommand(lua_State 
*L
){ 
  30      The SendCommand (native) expects the following structure: 
  33       uint64_t cmd; //8 bytes 
  34       uint64_t arg[3]; // 8*3 bytes = 24 bytes 
  36         uint8_t  asBytes[USB_CMD_DATA_SIZE]; // 1 byte * 512 = 512 bytes (OR) 
  37         uint32_t asDwords[USB_CMD_DATA_SIZE/4]; // 4 byte * 128 = 512 bytes 
  41     ==> A 544 byte buffer will do. 
  45     const char *data 
= luaL_checklstring(L
, 1, &size
); 
  46     if(size 
!= sizeof(UsbCommand
)) 
  48         printf("Got data size %d, expected %d" , (int) size
,(int) sizeof(UsbCommand
)); 
  49         lua_pushstring(L
,"Wrong data size"); 
  53 //    UsbCommand c = (*data); 
  55     return 0; // no return values 
  58  * @brief The following params expected: 
  64 static int l_WaitForResponseTimeout(lua_State 
*L
){ 
  67     size_t ms_timeout 
= -1; 
  69     //Check number of arguments 
  70     int n 
= lua_gettop(L
); 
  73         //signal error by returning Nil, errorstring 
  75         lua_pushstring(L
,"You need to supply at least command to wait for"); 
  76         return 2; // two return values 
  81         cmd 
= luaL_checkunsigned(L
,1); 
  85         //Did the user send a timeout ? 
  86         //Check if the current top of stack is an integer 
  87         ms_timeout 
= luaL_checkunsigned(L
,2); 
  88         //printf("Timeout set to %dms\n" , (int) ms_timeout); 
  93     if(WaitForResponseTimeout(cmd
, &response
, ms_timeout
)) 
  96          lua_pushlstring(L
,&response
,sizeof(UsbCommand
)); 
  98         return 1;// return 1 to signal one return value 
 102         return 1;// one return value 
 105 static int l_nonce2key(lua_State 
*L
){ return CmdHF14AMfRdSc(luaL_checkstring(L
, 1));} 
 106 static int l_PrintAndLog(lua_State 
*L
){ return CmdHF14AMfDump(luaL_checkstring(L
, 1));} 
 107 static int l_clearCommandBuffer(lua_State 
*L
){ 
 108     clearCommandBuffer(); 
 111  * @brief l_foobar is a dummy function to test lua-integration with 
 115 static int l_foobar(lua_State 
*L
) 
 117     //Check number of arguments 
 118     int n 
= lua_gettop(L
); 
 119     printf("foobar called with %d arguments" , n
); 
 121     printf("Arguments discarded, stack now contains %d elements", lua_gettop(L
)); 
 122     UsbCommand response 
=  {CMD_MIFARE_READBL
, {1337, 1338, 1339}}; 
 123     printf("Now returning a UsbCommand as a string"); 
 124     lua_pushlstring(L
,&response
,sizeof(UsbCommand
)); 
 129  * @brief Utility to check if a key has been pressed by the user. This method does not block. 
 131  * @return boolean, true if kbhit, false otherwise. 
 133 static int l_ukbhit(lua_State 
*L
) 
 135     lua_pushboolean(L
,ukbhit() ? true : false); 
 139 int set_pm3_libraries(lua_State 
*L
) 
 141     static const luaL_Reg libs
[] = { 
 142         {"SendCommand",                 l_SendCommand
}, 
 143         {"WaitForResponseTimeout",      l_WaitForResponseTimeout
}, 
 144         {"nonce2key",                   l_nonce2key
}, 
 145         {"PrintAndLog",                 l_PrintAndLog
}, 
 146         {"foobar",                      l_foobar
}, 
 147         {"ukbhit",                      l_ukbhit
}, 
 148         {"clearCommandBuffer",          l_clearCommandBuffer
}, 
 152     lua_pushglobaltable(L
); 
 153     // Core library is in this table. Contains ' 
 154     //this is 'pm3' table 
 157     //Put the function into the hash table. 
 158     for (int i 
= 0; libs
[i
].name
; i
++) { 
 159         lua_pushcfunction(L
, libs
[i
].func
); 
 160         lua_setfield(L
, -2, libs
[i
].name
);//set the name, pop stack 
 163     lua_setfield(L
, -2, "core"); 
 165     //-- remove the global environment table from the stack