从另一个应用程序中访问 lua_State

现在想象一下,您有两个使用不同 lua 实例的程序。一个是主程序,另一个是您为其编写的 dll。

在我的问题中,我将主程序称为“主程序”,dll称为“子程序”。我们将子程序加载到主进程中,绕过它并以某种方式访问 lua_State。

我的主要问题是:我们能否通过主程序运行时获取的 lua_State 运行 lua_pcall 或 dofile?

样本代码

主程序:

#include <lua.hpp>

bool loadFile(lua_State* L) {
    // 运行 Lua 脚本
    luaL_dofile(L, "helloworld.lua");
    if (lua_pcall(L, 0, 0, eh) != 0)
    {
        std::string err = luaL_checkstring(L, -1);
        lua_pop(L, 1);
    }

}

int main()
{
    // 创建新的 Lua 状态
    lua_State *lua_state;
    lua_state = luaL_newstate();

    loadFile(lua_state);
}

子程序:

#include <lua.hpp>
#include "hookingLibrary.h"

typedef int(__fastcall* main_loadFile_Proto)(lua_State* L);
main_loadFile_Proto main_loadFile_Ptr;

lua_State * L lastState;
uint64_t main_loadFile_Addr = 0x0;

int main_loadFile_Detour(lua_State* L) {
    lastState = L;
    return main_loadFile_Ptr(L);
}

int main()
{
    // detouring etc.
    // 我在这里并没有放置越权代码。我只是将其声明为一项观点。

    HookingLibrary::hook((LPVOID)(uintptr_t)main_loadFile_Addr, &main_loadFile_Detour, (LPVOID*)&main_loadFile_Ptr);

    do{
       Sleep(100);
    }while(!lastState);


    // 创建新的 Lua 状态
    lua_State *lua_state;
    lua_state = lastState;


    // 运行 Lua 脚本
    luaL_dofile(lua_state, "helloworld.lua");

    // 关闭 Lua 状态
    lua_close(lua_state);
}
点赞
用户10953006
用户10953006

现在,假设你有两个使用不同 lua 实例的程序。一个是主程序,第二个是你为它编写的 DLL。

这个表述并不是很清楚,它取决于你的期望。我看到了两种可能的答案。

  1. 创建一个 DLL,它实现了一些额外的 Lua 函数。该 DLL 库可以稍后由主程序使用。在这种情况下,只有 1 个 lua_state 实例,有一个 Lua 解释器。这个 Lua 解释器可以由 DLL 或主函数创建。

DLL 的接口类似于:

#ifndef DLL_AUGMENTED
#define DLL_AUGMENTED

#include "lua.h"

lua_State *DLL_CreateAugmentedLuaInterpreter ();
void       DLL_FreeLuaInterpreter ();

#endif

并可以由主程序使用:

#include "lua-augmented.h"

int main (int argc, char **argv)
{
  lua_State *LuaState = DLL_CreateAugmentedLuaInterpreter ();

  // TODO: use the augmented Lua instance

  DLL_FreeLuaInterpreter(LuaState);

  return 0;
}
  1. 需要有 2 个 lua 实例,正如所写 One is the main program, the second is the dll。在这种情况下,更加困难,因为需要使用 socketspipes 来实现 IPC(进程间通信)。最好找 LuaSocket 库。

在 Lua 中使用示例进行进程间通信?

2020-09-30 07:41:57