下面的补丁只是用来学习代码,无任何实际用途。
--------------------------------------
1. 替换LUAI_THROW和LUAI_TRY:
使用特定于Windows的__try和__except扩展关键词(见msdn),
用Access Violation(地址违例)来模拟抛异常,
替换原有的setjmp和longjmp实现。
/* default handling with long jumps */ #if 0 #define LUAI_THROW(L,c) longjmp((c)->b, 1) #define LUAI_TRY(L,c,a) if (setjmp((c)->b) == 0) { a } #define luai_jmpbuf jmp_buf #else //新增,用于测试try //http://blog.csdn.net/vblittleboy/article/details/6561868 #define LUAI_THROW(L,c) do { unsigned char *p = (unsigned char *)(0x0); *p = 0; } while(0) //EXCEPTION_EXECUTE_HANDLER #include <stdio.h> #define LUAI_TRY(L,c,a) __try { a } __except(1) \ {fprintf(stderr, "Got __except!\n"); if ((c)->status == 0) (c)->status = -1;} #define luai_jmpbuf int #endif
运行结果:
> a=a..1
Got __except!
stdin:1: attempt to concatenate global 'a' (a nil value)
stack traceback:
stdin:1: in main chunk
[C]: ?
>
--------------------------------------
2. 打印当前虚拟机需要执行的pc指令数组
用于控制台交互模式的指令测试(对照其它lua虚拟机实现)
void luaV_execute (lua_State *L, int nexeccalls) { LClosure *cl; StkId base; TValue *k; const Instruction *pc; reentry: /* entry point */ lua_assert(isLua(L->ci)); pc = L->savedpc; cl = &clvalue(L->ci->func)->l; base = L->base; k = cl->p->k; { const int *mypc; int i = 0; for(mypc = pc; *mypc && i < cl->p->sizecode; i++, mypc++) { printf("Instruction[%d]=%d,OP=%d,A=%d,B=%d,C=%d,Bx=%d,sBx=%d\n", i, *mypc, GET_OPCODE(*mypc), GETARG_A(*mypc), GETARG_B(*mypc), GETARG_C(*mypc), GETARG_Bx(*mypc), GETARG_sBx(*mypc)); } }
运行结果:
> print("hello")
Instruction[0]=5,OP=5,A=0,B=0,C=0,Bx=0,sBx=-131071
Instruction[1]=16449,OP=1,A=1,B=0,C=1,Bx=1,sBx=-131070
Instruction[2]=16793628,OP=28,A=0,B=2,C=1,Bx=1025,sBx=-130046
Instruction[3]=8388638,OP=30,A=0,B=1,C=0,Bx=512,sBx=-130559
hello
>
查看OP码最简单的方法是直接用luac看指令
(Windows下用Ctrl+Z结束stdin输入)
print("hello")
^Z
main <stdin:0,0> (4 instructions, 16 bytes at 00383270)
0+ params, 2 slots, 0 upvalues, 0 locals, 2 constants, 0 functions
1 [1] GETGLOBAL 0 -1 ; print
2 [1] LOADK 1 -2 ; "hello"
3 [1] CALL 0 2 1
4 [1] RETURN 0 1
3. luadec使用
如果用luadec反编译时崩溃,可尝试加些额外的参数:
luadec -l guess_local -l2 LDS2 luac.out > out.txt
还有一个用lua实现的lua反编译器(功能类似luac的反编译,指令级,但稍微详细点):
chunkspy:
http://luaforge.net/projects/chunkspy/
还有一个是用perl写的(应该也是基于指令级的)
luadisam
http://bbs.luaer.cn/read-Lua-tid-990.html
http://code.google.com/p/mimon-tools/source/browse/trunk/lua/luadisasm?r=12
4. 类C改造
(20150529)
luaの構文はいけてないので C言語ぽくしよう
https://github.com/rti7743/rtilabs/tree/master/files/asobiba/lua
相关推荐
lua5.1.lib文件缺失,LNK1181
lua5.1压缩包源文件lua5.1压缩包源文件lua5.1压缩包源文件
Lua5.1,VS08工程,支持中文变量.分不多,自己感受.
Lua5.1中文手册(全)目前最新最全的。
lua5.1源码
Lua 5.1 Reference Manual.是5.1的版本的Rerfence Manual.希望可以给大家提供帮助.
Lua 5.1 manual 笔记,由FinixLei整理,中文版。
cjson.dll 需要lua5.1.dll 调用require “cjson” cjson.dll 需要lua5.1.dll 调用require “cjson”
window下的lua5.1基础环境相关的安装软件,有LuaForWindows_v5.1.5-52和mingw
lua5.1 for windows的安装文件
内含VS工程,lua的源文件,编译出来的库文件,可自行重新编译debug版或者release版
lua5.1:lua 5.1源代码
Lua5.1参考手册,适合初学者
( Lua 5.1 参考手册.doc )游戏编程必备参考手册
Lua脚本可以很容易的被C/C++代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,Ini等文件格式,并且更容易理解和维护。 Lua...
按官方diff文件修改过的luabind代码,修正了在使用lua5.1时,编译luabind出现编译错误的兼容性问题: error C2065: \'LUA_NOREF\' : undeclared identifier
这个是云风大侠翻译的 Lua5.1 参考手册 翻译在云风个人网站上,地址为http://www.codingnow.com/2000/download/lua_manual.html#pdf-require 并非全部翻译,但是前面的大部分和重点都翻译,真的很有用,所以转换成...
lua 5.1 manual.chm lua 5.1 manual.chm lua 5.1 manual.chm
lua.pas+lua5.1.dll即可以调用.lua 此处是lua5.1.dll
lua5.1的源码,已经用vs2010成功编译