- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
软件安全实验
软件安全实验二
实验报告
班 级:
学 号:
姓 名;
指导教师:
实验二 恶意软件特征代码法检测
1. 实验目的
1.1掌握基于特征匹配的误用检测技术原理和方法
1.2掌握基于双数组-AC算法的多模式特征匹配算法实现
1.3利用构建的自动机扫描目标文件
2. 实验内容
2.1流程图
2.2构建自动机所定义的数据结构
struct out
输出函数的链表结构体
struct total
记录边数与状态数的结构体
struct AC
存储自动机的邻接表
struct NEXT
NEXT表的结构体
2.3构建自动机所使用的函数
void init_AC(AC* A,int n)
初始化自动机的邻接表
AC* CreatAC(AC *A,total t)
创建自动机的邻接表
void init_ne()
初始化NEXT表函数
NEXT* CreatNEXT(AC A[],total t)
创建NEXT表,同时创建BASE表,CHECK表
void outfun(char *output[],AC *A,total t,out *head)
创建输出函数
void Failure(AC *A,total t,out *head)
创建失效函数
AC* depthfun(AC *A,total t)
计算各状态的深度
void print(AC *A,total t,int *f,out *head)
读取测试文本并输出检测结果
2.4转向函数、失效函数、输出函数的构建过程
1. 转向函数
转向函数通过NEXT,BASE,CHECK来实现。由于邻接表存储了所有节点,因此循环查找所有头节点,若next不为NULL说明不是叶节点,可计算NEXT。若为叶节点则查找下一个状态,知道所有状态都查找过则推出。创建NEXT表的过程先从根节点开始,一层一层的创建,同时计算BASE表中的值,并填充CHECK表中的值,每一层结束后在遍历左侧的邻接表进行下一层的NEXT表创建,知道全部状态创建完成为止。Next为转向函数表(数组、链表),下标是位置偏移量,输出是状态值。Base表(数组),下标是状态值,输出是Base值。Next表中当前状态为s,输入为c时,假设应跳转为状态t,状态t在Next表中的位置=状态S的位置+状态S的Base值+输入c的ASCII码值。Check表(数组),下标是状态值,输出是下标状态的父状态的值。在创建的过程中,每一层的状态可能要作为下一层状态的父状态,因此在邻接表中记录NEXT中的pos,存储在AC中,方便最后特征码的检测。
2.失效函数
为了计算深度为d的s状态的失效函数值,我们考虑深度为d-1的状态r,存在某个输入a,使得g(r, a) = s。执行以下步骤来创建失效函数:
Step1:state = f(r)。
Step2:f(s) = g(state, a)
其中a根据CHECK表得出,并现先行确定初始状态和第一层失效状态的失效函数为f(s)=0。
3.输出函数
输出函数以链表的方式储存。要求遍历所有从根状态到叶状态的通路,在每个分支节点处将此状态压栈,在遍历完这一个分之后弹栈,并遍历此状态的另一分支,同时在进行到每一节点的同时将字符压栈,并与模式集进行比较,若存在此模式则链接到输出链表上。在每一个状态不仅要比较本身的字符串与模式集,还需要比较此状态的失效状态字符串与输出链表,最终创立一个单向链表,保存所有需要的输出函数
。
2.5建立的NEXT,BASE,CHECK表检测结果
NEXT表中数据
BASE CHECK数据 以及失效函数
检测结果
TEXT.TXT
TEXT.TXT
sheishisboyfriendandheisabadguyandhisdoyishers
RESULT.TXT
RESULT.TXT
he 3
she 3
his 8
he 22
his 37
he 44
she 44
hers 46
从以上结果可以看出,NEXT BASE CHECK建立成功,数值正确,失效函数建立无误,检测结果经检查无误。
由此,双数组AC的实现成功。
3.程序源代码
#include iostream
#include stdio.h
#include stdlib.h
#include stack
#include string.h
using namespace std;
#define max 256
typedef struct out
{
char s[10];
int id;
struct out *next;
}out;
typedef struct total
{
int n;
int e;
}total;
typedef struct AC
文档评论(0)