]>
cvs.zerfleddert.de Git - proxmark3-svn/blob - client/cmdscript.c
e4666dbf20295ada06517b330e41d4c694988eb6
   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 //----------------------------------------------------------------------------- 
  15 #include <sys/types.h> 
  18 #include "proxmark3.h" 
  19 #include "scripting.h" 
  23 #include "cmdparser.h" 
  25 #include "cmdscript.h" 
  27 #include "pm3_binlib.h" 
  34 static int CmdHelp(const char *Cmd
); 
  35 static int CmdList(const char *Cmd
); 
  36 static int CmdRun(const char *Cmd
); 
  38 command_t CommandTable
[] = 
  40   {"help",  CmdHelp
, 1, "This help"}, 
  41   {"list",  CmdList
, 1, "List available scripts"}, 
  42   {"run",   CmdRun
,  1, "<name> -- Execute a script"}, 
  46 int str_ends_with(const char * str
, const char * suffix
) { 
  48   if( str 
== NULL 
|| suffix 
== NULL 
) 
  51   size_t str_len 
= strlen(str
); 
  52   size_t suffix_len 
= strlen(suffix
); 
  54   if(suffix_len 
> str_len
) 
  57   return 0 == strncmp( str 
+ str_len 
- suffix_len
, suffix
, suffix_len 
); 
  60  * Shows some basic help 
  65 int CmdHelp(const char * Cmd
) 
  67     PrintAndLog("This is a feature to run Lua-scripts. You can place lua-scripts within the scripts/-folder. "); 
  71 * Generate list of available commands, what it does is  
  72 * generate a file listing of the script-directory for files 
  75 int CmdList(const char *Cmd
) 
  79     dp 
= opendir ("./scripts/"); 
  83         while (ep 
= readdir (dp
)) 
  85             if(ep
->d_name 
!= NULL 
&& str_ends_with(ep
->d_name
, ".lua")) 
  86                 PrintAndLog("%-16s %s", ep
->d_name
, "A script file"); 
  91         PrintAndLog ("Couldn't open the scripts-directory"); 
  95  * Finds a matching script-file 
 100 int CmdScript(const char *Cmd
) 
 102   CmdsParse(CommandTable
, Cmd
); 
 106 static int l_hfmf (lua_State *L) { 
 107     return CmdHFMF("wohoo"); 
 111 //static int l_CmdHelp(lua_State *L){ return CmdHelp(luaL_checkstring(L, 1));} 
 112 static int l_CmdHF14AMfDbg(lua_State 
*L
){ return CmdHF14AMfDbg(luaL_checkstring(L
, 1));} 
 113 static int l_CmdHF14AMfRdBl(lua_State 
*L
){ return CmdHF14AMfRdBl(luaL_checkstring(L
, 1));} 
 114 static int l_CmdHF14AMfRdSc(lua_State 
*L
){ return CmdHF14AMfRdSc(luaL_checkstring(L
, 1));} 
 115 static int l_CmdHF14AMfDump(lua_State 
*L
){ return CmdHF14AMfDump(luaL_checkstring(L
, 1));} 
 116 static int l_CmdHF14AMifare(lua_State 
*L
){ return CmdHF14AMifare(luaL_checkstring(L
, 1));} 
 117 static int l_CmdHF14AMfWrBl(lua_State 
*L
){ return CmdHF14AMfWrBl(luaL_checkstring(L
, 1));} 
 118 static int l_CmdHF14AMfChk(lua_State 
*L
){ return CmdHF14AMfChk(luaL_checkstring(L
, 1));} 
 119 static int l_CmdHF14AMfNested(lua_State 
*L
){ return CmdHF14AMfNested(luaL_checkstring(L
, 1));} 
 120 static int l_CmdHF14AMfRestore(lua_State 
*L
){ return CmdHF14AMfRestore(luaL_checkstring(L
, 1));} 
 121 static int l_CmdHF14AMfSniff(lua_State 
*L
){ return CmdHF14AMfSniff(luaL_checkstring(L
, 1));} 
 122 static int l_CmdHF14AMf1kSim(lua_State 
*L
){ return CmdHF14AMf1kSim(luaL_checkstring(L
, 1));} 
 123 static int l_CmdHF14AMfEClear(lua_State 
*L
){ return CmdHF14AMfEClear(luaL_checkstring(L
, 1));} 
 124 static int l_CmdHF14AMfEGet(lua_State 
*L
){ return CmdHF14AMfEGet(luaL_checkstring(L
, 1));} 
 125 static int l_CmdHF14AMfESet(lua_State 
*L
){ return CmdHF14AMfESet(luaL_checkstring(L
, 1));} 
 126 static int l_CmdHF14AMfELoad(lua_State 
*L
){ return CmdHF14AMfELoad(luaL_checkstring(L
, 1));} 
 127 static int l_CmdHF14AMfESave(lua_State 
*L
){ return CmdHF14AMfESave(luaL_checkstring(L
, 1));} 
 128 static int l_CmdHF14AMfECFill(lua_State 
*L
){ return CmdHF14AMfECFill(luaL_checkstring(L
, 1));} 
 129 static int l_CmdHF14AMfEKeyPrn(lua_State 
*L
){ return CmdHF14AMfEKeyPrn(luaL_checkstring(L
, 1));} 
 130 static int l_CmdHF14AMfCSetUID(lua_State 
*L
){ return CmdHF14AMfCSetUID(luaL_checkstring(L
, 1));} 
 131 static int l_CmdHF14AMfCSetBlk(lua_State 
*L
){ return CmdHF14AMfCSetBlk(luaL_checkstring(L
, 1));} 
 132 static int l_CmdHF14AMfCGetBlk(lua_State 
*L
){ return CmdHF14AMfCGetBlk(luaL_checkstring(L
, 1));} 
 133 static int l_CmdHF14AMfCGetSc(lua_State 
*L
){ return CmdHF14AMfCGetSc(luaL_checkstring(L
, 1));} 
 134 static int l_CmdHF14AMfCLoad(lua_State 
*L
){ return CmdHF14AMfCLoad(luaL_checkstring(L
, 1));} 
 135 static int l_CmdHF14AMfCSave(lua_State 
*L
){ return CmdHF14AMfCSave(luaL_checkstring(L
, 1));} 
 140 static void set_cmdlibraries(lua_State 
*L
) 
 142     static const luaL_Reg hfmf_lib
[] = { 
 143         {"dbg",     l_CmdHF14AMfDbg
}, 
 144         {"rdbl",    l_CmdHF14AMfRdBl
}, 
 145         {"rdsc",    l_CmdHF14AMfRdSc
}, 
 146         {"dump",    l_CmdHF14AMfDump
}, 
 147         {"restore", l_CmdHF14AMfRestore
}, 
 148         {"wrbl",    l_CmdHF14AMfWrBl
}, 
 149         {"chk",     l_CmdHF14AMfChk
}, 
 150         {"mifare",  l_CmdHF14AMifare
}, 
 151         {"nested",  l_CmdHF14AMfNested
}, 
 152         {"sniff",   l_CmdHF14AMfSniff
}, 
 153         {"sim",     l_CmdHF14AMf1kSim
}, 
 154         {"eclr",    l_CmdHF14AMfEClear
}, 
 155         {"eget",    l_CmdHF14AMfEGet
}, 
 156         {"eset",    l_CmdHF14AMfESet
}, 
 157         {"eload",   l_CmdHF14AMfELoad
}, 
 158         {"esave",   l_CmdHF14AMfESave
}, 
 159         {"ecfill",  l_CmdHF14AMfECFill
}, 
 160         {"ekeyprn", l_CmdHF14AMfEKeyPrn
}, 
 161         {"csetuid", l_CmdHF14AMfCSetUID
}, 
 162         {"csetblk", l_CmdHF14AMfCSetBlk
}, 
 163         {"cgetblk", l_CmdHF14AMfCGetBlk
}, 
 164         {"cgetsc",  l_CmdHF14AMfCGetSc
}, 
 165         {"cload",   l_CmdHF14AMfCLoad
}, 
 166         {"csave",   l_CmdHF14AMfCSave
}, 
 170     lua_pushglobaltable(L
); 
 171     // Core library is in this table. Contains 'hf' 
 176     //this is the mf table 
 179     //Put the function into the hash table. 
 180     for (int i 
= 0; hfmf_lib
[i
].name
; i
++) { 
 181         lua_pushcfunction(L
, hfmf_lib
[i
].func
); 
 182         lua_setfield(L
, -2, hfmf_lib
[i
].name
);//set the name, pop stack 
 185     lua_setfield(L
, -2, "mf"); 
 188     lua_setfield(L
, -2, "hf"); 
 190     //-- remove the global environment table from the stack 
 195  * Utility to check the ending of a string (used to check file suffix) 
 197 bool endsWith (char* base
, char* str
) { 
 198     int blen 
= strlen(base
); 
 199     int slen 
= strlen(str
); 
 200     return (blen 
>= slen
) && (0 == strcmp(base 
+ blen 
- slen
, str
)); 
 204  * @brief CmdRun - executes a script file. 
 209 int CmdRun(const char *Cmd
) 
 211     // create new Lua state 
 212     lua_State 
*lua_state
; 
 213     lua_state 
= luaL_newstate(); 
 215     // load Lua libraries 
 216     luaL_openlibs(lua_state
); 
 218     //Sets the pm3 core libraries, that go a bit 'under the hood' 
 219     set_pm3_libraries(lua_state
); 
 221     //Sets the 'command line' libraries, basically just the commandline stuff 
 222     set_cmdlibraries(lua_state
); 
 224     //Add the 'bin' library 
 225     set_bin_library(lua_state
); 
 227 //    char cmd_name[32]; 
 228 //    memset(cmd_name, 0, 32); 
 229 //    sscanf(Cmd, "%31s%n", cmd_name, &len); 
 231     char script_name
[128] = {0}; 
 232     char arguments
[256] = {0}; 
 236     sscanf(Cmd
, "%127s%n %255[^\n\r]%n", script_name
,&name_len
, arguments
, &arg_len
); 
 239     if(!endsWith(script_name
,".lua")) 
 245     snprintf(buf
, sizeof buf
, "./scripts/%s%s", script_name
, suffix
); 
 247     printf("--- Executing: %s, args'%s'\n",buf
,arguments
); 
 252     // run the Lua script 
 254     int error 
= luaL_loadfile(lua_state
, buf
); 
 258         lua_pushstring(lua_state
, arguments
); 
 259         lua_setglobal(lua_state
, "args"); 
 261         //Call it with 0 arguments 
 262          error 
= lua_pcall(lua_state
, 0, LUA_MULTRET
, 0); // once again, returns non-0 on error, 
 264     if(error
) // if non-0, then an error 
 266         // the top of the stack should be the error string 
 267         if (!lua_isstring(lua_state
, lua_gettop(lua_state
))) 
 268             printf( "Error - but no error (?!)"); 
 270         // get the top of the stack as the error and pop it off 
 271         const char * str 
= lua_tostring(lua_state
, lua_gettop(lua_state
)); 
 272         lua_pop(lua_state
, 1); 
 276     //luaL_dofile(lua_state, buf); 
 277     // close the Lua state 
 278     lua_close(lua_state
); 
 279     printf("\n-----Finished\n");