本文最后更新于 645 天前,其中的信息可能已经有所发展或是发生改变。
今天遇到一个游戏,用的 lua5.4 ,基于xlua 开发的,我尝试了几个方向都不能正常的注入lua。
就不能通过 g 表来 注入篡改逻辑。
想着不能注入明文 lua ,不如我用 C 写一遍吧。代码在下面:
void print_table(lua_State* L, int index)
{
// 如果不是 table 类型,直接打印其值
if (!lua_istable(L, index))
{
if (lua_isfunction(L, index))
{
printf("function: %p", lua_topointer(L, index));
}
else if (lua_isuserdata(L, index))
{
printf("userdata: %p", lua_topointer(L, index));
}
else
{
printf("%s", lua_tostring(L, index));
}
return;
}
printf("{");
// 遍历 table,打印每个元素的 key 和 value
lua_pushnil(L);
while (lua_next(L, index) != 0)
{
// 打印 key
if (lua_isstring(L, -2))
{
printf("%s = ", lua_tostring(L, -2));
}
else
{
printf("[");
// 递归打印 key
print_table(L, -2);
printf("] = ");
}
// 打印 value
if (lua_isnil(L, -1))
{
printf("nil");
}
else if (lua_isboolean(L, -1))
{
printf("%s", lua_toboolean(L, -1) ? "true" : "false");
}
else if (lua_isnumber(L, -1))
{
printf("%g", lua_tonumber(L, -1));
}
else if (lua_isstring(L, -1))
{
printf("%s", lua_tostring(L, -1));
}
else if (lua_istable(L, -1))
{
print_table(L, lua_gettop(L));
}
else if (lua_isfunction(L, -1))
{
printf("function: %p", lua_topointer(L, -1));
}
else if (lua_isuserdata(L, -1))
{
printf("userdata: %p", lua_topointer(L, -1));
}
else
{
printf("%s", lua_typename(L, lua_type(L, -1)));
}
// 如果不是最后一个元素,打印逗号
if (lua_next(L, index) != 0)
{
printf(", ");
}
// 弹出 value,保留 key 供下次循环使用
lua_pop(L, 1);
}
printf("}");
}
需要注意 这里用到的 lua 相关的函数,需要自己用 dobby 或者 xhook 通过符号去拿
这个问题也算事比较棘手的了,因为目前很多大厂的游戏都是不给明文注入的, lua 代码也是层层加密。如果可以直接打印 g 表的信息,那就简单很多了!