]> git.zerfleddert.de Git - proxmark3-svn/commitdiff
First implementation of user scripts - very experimental - YMMV
authormartin.holst@gmail.com <martin.holst@gmail.com@ef4ab9da-24cd-11de-8aaa-f3a34680c41f>
Tue, 21 May 2013 18:37:43 +0000 (18:37 +0000)
committermartin.holst@gmail.com <martin.holst@gmail.com@ef4ab9da-24cd-11de-8aaa-f3a34680c41f>
Tue, 21 May 2013 18:37:43 +0000 (18:37 +0000)
client/Makefile
client/cmdhfmf.h
client/cmdmain.c
client/cmdscript.c [new file with mode: 0644]
client/cmdscript.h [new file with mode: 0644]
client/scripts/helloworld.lua [new file with mode: 0644]

index 79e6eb2ea36cf3f4ecfbae10e8d06b6b0d794997..35f31167ab39960fcf9c3af27890a991bd79b716 100644 (file)
@@ -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
index 65b789bf5df1d51f007fcbbf387a07bcc5fcebd5..16dcccfbccbeb6f499cfd31819f430a8d1a741fb 100644 (file)
 \r
 int CmdHFMF(const char *Cmd);\r
 \r
+int CmdHF14AMfDbg(const char* cmd);\r
+int CmdHF14AMfRdBl(const char* cmd);\r
+int CmdHF14AMfRdSc(const char* cmd);\r
+int CmdHF14AMfDump(const char* cmd);\r
+int CmdHF14AMfRestore(const char* cmd);\r
+int CmdHF14AMfWrBl(const char* cmd);\r
+int CmdHF14AMfChk(const char* cmd);\r
+int CmdHF14AMifare(const char* cmd);\r
+int CmdHF14AMfNested(const char* cmd);\r
+int CmdHF14AMfSniff(const char* cmd);\r
+int CmdHF14AMf1kSim(const char* cmd);\r
+int CmdHF14AMfEClear(const char* cmd);\r
+int CmdHF14AMfEGet(const char* cmd);\r
+int CmdHF14AMfESet(const char* cmd);\r
+int CmdHF14AMfELoad(const char* cmd);\r
+int CmdHF14AMfESave(const char* cmd);\r
+int CmdHF14AMfECFill(const char* cmd);\r
+int CmdHF14AMfEKeyPrn(const char* cmd);\r
+int CmdHF14AMfCSetUID(const char* cmd);\r
+int CmdHF14AMfCSetBlk(const char* cmd);\r
+int CmdHF14AMfCGetBlk(const char* cmd);\r
+int CmdHF14AMfCGetSc(const char* cmd);\r
+int CmdHF14AMfCLoad(const char* cmd);\r
+int CmdHF14AMfCSave(const char* cmd);\r
+\r
 #endif\r
index a9a37ad1a2ba56d63451c05d58dd3ec462e348ab..18515f6589a123a4050ce586d75391cb7c5a3c99 100644 (file)
@@ -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 (file)
index 0000000..b2c892d
--- /dev/null
@@ -0,0 +1,267 @@
+//-----------------------------------------------------------------------------
+// Copyright (C) 2010 iZsh <izsh at fail0verflow.com>
+//
+// 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+#include <sys/types.h>
+#include <dirent.h>
+
+#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 <lua.h>
+#include <lualib.h>
+#include <lauxlib.h>
+
+
+
+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, "<name> -- 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 (file)
index 0000000..87a5a05
--- /dev/null
@@ -0,0 +1,18 @@
+//-----------------------------------------------------------------------------
+// Copyright (C) 2010 iZsh <izsh at fail0verflow.com>
+//
+// 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 (file)
index 0000000..fe8f0cf
--- /dev/null
@@ -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
Impressum, Datenschutz