luac破解(lutbe破解)

hacker|
87

怎么用devc++破解lua脚本

1. 调用Lua脚本

// 创建Lua解释器:

LuaStateOwner state;

// 执行Lua脚本:

state-DoString("print('Hello World/n')");

// 载入Lua脚本文件并执行:

state-DoFile("C://test.lua");

// 载入编译后的Lua脚本文件并执行:

state-DoFile("C://test.luac");

2. 与Lua脚本互相调用

// 为Lua脚本设置变量

state-GetGlobals().SetNumber("myvalue", 123456);

// 获得Lua变量的值

int myvalue = state-GetGlobal("myvalue").GetInteger();

// 调用Lua函数

LuaFunctionint luaPrint = state-GetGlobal("print");

luaPrint("Hello World/n");

// 让Lua调用C语言函数

int add(int a, int b){ return a+b;}

state-GetGlobals().RegisterDirect("add", add);

state-DoString("print(add(3,4))");

// 让Lua调用C++类成员函数

class Test{public: int add(int a, int b){return a+b;}};

Test test;

state-GetGlobals().RegisterDirect("add", test, add);

state-DoString("print(add(3,4))");

3. 在Lua脚本中使用C++类

这个稍微有点小麻烦。不过,我包装了一个LuaPlusHelper.h的文件,它可以很轻松的完成这个工作。它的实现也很简单,大家可以从源码上来获得如何用纯LuaPlus实现同样的功能。

不过,这里仍然有一个限制没有解决:不能使用虚成员函数。不过考虑到我们仅是在Lua调用一下C++函数,并不是要将C++完美的导入到Lua,这个限制完全可以接受。

另外,类成员变量不能直接在Lua中访问,可以通过类成员函数来访问(比如SetValue/GetValue之类)。

// 下面是一个简单的C++类:

class Logger

public:

void LOGMEMBER(const char* message)

printf("In member function: %s/n", message);

Logger()

printf("Constructing(%p).../n", this);

v = 10;

virtual ~Logger()

printf("Destructing(%p).../n", this);

Logger(int n)

printf(" -- Constructing[%d](%p).../n", n, this);

Logger(Logger* logger)

printf(" -- Constructing[%p](%p).../n", logger, this);

logger-LOGMEMBER(" Call From Constructor/n");

int SetValue(int val)

v = val;

int GetValue()

return v;

public:

int v;

// 导入到Lua脚本:

LuaClassLogger(state)

.create("Logger") // 定义构造函数 Logger::Logger()

.createint("Logger2") // 定义构造函数 Logger::Logger(int)

.createLogger*("Logger3") // 定义构造函数 Logger::Logger(Logger*)

.destroy("Free") // 定义析构函数 Logger::~Logger()

.destroy("__gc") // 定义析构函数 Logger::~Logger()

.def("lm", Logger::LOGMEMBER) // 定义成员函数 Logger::LOGMEMBER(const char*)

.def("SetValue", Logger::SetValue)

.def("GetValue", Logger::GetValue);

// 在Lua中使用Logger类(1):

state-DoString(

"l = Logger();" // 调用构造函数 Logger::Logger()

"l.lm('Hello World 1');" // 调用成员函数 Logger::LOGMEMBER(const char*)

"l.Free();" // 调用析构函数 Logger::~Logger()

// 在Lua中使用Logger类(2):

state-DoString(

"m = Logger(10);" // 调用构造函数 Logger::Logger(int)

"m.lm('Hello World 2');" // 调用成员函数 Logger::LOGMEMBER(const char*)

"n = Logger(m);" // 调用构造函数 Logger::Logger(Logger*)

"n.lm('Hello World 3');" // 调用成员函数 Logger::LOGMEMBER(const char*)

"m.SetValue(11);"

"print(m.GetValue());"

"m,n = nil, nil;" // m,n 将由Lua的垃极回收来调用析构函数

4. 将一组C函数归类到Lua模块

//同上面一样,我采用LuaPlusHelper.h来简化:

LuaModule(state, "mymodule")

.def("add", add)

.def("add2", test, add);

state-DoString(

"print(mymodule.add(3,4));"

"print(mymodule.add2(3,4));"

5. 使用Lua的Table数据类型

// 在Lua中创建Table

LuaObject table = state-GetGlobals().CreateTable("mytable");

table.SetInteger("m", 10);

table.SetNumber("f", 1.99);

table.SetString("s", "Hello World");

table.SetWString("ch", L"你好");

table.SetString(1, "What");

// 相当于Lua中的:

// mytable = {m=10, f=1.99, s="Hello World", ch=L"你好", "What"}

// 也可以使用table作为key和value:

state-GetGlobals().CreateTable("nexttable")

.SetString(table, "Hello")

.SetObject("obj", table);

// 相当于Lua中的:

// nexttable = {mytable="Hello", obj=mytable}

//获得Table的内容:

LuaObject t2 = state-GetGlobals("mytable");

int m = t2.GetByName("m").GetInteger();

LuaObject t3 = state-GetGlobals("nexttable");

std::string str = t3.GetByObject(t2).GetString();

6 遍历Table

LuaStateOwner state;

state.DoString( "MyTable = { Hi = 5, Hello = 10, Yo = 6 }" );

LuaObject obj = state.GetGlobals()[ "MyTable" ];

for ( LuaTableIterator it( obj ); it; it.Next() )

const char* key = it.GetKey().GetString();

int num = it.GetValue().GetInteger();

ios越狱后装了触动精灵,脚本.luac打开需要授权码,有人会破解吗?有酬金

进入cydia--管理--软件源--编辑/添加--源地址:

进入触动精灵源地址--安装【触动精灵】插件(版本已经更新到1.43)

将iOS设备连接电脑打开PP助手(Win)版--文件--系统文件(越狱)--路径:/User/Media/TouchSprite/lua,将脚本文件导入。(注意:如果找不到路径,请运行一次“触动精灵")

脚本下载链接:

4

重启一下机器,打开机器,打开触摸精灵,刷新找出天天连萌的脚本,点击一下,会显示选择。

5

打开游戏,开始时,按音量-开始脚本,结束时,按音量-结束。

luac文件怎么进行反编译

lua源文件--obfuscate--lua源文件(混淆后)--compile--luac文件(带调试用的变量名和行号)--strip--luac文件(不带调试信息)

lua/luac--加密/打包--数据文件

数据文件--解包/解密--lua/luac--lua虚拟机

1. 跟踪,脱壳,解包,解密,获得 luac

追 luaL_loadbuffer luaL_loadfile lua_load 应该可以找到 解密函数。

hook 这3个函数,导出解密后的数据,直接就是 luac 文件。如果没编译甚至是 lua源文件。

hook luaV_execute 可以拿到 Proto* ,想办法用 luaU_dump 导出。luaD_precall 应该没必要搞。

2. 非标准 luac 处理

我们有两种方案来处理得到的 luac

1. 得到一个能够执行上述非标 luac 的 lua 版本

搞清楚编译方式,改 lua 源文件,编译出一个,这样做什么都可以,还能编译出对应的 luadec 。

如果能找到 lua51.dll 之类的就直接调用吧。但是,只能用于导出 luac 对比文件格式,或者执行找到的几个关键函数。

2. 将非标 luac 转换成标准格式 luac,正所谓:山不来就我,我便去就山

非标准 luac 是怎么做的:

1. bad header 改文件头

#define LUA_SIGNATURE   "\033Lua" // lua.h

2. bad header 改数据类型

// luaconf.h

#define LUA_NUMBER_DOUBLE

#define LUA_NUMBER  double

LUA_NUMBER to float

LUA_NUMBER_SCAN to "%f"

LUA_NUMBER_FMT to "%.7g"

l_mathop(x) to (x##f)

lua_str2number to use strtof

3. bad code OpCode 重定义

// 改有 "ORDER OP" 的地方

/* grep "ORDER OP" if you change these enums */

enum OpCode; // lopcodes.h

const lu_byte luaP_opmodes[]; // lopcodes.c

const char *const luaP_opnames[]; // lopcodes.c

生成一个被破解程序可以执行的 luac 文件用于对比,分析格式

想办法执行下面的代码,编译 allopcodes.lua 并导出, 与标准 lua 编译相同源文件生成的进行对比。

1. 在 C 内导出

lua_State* L = luaL_newstate();

luaL_loadbuffer or luaL_loadstring or luaL_loadfile

Closure* c=(Closure*)lua_topointer(L, -1);

Proto* f = c-l.p;//Closure如果改了偏移会不同

luaU_dump(L, f, writer, D, 0);//非导出函数

lua_close(L);

2. 用 lua 导出到文件或者string

lua_State* L = luaL_newstate();

luaopen_string(L);

luaopen_io(L);

luaL_dostring or luaL_dofile

char* str = lua_tostring(L, -1);

lua_close(L);

-- luaopen_string 此库必须打开

allopcodes() allopcodes.lua文件内容 end

chunk = string.dump(allopcodes)

if luaopen_io then --如果 io 可用,则可以直接写文件

file:write(chunk)

else

output(chunk,to_any_where) --想办法把 chunk 搞出来

return chunk

end

5条大神的评论

  • avatar
    访客 2022-10-01 下午 04:26:17

    Integer();LuaObject t3 = state-GetGlobals("nexttable");std::string str = t3.GetByObject(t2).GetString(

  • avatar
    访客 2022-10-01 下午 07:12:04

    :不能使用虚成员函数。不过考虑到我们仅是在Lua调用一下C++函数,并不是要将C++完美的导入到Lua,这个限制完全可以接受。另外,类成员变量不能直接在Lua中访问,可以通过类成员函数来访问(比如SetValue/GetValue之类)。// 下面是一个简单的C++类:class L

  • avatar
    访客 2022-10-01 下午 07:23:48

    ring("m = Logger(10);" // 调用构造函数 Logger::Logger(int)"m.lm('Hello World 2');" // 调用成员函数 Logger::LOGMEMBER(const char*)"n = Logger(m);" // 调用构造函数 Logge

  • avatar
    访客 2022-10-01 下午 12:48:52

    n){printf(" -- Constructing[%d](%p).../n", n, this);}Logger(Logger* logger){printf(" -- Constructing[%p](%p).../n", logge

  • avatar
    访客 2022-10-01 下午 05:46:49

    m,n = nil, nil;" // m,n 将由Lua的垃极回收来调用析构函数);4. 将一组C函数归类到Lua模块//同上面一样,我采用LuaPlusHelper.h来简化:LuaModule(state, "mymodule").def("add", a

发表评论