From: martin.holst@gmail.com Date: Tue, 21 May 2013 18:37:43 +0000 (+0000) Subject: First implementation of user scripts - very experimental - YMMV X-Git-Tag: v1.0.0~80^2~35 X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/commitdiff_plain/806dc07542ab956f376811e59b4dca8f9c98af89 First implementation of user scripts - very experimental - YMMV --- diff --git a/client/Makefile b/client/Makefile index 79e6eb2e..35f31167 100644 --- a/client/Makefile +++ b/client/Makefile @@ -5,6 +5,7 @@ #----------------------------------------------------------------------------- include ../common/Makefile.common + CC=gcc CXX=g++ #COMMON_FLAGS = -m32 @@ -12,9 +13,9 @@ CXX=g++ VPATH = ../common OBJDIR = obj -LDLIBS = -L/opt/local/lib -L/usr/local/lib -lreadline -lpthread +LDLIBS = -L/opt/local/lib -L/usr/local/lib -lreadline -lpthread ../liblua/liblua.a LDFLAGS = $(COMMON_FLAGS) -CFLAGS = -std=c99 -I. -I../include -I../common -I/opt/local/include -Wall -Wno-unused-function $(COMMON_FLAGS) -g -O4 +CFLAGS = -std=c99 -I. -I../include -I../common -I/opt/local/include -I../liblua -Wall -Wno-unused-function $(COMMON_FLAGS) -g -O4 ifneq (,$(findstring MINGW,$(platform))) CXXFLAGS = -I$(QTDIR)/include -I$(QTDIR)/include/QtCore -I$(QTDIR)/include/QtGui @@ -72,7 +73,9 @@ CMDSRCS = nonce2key/crapto1.c\ cmdparser.c \ cmdmain.c \ cmdlft55xx.c \ - cmdlfpcf7931.c + cmdlfpcf7931.c\ + cmdscript.c\ + COREOBJS = $(CORESRCS:%.c=$(OBJDIR)/%.o) CMDOBJS = $(CMDSRCS:%.c=$(OBJDIR)/%.o) @@ -81,7 +84,7 @@ RM = rm -f BINS = proxmark3 flasher #snooper cli CLEAN = cli cli.exe flasher flasher.exe proxmark3 proxmark3.exe snooper snooper.exe $(CMDOBJS) $(OBJDIR)/*.o *.o *.moc.cpp -all: $(BINS) +all: lua_build $(BINS) all-static: LDLIBS:=-static $(LDLIBS) all-static: snooper cli flasher @@ -125,4 +128,8 @@ install_kext: Info.plist touch /System/Library/Extensions @echo "*** You may need to reboot for the kext to take effect." +lua_build: + @echo Compiling liblua; + cd ../liblua && make linux + .PHONY: all clean diff --git a/client/cmdhfmf.h b/client/cmdhfmf.h index 65b789bf..16dcccfb 100644 --- a/client/cmdhfmf.h +++ b/client/cmdhfmf.h @@ -27,4 +27,29 @@ int CmdHFMF(const char *Cmd); +int CmdHF14AMfDbg(const char* cmd); +int CmdHF14AMfRdBl(const char* cmd); +int CmdHF14AMfRdSc(const char* cmd); +int CmdHF14AMfDump(const char* cmd); +int CmdHF14AMfRestore(const char* cmd); +int CmdHF14AMfWrBl(const char* cmd); +int CmdHF14AMfChk(const char* cmd); +int CmdHF14AMifare(const char* cmd); +int CmdHF14AMfNested(const char* cmd); +int CmdHF14AMfSniff(const char* cmd); +int CmdHF14AMf1kSim(const char* cmd); +int CmdHF14AMfEClear(const char* cmd); +int CmdHF14AMfEGet(const char* cmd); +int CmdHF14AMfESet(const char* cmd); +int CmdHF14AMfELoad(const char* cmd); +int CmdHF14AMfESave(const char* cmd); +int CmdHF14AMfECFill(const char* cmd); +int CmdHF14AMfEKeyPrn(const char* cmd); +int CmdHF14AMfCSetUID(const char* cmd); +int CmdHF14AMfCSetBlk(const char* cmd); +int CmdHF14AMfCGetBlk(const char* cmd); +int CmdHF14AMfCGetSc(const char* cmd); +int CmdHF14AMfCLoad(const char* cmd); +int CmdHF14AMfCSave(const char* cmd); + #endif diff --git a/client/cmdmain.c b/client/cmdmain.c index a9a37ad1..18515f65 100644 --- a/client/cmdmain.c +++ b/client/cmdmain.c @@ -24,6 +24,7 @@ #include "cmdlf.h" #include "cmdmain.h" #include "util.h" +#include "cmdscript.h" unsigned int current_command = CMD_UNKNOWN; unsigned int received_command = CMD_UNKNOWN; @@ -42,6 +43,7 @@ static command_t CommandTable[] = {"hw", CmdHW, 1, "{ Hardware commands... }"}, {"lf", CmdLF, 1, "{ LF commands... }"}, {"quit", CmdQuit, 1, "Quit program"}, + {"script", CmdScript, 1,"Run script"}, {NULL, NULL, 0, NULL} }; diff --git a/client/cmdscript.c b/client/cmdscript.c new file mode 100644 index 00000000..b2c892d1 --- /dev/null +++ b/client/cmdscript.c @@ -0,0 +1,267 @@ +//----------------------------------------------------------------------------- +// Copyright (C) 2010 iZsh +// +// This code is licensed to you under the terms of the GNU GPL, version 2 or, +// at your option, any later version. See the LICENSE.txt file for the text of +// the license. +//----------------------------------------------------------------------------- +// Data and Graph commands +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include + +#include "proxmark3.h" +#include "data.h" +#include "ui.h" +#include "graph.h" +#include "cmdparser.h" +#include "cmdmain.h" +#include "cmdscript.h" +#include "cmdhfmf.h" + +#include +#include +#include + + + +static int CmdHelp(const char *Cmd); +static int CmdList(const char *Cmd); +static int CmdRun(const char *Cmd); + +command_t CommandTable[] = +{ + {"help", CmdHelp, 1, "This help"}, + {"list", CmdList, 1, " -- List available scripts"}, + {"run", CmdRun, 1, "Execute a script"}, + {NULL, NULL, 0, NULL} +}; + +int str_ends_with(const char * str, const char * suffix) { + + if( str == NULL || suffix == NULL ) + return 0; + + size_t str_len = strlen(str); + size_t suffix_len = strlen(suffix); + + if(suffix_len > str_len) + return 0; + + return 0 == strncmp( str + str_len - suffix_len, suffix, suffix_len ); +} +/** + * Shows some basic help + * @brief CmdHelp + * @param Cmd + * @return + */ +int CmdHelp(const char * Cmd) +{ + PrintAndLog("This is a feature to run Lua-scripts. You can place lua-scripts within the scripts/-folder. "); +} + +/** +* Generate list of available commands, what it does is +* generate a file listing of the script-directory for files +* ending with .lua +*/ +int CmdList(const char *Cmd) +{ + DIR *dp; + struct dirent *ep; + dp = opendir ("./scripts/"); + if (dp != NULL) + { + while (ep = readdir (dp)) + { + if(ep->d_name != NULL && str_ends_with(ep->d_name, ".lua")) + PrintAndLog("%-16s %s", ep->d_name, "A script file"); + } + (void) closedir (dp); + } + else + PrintAndLog ("Couldn't open the directory"); + return 0; +} +/** + * Finds a matching script-file + * @brief CmdScript + * @param Cmd + * @return + */ +int CmdScript(const char *Cmd) +{ + CmdsParse(CommandTable, Cmd); + return 0; +} +/* +static int l_hfmf (lua_State *L) { + return CmdHFMF("wohoo"); + +} +*/ +static int l_CmdHelp(lua_State *L){ return CmdHelp('foo');} +static int l_CmdHF14AMfDbg(lua_State *L){ return CmdHF14AMfDbg('foo');} +static int l_CmdHF14AMfRdBl(lua_State *L){ return CmdHF14AMfRdBl('foo');} +static int l_CmdHF14AMfRdSc(lua_State *L){ return CmdHF14AMfRdSc('foo');} +static int l_CmdHF14AMfDump(lua_State *L){ return CmdHF14AMfDump('foo');} +static int l_CmdHF14AMfRestore(lua_State *L){ return CmdHF14AMfRestore('foo');} +static int l_CmdHF14AMfWrBl(lua_State *L){ return CmdHF14AMfWrBl('foo');} +static int l_CmdHF14AMfChk(lua_State *L){ return CmdHF14AMfChk('foo');} +static int l_CmdHF14AMifare(lua_State *L){ return CmdHF14AMifare(luaL_checkstring(L, 1));} +static int l_CmdHF14AMfNested(lua_State *L){ return CmdHF14AMfNested(luaL_checkstring(L, 1));} +static int l_CmdHF14AMfSniff(lua_State *L){ return CmdHF14AMfSniff('foo');} +static int l_CmdHF14AMf1kSim(lua_State *L){ return CmdHF14AMf1kSim('foo');} +static int l_CmdHF14AMfEClear(lua_State *L){ return CmdHF14AMfEClear('foo');} +static int l_CmdHF14AMfEGet(lua_State *L){ return CmdHF14AMfEGet('foo');} +static int l_CmdHF14AMfESet(lua_State *L){ return CmdHF14AMfESet('foo');} +static int l_CmdHF14AMfELoad(lua_State *L){ return CmdHF14AMfELoad('foo');} +static int l_CmdHF14AMfESave(lua_State *L){ return CmdHF14AMfESave('foo');} +static int l_CmdHF14AMfECFill(lua_State *L){ return CmdHF14AMfECFill('foo');} +static int l_CmdHF14AMfEKeyPrn(lua_State *L){ return CmdHF14AMfEKeyPrn('foo');} +static int l_CmdHF14AMfCSetUID(lua_State *L){ return CmdHF14AMfCSetUID('foo');} +static int l_CmdHF14AMfCSetBlk(lua_State *L){ return CmdHF14AMfCSetBlk('foo');} +static int l_CmdHF14AMfCGetBlk(lua_State *L){ return CmdHF14AMfCGetBlk('foo');} +static int l_CmdHF14AMfCGetSc(lua_State *L){ return CmdHF14AMfCGetSc('foo');} +static int l_CmdHF14AMfCLoad(lua_State *L){ return CmdHF14AMfCLoad('foo');} +static int l_CmdHF14AMfCSave(lua_State *L){ return CmdHF14AMfCSave('foo');} + +int luaopen_hfmf(lua_State *L) +{ + static const luaL_Reg hfmf_lib[] = { + {"help", l_CmdHelp}, + {"dbg", l_CmdHF14AMfDbg}, + {"rdbl", l_CmdHF14AMfRdBl}, + {"rdsc", l_CmdHF14AMfRdSc}, + {"dump", l_CmdHF14AMfDump}, + {"restore", l_CmdHF14AMfRestore}, + {"wrbl", l_CmdHF14AMfWrBl}, + {"chk", l_CmdHF14AMfChk}, + {"mifare", l_CmdHF14AMifare}, + {"nested", l_CmdHF14AMfNested}, + {"sniff", l_CmdHF14AMfSniff}, + {"sim", l_CmdHF14AMf1kSim}, + {"eclr", l_CmdHF14AMfEClear}, + {"eget", l_CmdHF14AMfEGet}, + {"eset", l_CmdHF14AMfESet}, + {"eload", l_CmdHF14AMfELoad}, + {"esave", l_CmdHF14AMfESave}, + {"ecfill", l_CmdHF14AMfECFill}, + {"ekeyprn", l_CmdHF14AMfEKeyPrn}, + {"csetuid", l_CmdHF14AMfCSetUID}, + {"csetblk", l_CmdHF14AMfCSetBlk}, + {"cgetblk", l_CmdHF14AMfCGetBlk}, + {"cgetsc", l_CmdHF14AMfCGetSc}, + {"cload", l_CmdHF14AMfCLoad}, + {"csave", l_CmdHF14AMfCSave}, + {NULL, NULL} + }; + luaL_newlib(L, hfmf_lib); + return 1; +} + +static void set_libraries(lua_State *L) +{ + static const luaL_Reg hfmf_lib[] = { + {"help", l_CmdHelp}, + {"dbg", l_CmdHF14AMfDbg}, + {"rdbl", l_CmdHF14AMfRdBl}, + {"rdsc", l_CmdHF14AMfRdSc}, + {"dump", l_CmdHF14AMfDump}, + {"restore", l_CmdHF14AMfRestore}, + {"wrbl", l_CmdHF14AMfWrBl}, + {"chk", l_CmdHF14AMfChk}, + {"mifare", l_CmdHF14AMifare}, + {"nested", l_CmdHF14AMfNested}, + {"sniff", l_CmdHF14AMfSniff}, + {"sim", l_CmdHF14AMf1kSim}, + {"eclr", l_CmdHF14AMfEClear}, + {"eget", l_CmdHF14AMfEGet}, + {"eset", l_CmdHF14AMfESet}, + {"eload", l_CmdHF14AMfELoad}, + {"esave", l_CmdHF14AMfESave}, + {"ecfill", l_CmdHF14AMfECFill}, + {"ekeyprn", l_CmdHF14AMfEKeyPrn}, + {"csetuid", l_CmdHF14AMfCSetUID}, + {"csetblk", l_CmdHF14AMfCSetBlk}, + {"cgetblk", l_CmdHF14AMfCGetBlk}, + {"cgetsc", l_CmdHF14AMfCGetSc}, + {"cload", l_CmdHF14AMfCLoad}, + {"csave", l_CmdHF14AMfCSave}, + {NULL, NULL} + }; + + lua_pushglobaltable(L); + // Core library is in this table. Contains 'hf' + + //this is 'hf' table + lua_newtable(L); + + //this is the mf table + lua_newtable(L); + + //Put the function into the hash table. + for (int i = 0; hfmf_lib[i].name; i++) { + lua_pushcfunction(L, hfmf_lib[i].func); + lua_setfield(L, -2, hfmf_lib[i].name);//set the name, pop stack + } + //Name of 'mf' + lua_setfield(L, -2, "mf"); + + //Name of 'hf' + lua_setfield(L, -2, "hf"); + + //-- remove the global environment table from the stack + lua_pop(L, 1); + return 1; +} + +/** + * @brief CmdRun - executes a script file. + * @param argc + * @param argv + * @return + */ +int CmdRun(const char *Cmd) +{ + // create new Lua state + lua_State *lua_state; + lua_state = luaL_newstate(); + + // load Lua libraries + static const luaL_Reg lualibs[] = + { + {"base", luaopen_base }, + { NULL, NULL} + }; + + const luaL_Reg *lib = lualibs; + for(; lib->func != NULL; lib++) + { + lib->func(lua_state); + lua_settop(lua_state, 0); + } + + set_libraries(lua_state); + char cmd_name[32]; + int len = 0; + memset(cmd_name, 0, 32); + sscanf(Cmd, "%31s%n", cmd_name, &len); + + char buf[256]; + snprintf(buf, sizeof buf, "./scripts/%s", cmd_name); + + printf("Executing file '%s'\n---------------------------\n" , cmd_name); + // run the Lua script + luaL_dofile(lua_state, buf); + // close the Lua state + lua_close(lua_state); + printf("-----------------Finished\n"); +} + diff --git a/client/cmdscript.h b/client/cmdscript.h new file mode 100644 index 00000000..87a5a053 --- /dev/null +++ b/client/cmdscript.h @@ -0,0 +1,18 @@ +//----------------------------------------------------------------------------- +// Copyright (C) 2010 iZsh +// +// This code is licensed to you under the terms of the GNU GPL, version 2 or, +// at your option, any later version. See the LICENSE.txt file for the text of +// the license. +//----------------------------------------------------------------------------- +// Data and Graph commands +//----------------------------------------------------------------------------- + + +#ifndef CMDSCRIPT_H__ +#define CMDSCRIPT_H__ + + +int CmdScript(const char *Cmd); + +#endif diff --git a/client/scripts/helloworld.lua b/client/scripts/helloworld.lua new file mode 100644 index 00000000..fe8f0cfa --- /dev/null +++ b/client/scripts/helloworld.lua @@ -0,0 +1,14 @@ +print("Helleo world!"); + +print("hf:", hf); + +print("hf.mf:",hf.mf); +print("and now... "); +print("hf.mf.mifare",hf.mf.mifare); + +hf.mf.mifare(""); + + +function foo() + print("Hi I am the foo function!"); +end