`
cwqcwk1
  • 浏览: 86794 次
文章分类
社区版块
存档分类
最新评论

skynet项目lua代码简单加密

 
阅读更多
最近在看skynet的代码,总体感觉跟 erlang很像,理念都是基于Actor模型,即万物皆Actor,Actor之间通过发送消息进行通信。(这里说的“万物”倾向于表示有能动作用,有独立行为的个体。)

不同的是,skynet使用 c 和 lua实现,这两个语言相较erlang比较流行。skynet的Actor是指skynet服务,skynet服务类似erlang进程,调度方式也有点接近,skynet启动时会初始化多个调度线程,用于同时处理多个服务,每个服务都有一定的调度次数约束(处理消息条数),挂起或达到约束就失去调度权。不过skynet服务的调度不是轮转,而是消息驱动方式(先来消息先调度)。实现上,每个服务都是一个lua state,也就是一个lua虚拟机,效果等同沙箱,实现隔离。另外,lua state本身没有多线程支持的,skynet实现上在一个线程运行多个lua state实例。

好了,切入今天的主题吧,skynet项目lua代码加密。文章利用lua编译成二进制实现加密,方法比较简单。

lua编译

lua代码可以被编译二进制文件,就是lua可以同时支持源代码加载和二进制加载两种方式。
但是,lua编译成二进制有一点使用限制,lua二进制支持跨平台,跨版本,但必须在相同字长的机器上。就是说,32位lua编译的二进制不能在64位下使用。另外,虽然官方表示可跨版本,但也声明了跨版本可能存在不兼容的情况,具体情况没有说明。
另一点,lua代码编译成二进制,不意味着执行更快,这个过程只是预编译,将代码编译成字节码(bytecodes)。因为lua源代码执行前也要生成字节码,所以二进制方式在一定程度上提高了代码加载的速度。


lua编译器

luac [ options ] [ filenames]
options说明:
options
说明
-l
生成lua编译后字节码的可视化数据,这对于学习lua虚拟机很有帮助
-o file
编译lua代码,输出文件为file。默认生成 luac.out
-s
写入输出文件时去掉调试信息。可以减少输出文件的大小,但错误信息就比较简单,例如,少了行号和局部变量名
-v
显示版本信息


编译skynet项目的lua脚本

skynet没有提供工具来生成,所以这里简单写个脚本演示下。目前skynet没有支持luajit
#!/bin/bash

LUAC=./3rd/lua/luac
mkdir -p bin

Luas=`find . -name "*.lua"`
for file in $Luas
do
filename = `basename $file`
$LUAC -o bin/$filename $file
done
脚本执行完后,编译后的代码就会输出到 bin 目录。为了代码能够被执行到,还需要修改配置文件,所有的lua文件都要从bin路径查找。
以 examples/config 为例
root = "./"
thread = 8
logger = nil
logpath = "."
harbor = 1
address = "127.0.0.1:2526"
master = "127.0.0.1:2013"
start = "main" -- main script
bootstrap = "snlua bootstrap" -- The service for bootstrap
standalone = "0.0.0.0:2013"
luaservice = root.."bin/?.lua;"
lualoader = root.."bin/loader.lua"
snax = root.."bin/?.lua"
-- snax_interface_g = "snax_g"
cpath = root.."cservice/?.so"
-- daemon = "./skynet.pid"


lua代码加密的另一种方式

前面介绍了把lua代码编译成二进制达到加密目的,这已经足够了。如果想进一步加密代码,可以使用下面的方法。
luac编译时,通过以下函数输出到文件,这里以异或加密为例说明。
// luac.c

static int writer(lua_State* L, const void* p, size_t size, void* u)
{
int ret = !0;
size_t i =0;
char* pp = (char *)malloc(sizeof(char*)*size);
UNUSED(L);
memcpy(pp, p, size);
for(;i<size;i++) pp[i] ^=250;
ret =(fwrite((void*)pp,size,1,(FILE*)u)!=1) && (size!=0);
free(pp);
return ret;
}
lua执行代码也要相应做修改,否则无法执行。
//lauxlib.c

static const char *getF (lua_State *L, void *ud, size_t *size) {
LoadF *lf = (LoadF *)ud;
(void)L; /* not used */
if (lf->n > 0) { /* are there pre-read characters to be read? */
*size = lf->n; /* return them (chars already in buffer) */
lf->n = 0; /* no more pre-read characters */
}
else { /* read a block from file */
/* 'fread' can return > 0 *and* set the EOF flag. If next call to
'getF' called 'fread', it might still wait for user input.
The next check avoids this problem. */
if (feof(lf->f)) return NULL;
*size = fread(lf->buff, 1, sizeof(lf->buff), lf->f); /* read block */
}
do{size_t i=0; for(;i<*size;) lf->buff[i++] ^= 250;}while(0);
return lf->buff;
}
这样就可以了,但是要注意了,不能同时修改以上两处内容,编译和执行要分开处理,否则无法编译lua代码。(skynet版本不同,代码可以不同,仅参考)


luajit编译

按照skynet的计划,lua有可能换上luajit。luajit也支持二进制编译,lua代码加密方式类似。
luajit -b filename newfile
luajit -b test.lua test.out # Save bytecode to test.out
luajit -bs test.lua test.out # As above, Strip debug info (default).
luajit -bg test.lua test.out # Keep debug info
luajit -be "print('hello world')" test.out # Save cmdline script
luajit -bl test.lua # List to stdout
luajit -bl test.lua test.txt # List to test.txt
luajit -ble "print('hello world')" # List cmdline script

最后语

最后回顾下,文章利用lua编译成二进制实现加密,编译成字节码,可直接被lua加载,比较实用。比较之下,改编译器代码不是很适用,这里只是提供可能的思路。
好了,今天就到这里。再研究下skynet的实现,继续做分享。

参考:http://blog.csdn.net/mycwq/article/details/47406337
分享到:
评论

相关推荐

    skynet-crypty_windows(lua5.1)

    在Lua5.1版本中,我们将Skynet-Crypt模块引入Quick-Cocos2d-x项目,这涉及到两个主要步骤:一是编译Skynet-Crypt的C源代码以生成适用于Windows的动态链接库;二是编写Lua接口,使Lua脚本可以直接调用加密功能。 1. ...

    skynet 账号密码des加密

    "skynet 账号密码des加密"是一个关于如何使用DES(Data Encryption Standard)加密算法来保护用户信息的教程或项目。DES是一种对称加密算法,它在1970年代由IBM开发,并在1977年被美国国家标准局采纳为标准。尽管...

    skynet debug 部署 vscode环境下的debug 断点调试

    此文件夹与“skynet”文件夹位于同一层级,这意味着它们可能分别存储了项目的核心代码和调试相关的设置。为了进行调试,我们需要在VSCode中创建一个`.vscode`目录(如果尚未存在),并在其中创建一个名为`launch....

    Skynet基础入门例子详解(7)项目源码

    Skynet支持服务的动态加载和卸载,允许开发者在不中断服务的情况下更新代码。源码中可能会包含这部分的实现,帮助我们理解如何实现热更新。 七、实例分析 通过对提供的"e7"子文件的分析,我们可以进一步理解Skynet...

    skynet 基础例子完整代码

    通过分析示例中的代码结构,我们可以学习到如何在Skynet项目中合理划分模块,定义服务接口,以及如何组织lua脚本。 7. **调试与日志** 在开发过程中,调试和日志记录至关重要。Skynet提供了一些内置工具,用于服务...

    skynet 源码赏析

    启动 Lua 服务的方式与 C 服务类似,但过程更为简单: 1. 创建一个 Lua 上下文环境。 2. 加载并运行 Lua 脚本来初始化该服务。 #### skynet 的消息调度机制 skynet 的消息调度机制是其核心之一,主要包括以下几个...

    skynet的windows版本

    Skynet的核心源代码通常包括多个C语言文件,如`skynet.c`、`lua服务`.c等,它们提供了Skynet框架的基本功能。此外,还会有一个`start_skynet.bat`批处理文件,这是启动Skynet服务的便捷方式。 运行`start_skynet....

    Skynet 源代码文件功能简介.pdf

    Skynet是一个轻量级的网络服务框架,它的设计目标是为了能够轻松地处理网络通信、服务管理、内存...通过Skynet的源代码,开发者可以学习如何实现高效的服务管理、内存分配、网络通信以及与Lua脚本语言的集成等技术。

    如何调试lua

    对于在Cocos2D-X中调试Lua代码,本文将介绍两种方法:使用Decoda和LuaEdit。这两种工具各有优劣,Decoda是一款商用软件,功能强大但价格昂贵;LuaEdit则是开源免费的选择。本文将以Decoda为例进行详细介绍。 #### ...

    skynet_web:http websocket 支持 lua 天网

    由于 Lua 与 C 语言的良好集成,Skynet 可以高效地调用 Lua 代码,实现高性能的服务。 在压缩包文件名称列表中,我们只有一个文件名“skynet_web-master”,这通常表示这是一个 Git 仓库的主分支克隆。这个目录可能...

    Skynet框架教程-非常详细.pdf

    Skynet源代码的获取可以通过官方提供的方法来下载,之后通过编译源代码生成Skynet服务器程序,并通过运行它来启动服务。Skynet的代码目录结构清晰,从顶层到具体的API划分都非常有序,有利于开发者阅读和维护。 ...

    Skynet基础入门例子详解(6)项目源码

    4. **lua服务编程**:由于Skynet是基于Lua的,所以"e6"中的代码将会展示如何使用Lua进行服务编程。Lua语言简洁且易于上手,同时拥有丰富的库支持,使得开发者能够快速实现业务逻辑。 5. **调试与日志**:Skynet提供...

    Skynet基础入门例子详解(3)项目源码

    **Skynet基础入门例子详解(3)项目源码** Skynet是一个轻量级、高性能的服务化框架,主要用于构建分布式系统。这个项目源码是Skynet基础入门系列的第三部分,旨在帮助初学者深入理解Skynet的工作原理和用法。通过...

    skynet_vs2017.zip

    本压缩包中的"skynet_vs2017"包含了在VS2017下编译好的Skynet代码,可以直接导入到IDE中进行进一步的开发和调试,简化了开发者在Windows平台上的环境配置工作。 3. Lua语言支持 Skynet对Lua的紧密集成,使得开发者...

    Skynet基础入门例子详解(5)

    在本示例的源码中,你可能还会发现Skynet使用lua作为主要的编程语言,lua的简洁性和易读性使得Skynet的代码更易于理解和维护。同时,lua与C++的紧密集成也使得性能得以保证。 具体到文件`e5`,这可能是一个具体的...

    Skynet框架之菜鸟手册

    通过对例子代码进行分析,新手可以学习Skynet的编程范式以及如何在实际项目中应用。 六、原理 1. 启动流程 文档中会详细介绍Skynet的启动流程,包括服务加载、调度的机制。 2. 调用服务 Skynet服务之间的调用请求...

    Skynet基础入门例子详解(2)项目源码

    **Skynet基础入门例子详解(2)项目源码** Skynet是一个轻量级、高性能的服务化框架,广泛应用于游戏服务器开发。本篇将深入解析Skynet的基础入门示例,通过项目源码帮助读者理解其核心概念和技术实现。 首先,我们...

    skynet实现的斗地主服务端源码

    skynet实现的斗地主服务端源码,斗地主规则有改动,逻辑用lua实现

    skynet 云风分布式服务器

    Skynet使用Lua作为主要的编程语言,Lua语法简洁,易于学习,且与C++底层紧密集成,提供了高效的脚本执行性能。 总的来说,Skynet是一个强大的分布式服务器框架,它为游戏开发和其他实时应用提供了一种高效、灵活的...

Global site tag (gtag.js) - Google Analytics