怎么用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
Integer();LuaObject t3 = state-GetGlobals("nexttable");std::string str = t3.GetByObject(t2).GetString(
:不能使用虚成员函数。不过考虑到我们仅是在Lua调用一下C++函数,并不是要将C++完美的导入到Lua,这个限制完全可以接受。另外,类成员变量不能直接在Lua中访问,可以通过类成员函数来访问(比如SetValue/GetValue之类)。// 下面是一个简单的C++类:class L
ring("m = Logger(10);" // 调用构造函数 Logger::Logger(int)"m.lm('Hello World 2');" // 调用成员函数 Logger::LOGMEMBER(const char*)"n = Logger(m);" // 调用构造函数 Logge
n){printf(" -- Constructing[%d](%p).../n", n, this);}Logger(Logger* logger){printf(" -- Constructing[%p](%p).../n", logge
m,n = nil, nil;" // m,n 将由Lua的垃极回收来调用析构函数);4. 将一组C函数归类到Lua模块//同上面一样,我采用LuaPlusHelper.h来简化:LuaModule(state, "mymodule").def("add", a