Lua和C++的交互
目录
Lua堆栈
Lua堆栈操作
C++调用lua
Lua调用C++
There is something beautiful, just to find it.
Lua堆栈
要理解Lua和C++的交互,首先要清楚Lua堆栈。简单来说Lua和C++交互是通过一个无处不在的虚拟堆栈来的。
在Lua中,lua堆栈是一个结构,堆栈的索引可以是整数或者负数,+1表示栈底,-1表示栈顶。
存入栈的数据类型包含数值,字符串,指针,table,闭包等。
1
2
3
4
5
6
7
lua_pushcclosure(L, func, 0) // 创建并压入一个闭包
lua_createtable(L, 0, 0) // 新建并压入一个表
lua_pushnumber(L, 343) // 压入一个数字
lua_pushstring(L, “mystr”) // 压入一个字符串
这里要说明的是, 你压入的类型有数值, 字符串, 表和闭包[在c中看来是不同类型的值], 但是最后都是统一用TValue这种数据结构来保存的:), 下面用图简单的说明一下 ...
Lua笔记 迭代器
Lua中的迭代器提供的是一种遍历表中所有元素的机制,它通常是函数的形式,每次调用函数,返回“下一个”值。Lua中的迭代器有两种实现方式,基于闭包(closure)或者基于协程(coroutine)。以下会通过一个实例来分别讨论两种迭代器的实现。
为更好演示迭代器的功能并逐步实现一个迭代器函数,本文结合一个需求的场景,从一个字符串中拆出一个一个的UTF8字符,即每次调用迭代器函数会返回下一个UTF8字符,直到迭代完整个字符串。
首先需要编写一个这样的函数,输入一个字符串和一个位置pos,得到从这个pos起的第一个UTF8字符,返回该UTF8字符占用的字节数(即Lua中用#取到的字符串长度)以及由对应的字节组成的字符串(其实就是其对应的UTF8字符)。函数的一种实现方式如下:
12345678910111213141516171819202122232425local getutf8char = function(str,pos) local byte = str:byte(pos); local len,uchar = 1,""; if byte >= 0x00 a ...
php+redis+lua
发两个php+redis+lua的例子。
一、直接在redis上运行命令demo1eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
eval 命令代表后面接的是lua脚本,需要redis使用lua解析器;
2 代表接下来两个参数为为KEY的参数,即为 key1 key2;
first、second代表ARGV的附加参数;
二、PHP的demo12$lua = "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}";$s = $redis->eval($lua,array('key1','key2','first','second'),2);
eval(lua脚本字符串,参数数组,前几个为key参数);
1、一次性获取所有的hash结构的所有值1234$lua = "local ret={}; for i,v in pairs(KEYS) do r ...
Lua 学习 chapter24
目录
协程
yield
人人真真的生活过,学习过,改变过,努力过,才能创造出一个满意的自己。
协程
协程是一系列的可执行语句,拥有自己的栈、局部变量和指令指针,同时协程又与其他协程共享了全局变量和其他几乎一切资源。线程和协程的主要区别在于,一个线程程序可以并行运行多个线程,而协程却需要彼此协作的运行,即任意指定时刻只能有一个协程运行。
协程相关的函数都在coroutine表中,其中create为创建协程函数,参数为协程要执行的代码函数(协程体)。它会返回一个thread类型的协程。
一个协程拥有四种状态:挂起,运行,正常和死亡。
当一个协程被创建的时候,它处于挂起状态。函数resume用于启动或再次启动一个协程的运行,并将其状态由挂起改为运行。协程函数(协程体)执行完毕之后进入死亡状态。当使用协程A唤醒协程B的时候,协程A即不是挂起状态(因为不能唤醒协程A),也不是运行状态(因为B正在运行)。所以A此时的状态就被称为正常状态。
lua语言一个非常有用的机制是通过一对resume-yield来交换数据,第一个resume函数(没有对应等待它的yield)会把所 ...
Mac上搭建lua环境并连接mysql
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。(以上摘抄自菜鸟教程)
鉴于Lua的诸多优势,我想在接下来的开发中应用Lua去完成一些需要脚本实现的工作。本文将记录我在Mac上搭建Lua的开发环境搭建以及实现对mysql的数据库访问。
1. Lua安装源码编译安装12345curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gztar zxf lua-5.3.0.tar.gzcd lua-5.3.0make macosx testmake install
由于mac的当前系统版本下,连root用户都无法在/usr目录下创建写文件,故需要到lua的Makefile文件中将所有需要创建到/usr目录下的文件改到本用户目录下,Makefile的部分配置信息如下:1234567INSTALL_TOP= /usr/localINSTALL_BIN= $(INSTALL_TOP)/binINSTALL_INC= $(INSTALL_TOP)/includeIN ...
使用LUA脚本绕过Applocker的测试分析
0x00 前言
在之前的文章《Bypass Windows AppLocker》曾对绕过Applocker的方法进行过学习,而最近看到一篇文章介绍了使用LUA脚本绕过Applocker的方法,学习之后产生了以下疑问:绕过原理是什么呢?能绕过哪种AppLocker的规则呢?适用条件又是什么呢?
文章地址:
https://homjxi0e.wordpress.com/2018/03/02/whitelisting-bypassing-using-lua-lanuage-wlua-com/
0x01 简介
本文将要介绍以下内容:
LUA脚本简介
绕过测试
绕过原理
适用条件
防御方法
0x02 LUA脚本简介
轻量小巧的脚本语言
用标准C语言编写
可以被C/C++ 代码调用
可以调用C/C++的函数
在目前所有脚本引擎中的速度最快
0x03 Windows系统下执行LUA脚本
1、安装Lua for Windows,下载地址:
http://files.luaforge.net/releases/luaforwindows/luaforwindows
2、输出hello worl ...
Lua 学习 chapter25
目录
自省机制
访问变量
钩子
调优
沙盒
只有疯狂过,你才知道自己究竟能不能成功。
自省机制
通过debug.getinfo(foo),函数就会返回一个包含该函数有关的一些数据的表。
source: 该字段用于说明函数定义的位置。如果函数定义在一个字符串中(通过调用load),那么source就是这个字符串:如果函数定义在一个文件中,那么source就是使用@作为前缀的文件名。
short_src:source精简版
linedefined:源代码中第一行
lastlinedefined:最后一行
what:该字段用于说明函数的类型。lua函数就是lua,c函数就是c,位于主函数就是main
name:函数的适当名字,例如保存该函数的全局变量名称
namewhat:说明一个字段的含义,可能是”global”,”local”,”method”,”field”或”“(空字符串)
nups:函数的上值个数
nparams:函数参数个数
isvararg:该字段表明该函数是否为可变长函数
activelines:该 ...
Lua中的协程
Lua中的协程和其他变量一样,都是第一类值(first-class alue),可以被保存在变量中,可以被作为参数传递,可以被函数返回。
协程有4种状态:挂起(suspended),运行(running),死亡(dead)和正常(normal)。
Lua为协程提供了3个基础接口:create,resume和yield。
#coroutine.create
创建一个新的协程,并为它的运行分配一个独立的栈
协程处于挂起状态(suspended)
接受一个函数作为参数,这个函数就是协程的主程序块
返回这个协程
挂起点被设置为主程序块的第一句
#coroutine.resume
启动一个协程(第一次启动或从暂停状态启动)
自身(如果是协程的话)处于正常状态,被启动的协程处于运行状态
第一个参数为所要启动的协程
协程从它的挂起点开始执行
一直执行到被挂起或终止
导致协程终止的情况有两种:它的主程序块正常返回、运行过程中出错
执行结束后,控制权递交给此协程被激活的地方
#coroutine.yield
挂起一个协程
协程处于挂起状态 ...
Goto in LuaJIT
Lua 在 5.2 之后的版本,加入了 goto 这个关键字,用来控制程序跳转到指定 label。我们可以利用这个特性,来模拟 continue 的实现。需要注意的是 goto 只能跳转到 label,而 ::name:: 的格式就可以设置一个 label。
for i=1,5 do
if i == 3 then
goto continue
end
print(i)
::continue::
end
这样就简单实现了 continue。但是有些同学可能会有疑问,这是 Lua 5.2 的特性,我们都知道 OR 中使用的 Lua 5.1,那如何使用?
其实我们只需要使用 LuaJIT 就可以解决这个问题了。在 LuaJIT 的主页上有这个介绍:
LuaJIT supports some language and library extensions from Lua 5.2. Features that are unlikely to break existing code are unconditionally enabled:
...
lua使用教程
文章目录
</div>
<p>闲来无趣,稍微看了一会lua…</p>
运行1.命令行运行lua命令,在lua的shell中执行语句12345zhubenshuli@raspberrypi /var/www/lua_program $ luaLua 5.3.1 Copyright (C) 1994-2015 Lua.org, PUC-Rio> ("hello world!")hello world!>
2.使用lua命令直接执行脚本文件12zhubenshuli@raspberrypi /var/www/lua_program $ lua test.luahello world!
3.像shell一样运行123456zhubenshuli@raspberrypi /var/www/lua_program $ cat hello.lua#!/usr/local/bin/luaprint("hello world!")zhubenshuli@raspberrypi /var/www/lua_p ...