dumplua源码(dump raw)
本文目录一览:
如何看懂lua的源码
你需要掌握 lua 语言,才可能看懂 lua 语言的源代码。
你需要精通 c 语言,你才可能看懂 lua 的源码。
lua怎么进入源码里面去调试
调试lua现几种案: 一)luaedit : 编辑断点断点命查看些都让习惯用vs亲切纯lua环境编辑器说期望程序运行能借用调试脚本能性(至少我没试验)能用需要给lua脚本做main脚本函数并提供系列伪c api(由lua实现函数提供制定值返)由luaedit启脚本main函数进行调试 二)利用 lua debug 库 hook 记录张断点位置表设置行模式 hook 每进入 hook 都检查否断点处若停等待交互调试效消耗 cpu 每进入新代码行都需要调函数函数本身用 lua 写候效率更低 三)利用lua脚本函数实现lua脚本封装断点函数种式结合debug库实现断点栈信息利用lua环境表函数调用信息进行记录打印需要脚本使用者显式提供断点函数调用办优点自组合适合自项目断点调试案缺点相繁琐且断点命难现式融
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
如何学习 Lua VM 的源码
2011年底开始阅读Lua代码,选择的版本是5.1.4,在那个时候是最新的版本了,不过2012年不仅有更新的5.1版本出来,还有最新的5.2.暂时管不了这么多,继续看这个版本先了。 历经近一年,中间酸甜苦辣只有自己知道,你问有什么方法,我的回答只有坚持。一边看代码,一看补一些基础(比如看龙书),到最后觉得差不多了就自己抄Lua虚拟机代码来跟踪它的实现。 我的博客上:,有我写的Lua分析文章,还没有完全写完。当然我现在也不认为我完全理解的通通透透了。 我最后希望能做到的是:把Lua某个版本的代码通透看完,在github上写一个开源的分析Lua源码的文档,最后能正确写一份英文的得到Lua社区的认可。 之 所以花这么大功夫去啃Lua代码,是因为我觉得Lua是门很好的语言,参见知乎我在其他帖子中对Lua的评价。另一方面是Lua的代码数量足够 小,5.1.4仅仅1.5W行,去掉空白行和注释估计能到1W行。Lua是世界最流行的脚本语言之一,前几年还进过top20的流行语言,另外又是 C\C++的完美伴侣。另外,我自己对如何实现一门语言也充满了好奇,Lua虽小五脏俱全而且还是正经实用的项目。就这些理由一直在支撑着我看下去。当然 现在最难的时候已经过去了。 其他人的文章,国内云风写的是最多的。不过我认为云风的文章key太高,很难follow,你如果对云风写的文章涉及的技术点没有什么涉猎就直接去看,可能很难看懂。 另外国外人写过的,最推荐的有: 《ANoFrillsIntroToLua51VMInstructions》 《The implementation of Lua 5.0》
lua源码分析4(lua是怎么执行的)收藏
当分析到这里,对于lua生成中间码的过程就比较熟悉了。关键是生成的中间码必须要和lua虚拟机的执行联系在一起。所以,对于这里分析的函数调用,要结合lua虚拟机的执行一起来分析。
上篇文章对生成局部函数中间码做了简单的介绍。这里知道,当lua发现一个新定义的函数的时候,会生成OP_CLOSURE指令。那么,lua虚拟机执行到OP_CLOSURE后怎么执行呢?
在此之前,先说在lua解析代码完了以后,会做那些善后之事呢?
前面说过,lua会把一个代码文件当作是一个函数解析执行。在解析期间,它会率先生成一个FuncState的结构,作为最外面的函数。但这是解析时做的事情,运行期间,是不会有FuncState这个东西出现的。在运行期间,是由一个个叫CallInfo的数据结果的,它指的是当前运行的函数。
那么,在解析代码以后,是怎么转入运行的呢?