首页 > 范文大全 > 正文

网络嗅探器中Lua嵌入脚本的设计

开篇:润墨网以专业的文秘视角,为您筛选了一篇网络嗅探器中Lua嵌入脚本的设计范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘 要:网路嗅探器能够分析出一段网络中数据包使用的协议、IP、源端口等内容,经常用来检测一段网络的运行状况,排除网络故障。网路协议纷繁众多,采用Lua嵌入脚本来解析协议数据包,能够使程序灵活的扩展。本文简要介绍了嗅探器和Lua的概念;然后着重阐述了Lua脚本嵌入方案关键技术,对如何实现系统功能给予详细的描述;最后展示了Lua嵌入脚本实现的功能。通过测试表明,Lua嵌入脚本模块能够有效的使用新编的嵌入协议脚本来解析相应数据包。

关键词:网路嗅探器; Lua脚本;网络协议

中图分类号:TP393.09 文献标识码:A DOI:10.3969/j.issn.1003-6970.2013.07.019

本文著录格式:[1]苏建美,周仲礼,包俊强,等.网络嗅探器中lua嵌入脚本设计[J].软件,2013,34(7):55-58

0 引言

对于常用的网络协议如IP、TCP和UDP,我们可以在软件中直接编写代码来解析数据包的功能,但是对于其他的协议应用,我们不能直接写到软件中,一方面工作量很大,不现实,同时会使代码结构十分臃肿。一种很好的方法就是利用Lua嵌入脚本来解析这些额外的协议,为软件提供扩展功能。采用Lua嵌入脚本可以直接修改相应的脚本文件,从而嵌入到系统中。

Lua是一门嵌入脚本语言,最近逐渐被人们关注,并应用到各个领域中。当前有许多软件的扩展功能都是由Lua嵌入脚本实现的,比如魔兽世界、博德之门、愤怒的小鸟等等。Lua的使用赢得了人们的关注与好评。

1模块设计

1.1嗅探器

嗅探器是一种监视网络数据运行的软件设备。协议分析器既能用于合法网络管理也能用于窃取网络信息。网络运作和维护都可以采用协议分析器:如监视网络流量、分析数据包、监视网络资源利用、执行网络安全操作规则、鉴定分析网络数据以及诊断并修复网络问题等等。嗅探器是一种利用以太网特性把网络适配卡(NIC,一般为以太网卡)置为杂乱(promiscuous)模式状态的工具,一旦网卡设置为这种模式,它就能接收传输在网络上的每一个信息包,这也是进行网络数据包分析的基础。

1.2 Lua脚本语言

Lua 是一个十分小巧的脚本语言,是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所组成并于1993年开发。 其设计目的是为了嵌入应用程序中,为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译和运行。

1.3 Lua嵌入脚本模块设计

由于模块核心部分只有协议解析器-解析用户添加的协议设备。在软件启动的时候,协议解析器会以对象为参数来执行配置文件init.lua,用户可以在该配置文件中添加代码以实现添加新的协议到协议树中。当执行完init.lua配置文件之后,接下来由系统自动确定协议解析函数的调用流程,在解析过程中不断把解析结果传递给抓包模块,最后直到不能再解析为止。其总的流程图见图1 1。

在本模块中,以协议解析器类为核心来构建整个模块中各个类之间的关系,类关系图如图1 2所示。在程序启动之后,协议解析器的一个对象会先把系统API函数注册到lua_State对象中,通过调用LuaRegistrar完成,然后执行init.lua文件。如果在该文件的执行过程中添加协议,那么这个协议解析器将会用LuaDumper的一个对象来把解析函数编译成二进制,并保存在私有目录中。而且该协议将会被作为协议结点添加到协议树中,这颗协议树的根节点就是协议解析器管理的ProtocolNode对象。当协议网络数据包传递过来,ProtocolAnalyser对象会把数据包装成ProtocolPacket对象传递给Lua解析函数,解析的结果存放到ProtocolHeader的一个对象中。

在本模块中,需要将ProtocolAnalyser、ProtocolNode、ProtocolPacket和Protocolheader的对象传递为本模块的一些Lua API函数的参数。如第2章中的关键技术中提到的,需要进行userdata的参数类型检查,采用了通过为每一个类的对象定义元表的方法来识别类型。在这4个类中定义了一个static函数,该函数用来返回元表名:

static const char *GetMetaTableName();

这样做是为了在编程时保证为每一个对象创建元表与获取元表时做到编程的一致性。

2 系统协议测试

为了测试的需要,将所有协议交由本模块解析,初始化脚本init.lua代码见图2-1,其中参数...为系统自动传递过来ProtocolAnalyser的一个对象。函数AnalyserDoFile来传递ProtocolAnalyser对象作为参数执行协议脚本文件。

我们添加IP、UDP、TCP和HTTP协议,全组织在一颗树中。其中Analyse为解析UDP数据包的解析函数,调用Header.SetField来设置字段的信息。参数...表示函数 AnalyserDoFile传递过来的ProtocolAnalyser对象。在编写完解析函数之后调用系统提供的API函数ProtocolAnalyser.GetScriptRootNode来获得协议树的根结点,调用ProtocolAnalyser.GetSonScript来获得UDP的底层协议IP协议,在确定key=17之后,调用ProtocolAnalyser.AddProtocol来添加UDP协议到IP协议的上层协议中。 (见图2 2)

在测试过程中,网络是联通的,能够解析大量的THHP协议,解析效果见图2 4、图2 5和图2 6。在网络层中,协议为IP协议,从解析结果,我们发现上层协议为TCP协议(见图2 4),于是在传输层中调用TCP协议的解析函数来解析传输层数据包,我们可以用简单的方式判别上层协议是否为HTTP:如果源端口或者目的端口之一为80,那么就认为是HTTP协议(见图2 3)。可以通过修改图2 1中的LuaScript/GetAppKey.lua脚本文件中的GetAppkey函数来改变这个简单的判别方式。从图2 5中我们发现目的端口为80,所以确定上层协议为HTTP协议。最后调用HTTP协议的解析函数来依次显示前10行字符串值,见图2-6。

3 系统运行测试

3.1 错误提示功能

本系统中十分重要的是对用户编写的脚本中的错误信息进行报告。错误信息包括脚本的语法信息和运行时错误信息。语法错误在执行init.lua文件的时候就能够检查出来;而运行时的错误信息,有的可以在执行init.lua文件的时候检查出来,有的却要在调用数据包的解析函数才能报告出来。

3.1.1语法错误的报告

在Lua中,表示函数参数的括号要成对出现,否则会报错。我们把图2 1中init.lua代码中的第19行中的右括号删除,见图3-1,报告出来缺少右括号,见图3-3。在AnalyserDofile执行协议脚本文件时,如果有语法错误,这也能够报告出来。如图2 1的init.lua代码中的15行添加UDP协议时,我们也刻意把LuaScript/UDP.lua文件中的第2行function Analyse(data, result)的右括号去掉,见图3-2,系统启动时也将报告错误信息,见图3-4。

3.1.2运行错误报告

除语法错误的报告之外,运行的错误信息报告也十分重要。这一部分主要是指参数函数的参数不准确。初始化脚本文件init.lua中第10行的设置最大加载解析函数个数的函数ProtocolAnalyser.ResetLoadSize的第一个参数必须为ProtocolAnalyser对象,如果为nil,见图3-5,则在执行init.lua时该错误信息就能够报告出来,见图3-6。

除此之外,还有一些运行时错误信息不能在执行init.lua时捕获到。比如在协议解析函数中的参数类型错误。比如函数Header.SetProtocolName的第1个参数必须为协议解析函数的第2个参数ProtocolHeader对象,而我们把图2 1 中UDP.lua的第3行的这个函数的参数改为解析函数的第1个参数ProtocolPacket对象,见图3-7,则在遇到UDP数据包并调用该解析函数的时候报告错误,见图3-8。

4 总结

本文主要研究设计了网络嗅探器定协议的Lua嵌入脚本的设计方案。实现了协议脚本的添加、解析网络数据包以及脚本错误报告等重要功能。

本方案具备一些优点:脚本的编写规则简单,能够报告错误信息,协议的调用系统自动确定,减轻了用户的负担,体现了设计方案的友好特征。

参考文献

[1] 王晓东,夏靖波.通信网络程序设计[M].西安:西安电子科技大学出版社,2011.

[2] 寇晓蕤,罗军勇,蔡延荣.网络协议分析[M].北京:机械工业出版社,2009.

[3] ROBERTO I.Lua程序设计[M].周惟迪,译.第2版.北京:电子工业出版社,2008.