我有一个使用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
答案 0 :(得分:0)
我需要编写C模块以供Lua与此应用一起使用。
好吧...你不能。
如果他们的程序没有导出Lua的DLL接口,并且没有加载Lua的DLL,则意味着它与Lua静态链接。除非您实际入侵可执行文件,否则您的DLL模块将与主要可执行文件未使用的Lua实现进行对话。这就是为什么发生运行时崩溃的原因。讨论相同内存的两个不同的代码段不起作用。
通过静态链接到Lua,该应用程序的开发人员使用户基本上不必编写自己的C模块即可使用Lua,而无需破解二进制文件。
是否可以找到嵌入式Lua函数的地址/名称并调用它们?
并非没有反编译器或非常好的汇编技能。还要感谢链接时优化,因为某些Lua API可能已经内联,所以即使是那些链接也可能使您失败。
答案 1 :(得分:0)
您当然可以编写一个C dll,并且如果Lua环境是一个适当兼容的Lua系统,那么您应该能够实现您想要做的事情。但是,您需要检查很多事情:
print( _VERSION )
检查此Lua环境正在使用的其他dll模块。使用依赖项遍历或类似项。他们应该使用luaopen_()类型的入口点。如果是这种情况,那么您上面的输入点应该没问题。
检查要传递给方法的内容。您不能在Lua和您的dll之间传递lightdata(指针)-主要是因为它们的分配将在不同的空间中。您将因此收到访问冲突。
检查Lua系统可能正在使用的任何外部库。这是常见的,您会找到lua5.1.dll或类似文件。您需要与此链接,以确保您使用的方法将在同一应用程序处理空间内。
通常这样的问题很可能是因为Lua实现已被修改,并且Lua字节码和接口不一致,因此很难进行构建。 希望这可以帮助。
顺便说一句。使用依赖关系遍历器查看exe和dll的可用方法。 Lua使用stdcall名称修饰,因此它们始终可见。 http://www.dependencywalker.com/