C ++-从Lua C模块调用Lua函数而无需自定义.lib文件

时间:2018-07-12 22:22:55

标签: c++ c lua

我有一个使用Traceback (most recent call last): File "C:\Users\Desktop\Final.py", line 89, in <module> main() File "C:\Users\Desktop\Final.py", line 84, in main check_endpoint() File "C:\Users\Desktop\Final.py", line 74, in check_endpoint ReleaseType = (id['product']['selectionEngine']) KeyError: 'selectionEngine' 修改版的应用程序。 Lua嵌入在Lua 5.2中,据我所见(通过Dependency Walker),它的Lua函数没有导出符号。我没有此应用程序的来源。我需要为Lua编写C模块才能与此应用一起使用。

我已成功exe在此应用程序处理的require文件中将其Lua修复,但是当我尝试调用任何lua_*函数应用程序时,由于访问冲突< / strong>错误。

是否可以找到嵌入式Lua函数的地址/名称并调用它们?

我问应用程序开发人员是否可以这样做,他们似乎并不在乎。唯一的事情是禁止修改应用程序本身。

UPD:据我所知,我遇到访问冲突,因为我正在尝试使用Lua proxy lib,并且它无法将调用传递给exe Lua C函数。 如果我不使用代理DLL,则会得到检测到多个VM 。有什么办法解决这个问题?

我的Lua C模块代码:

#if defined(WIN32) || defined(_WIN32)
#  define LUA_BUILD_AS_DLL   /* for #define LUA_API __declspec(dllimport) */
#endif

#ifdef __cplusplus
extern "C" {
#endif

#include <lua.h>
#include <lauxlib.h>

#ifdef __cplusplus
}
#endif

#if defined(WIN32) || defined(_WIN32)
#  ifdef __cplusplus
#    define MY_LUA_API   extern "C" __declspec(dllexport)
#  else
#    define MY_LUA_API   __declspec(dllexport)
#  endif
#else
#  define MY_LUA_API     extern "C"
#endif

using namespace std;

static int Lmytest_test(lua_State *L) {
    // Check the arguments.
    int argn = lua_gettop(L);
    if (argn != 1 || !lua_isstring(L, 1)) {
        lua_pushstring(L, "Give me one string argument please!");
        lua_error(L);
    }
    lua_pushstring(L, "Hello world!");
    return 2;
}

static const struct luaL_Reg lib[] = {
    { "test", Lmytest_test },
    { NULL, NULL }
};

MY_LUA_API int luaopen_mytest(lua_State* L) {

    printf("Before newlib\n");

#if LUA_VERSION_NUM >= 502
    luaL_newlib(L, lib);
#else
    lua_createtable(L, 0, sizeof(lib) / sizeof(lib[0]));
    luaL_register(L, NULL, lib);
#endif

    printf("After newlib\n");

    return 1;
}

对于那些问what is Lua proxy lib的人:

  

http://lua-users.org/wiki/LuaProxyDll

     

http://lua-users.org/wiki/LuaProxyDllTwo

     

http://lua-users.org/wiki/LuaProxyDllThree

     

http://lua-users.org/wiki/LuaProxyDllFour

2 个答案:

答案 0 :(得分:0)

  

我需要编写C模块以供Lua与此应用一起使用。

好吧...你不能。

如果他们的程序没有导出Lua的DLL接口,并且没有加载Lua的DLL,则意味着它与Lua静态链接。除非您实际入侵可执行文件,否则您的DLL模块将与主要可执行文件未使用的Lua实现进行对话。这就是为什么发生运行时崩溃的原因。讨论相同内存的两个不同的代码段不起作用。

通过静态链接到Lua,该应用程序的开发人员使用户基本上不必编写自己的C模块即可使用Lua,而无需破解二进制文件。

  

是否可以找到嵌入式Lua函数的地址/名称并调用它们?

并非没有反编译器或非常好的汇编技能。还要感谢链接时优化,因为某些Lua API可能已经内联,所以即使是那些链接也可能使您失败。

答案 1 :(得分:0)

您当然可以编写一个C dll,并且如果Lua环境是一个适当兼容的Lua系统,那么您应该能够实现您想要做的事情。但是,您需要检查很多事情:

  1. 确切了解您所用系统中正在运行的Lua版本。 这将使您确定需要针对哪种类型的库进行编译。
print( _VERSION )
  1. 检查此Lua环境正在使用的其他dll模块。使用依赖项遍历或类似项。他们应该使用luaopen_()类型的入口点。如果是这种情况,那么您上面的输入点应该没问题。

  2. 检查要传递给方法的内容。您不能在Lua和您的dll之间传递lightdata(指针)-主要是因为它们的分配将在不同的空间中。您将因此收到访问冲突。

  3. 检查Lua系统可能正在使用的任何外部库。这是常见的,您会找到lua5.1.dll或类似文件。您需要与此链接,以确保您使用的方法将在同一应用程序处理空间内。

通常这样的问题很可能是因为Lua实现已被修改,并且Lua字节码和接口不一致,因此很难进行构建。 希望这可以帮助。

顺便说一句。使用依赖关系遍历器查看exe和dll的可用方法。 Lua使用stdcall名称修饰,因此它们始终可见。 http://www.dependencywalker.com/