病毒的N-gram特征提取系统(java编程与数据处理细节记录)

病毒检测是一个常见的模式识别问题。传统的病毒检测方式以病毒特征码为基础,对文件进行特征匹配。这样的检测方式不能很好的检测未知病毒。未知病毒的特征码尚未纳入特征码数据库,所以不能立即识别。杀毒软件厂商需要对病毒进行分析,然后才能防御该未知病毒的攻击。这样的模式不利于现今的网络环境,最近基于机器学习的检测方法被提出,并显示出了良好的效果。仅做病毒检测的准确率已经达到了99%以上。
常见的机器学习方法一般为特征提取->数据分析建模。本文的主要内容为病毒的N-gram特征提取系统。N-gram特征常见于自然语言处理中,现在我们将该特征引入病毒检测问题。N-gram需要将n个词连起来作为一个特征。病毒中一个词即一个bit序列,一般取4-bit为一个gram。4bit即hex编码,可用DumpHex软件提取hex编码。N-gram特征以此有重复地提取n个hex作为一个特征,比如有hex序列:ff
00 22 32 3a,那么可以得到4-gram: ff 00 22 32 和 00 22 32
3a。每个4-gram特征含有4byte。然后我们依据每个特征与分类类别的互信息值进行特征提取(互信信息恒大于零):

IG[j]=∑vj=0.1CP(vj,C)log(P(vj,C)/(P(vj)P(C)))

其中$P(v_j,C)$表示j特征为vj且类别为C的概率(占所有文件的比例),$P(v_j)$表示j特征为vj的概率,$P(C)$为类别C的概率,如果IG值为0,表示不相关;越大相关性却强。
我们选取IG值最大的几个特征(例如,我们选取500个)。
一般上病毒的数据集比较大,几百MB到几十GB不等,其中几乎包括所有的N-gram(该实验中,N=4)。内存将无法存储所有的特征信息,因为最差的情况下,总共有1<<32个不同的4-gram。所以我采取分块处理的方式,将N-gram分为256个batch,batch
i 处理前缀为 i 的特征,将这批特征的最大500个存入文本。256个子处理程序运行完成后,再结合256个文本中的数据,产生最后的特征。
这里,即使每个batch只处理1<<24个n-gram,我们仍难以对这些n-gram进行排序。同样的,我将这些数据分而治之。

Java编程技术

因为这是我第一次用Java编写较完整的项目,所以这次编程编写得比较艰难,Java与C++还是有比较大的出入。下面记录编程过程中出现的问题,供以后查看。

  1. 数组不能直接在申明的时候定义,即不能 int a[10];

  2. 对象数组申明之后,让要对数据中的每个对象进行创建操作,sArray[i] = new String();

  3. >>>表示无符号位移。

  4. FileInputStream用于输入字节流,Scanner也可用于文本数据读取。PrintWriter用于文本流输出。

  5. File类型不用close,其length()方法可以得到文件的大小(byte)。

  6. Java中将char数组转换成String时,将会拷贝所有内容,而不是遇\0停止。

  7. 排序可用Array.sort(array, new Comparator()){ public int compare(... ...

  8. new
    File("")得到当前文件夹,getAbsolutePath得到绝对路径。File.getSeperator是静态方法,可以得到该系统的路径分割符。file.listFiles可以得到路径下的所有文件。

  9. <<操作符的优先级比=低,尽量都加()。

类间处理进度消息传递

在软件编写过程中,我们可能会碰到这样的情况:A是界面类,B为处理类。A在交互过程中会触发B,B可能是个耗时的任务,所以A要输出B的处理进度。(一般上处理进程与界面进程要分开,这个内容放在后面讲。)这时,我们要对B设定一个Listener,监听B处理的进度。具体的参照如下代码
A中B(WorListBuilder)触发代码: WordListBuilder wordListBuilder = new
WordListBuilder(500, benignFilePath, malwareFilePath);
wordListBuilder.setOnProcessingListener(new OnProcessingListener(){ @Override
public void onProgress(int progress) { informationPresenter.append("Batch:" +
progress + " is being processed.\n"); } }); B中代码: public class WordListBuilder
extends Thread{ WordListBatchBuilder batchbuilder; public interface
OnProcessingListener{ public  void onProgress(int progress); } public
OnProcessingListener mOnProcessingListener; public void
setOnProcessingListener(OnProcessingListener onProcessingListener){
mOnProcessingListener = onProcessingListener; } ..... 这样就能使用回调函数监听B内的消息了。

Java多线程初步

继承runnable共享类内数据。扩展thread不共享类内数据。 thread建议用start函数启动,建议使用runnable接口。

编程风格注意要点


  1. 程序中尽量不要出现数字。

  2. 相同的代码封装成函数,便于修改。

  3. 函数功能要单一。

  4. for循环的下标尽量有意义。

时间: 2024-10-13 12:15:58

病毒的N-gram特征提取系统(java编程与数据处理细节记录)的相关文章

《linux系统及其编程》实验课记录(六)

实验 6:Linux 文件系统 实验环境: 安装了 Red Hat Enterprise Linux 6.0 可运行系统,并且是成功验证系统.有另外一个无特权用户 student,密码 student 的账户存在. 实验目标: 更好的理解 Linux 文件系统基础,包括创建和使用链接;使用 locate 和 find 命令查找文件;归档和压缩文件. 实验背景: 每次启动的时候,你的系统的主硬盘驱动器都开始发出讨厌的噪音. 你怀疑硬盘可能要寿终正了,其中的人数据也要跟着陪葬了.由于你之前没有进行过

适用于即时系统并发编程的新的java线程模型,记我的第一篇英文翻译

1:介绍:      传统意义上的即时系统是有经验的专家的领域,因为他们能处理多种定制的内核,非标准的并且大多数是低级的语言,供应商提供的定制的I/O接口.这就要求有一种新的java线程模型来解决这种状况,这种模型解决当前及时嵌入系统的四个缺陷:安全,性能,可移植性.程序调试时间.安全是当前编程语言和及时系统在复杂性与定义不清的接口上折中的办法,这些语法不能成为正式的保证系统安全的语法:性能受到威胁是因为工程师必须接受及时系统所提供的无论什么级别的操作,如果那些操作过高或过低都会导致非必要的日常

1.JAVA 编程思想——对象入门

对象入门 欢迎转载,转载请标明出处:    http://blog.csdn.net/notbaron/article/details/51040219 如果学JAVA,没有读透<JAVA 编程思想>这本书,实在不好意思和别人说自己学过JAVA.鉴于此,蛤蟆忙里偷闲,偷偷翻看这本传说中的牛书. 面向对象编程OOP具有多方面吸引力.实现了更快和更廉价的开发与维护过程.对分析与设计人员,建模处理变得更加简单,能生成清晰.已于维护的设计方案. 这些描述看上去非常吸引人的,不过蛤蟆还是没啥印象(至少到

52 java编程思想——创建窗口和程序片 程序片限制

52.java编程思想--创建窗口和程序片 程序片限制 出于安全缘故,程序片十分受到限制,并且有很多的事我们都不能做.您一般会问:程序片看起来能做什么,传闻它又能做什么:扩展浏览器中WEB 页的功能.自从作为一个网上冲浪者,我们从未真正想了解是否一个WEB 页来自友好的或者不友好的站点,我们想要一些可以安全地行动的代码.所以我们可能会注意到大量的限制: (1) 一个程序片不能接触到本地的磁盘.这意味着不能在本地磁盘上写和读,我们不想一个程序片通过WEB页面阅读和传送重要的信息.写是被禁止的,当然

《Java编程那点事儿》读书笔记(七)——多线程

1.继承Thread类 通过编写新的类继承Thread类可以实现多线程,其中线程的代码必须书写在run方法内部或者在run方法内部进行调用. public class NewThread extends Thread { private int ThreadNum; public NewThread(int ThreadNum){ this.ThreadNum = ThreadNum; } public void run(){ try{ for(int i = 0;i < 10;i ++){ T

Java编程中“为了性能”尽量要做到的一些地方

下面是参考网络资源总结的一些在Java编程中尽可能要做到的一些地方. 1. 尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 第一,控制资源的使用,通过线程同步来控制资源的并发访问: 第二,控制实例的产生,以达到节约资源的目的: 第三,控制数据共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信. 2. 尽量避免随意使用静态变量 要知道,当某个对象被定义为stataic变量所

Java编程最差实践常见问题详细说明(1)转

Java编程最差实践常见问题详细说明(1)转 原文地址:http://www.odi.ch/prog/design/newbies.php 每天在写Java程序, 其实里面有一些细节大家可能没怎么注意, 这不, 有人总结了一个我们编程中常见的问题. 虽然一般没有什么大问题, 但是最好别这样做. 另外这里提到的很多问题其实可以通过Findbugs(http://findbugs.sourceforge.net/ )来帮我们进行检查出来. 字符串连接误用  错误的写法: Java代码   Strin

Java编程提高性能时需注意的地方

最近的机器内存又爆满了,除了新增机器内存外,还应该好好review一下我们的代码,有很多代码编写过于随意化,这些不好的习惯或对程序语言的不了解是应该好好打压打压了. 下面是参考网络资源和总结一些在java编程中尽可能做到的一些地方 1.尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面 第一,控制资源的使用,通过线程同步来控制资源的并发访问 第二,控制实例的产生,以达到节约资源的目的 第三,控制

《Java编程思想(第4版)》pdf

下载地址:网盘下载 内容简介 编辑 本书赢得了全球程序员的广泛赞誉,即使是最晦涩的概念,在Bruce Eckel的文字亲和力和小而直接的编程示例面前也会化解于无形.从Java的基础语法到最高级特性(深入的面向对象概念.多线程.自动项目构建.单元测试和调试等),本书都能逐步指导你轻松掌握.[1] 从本书获得的各项大奖以及来自世界各地的读者评论中,不难看出这是一本经典之作.本书的作者拥有多年教学经验,对C.C++以及Java语言都有独到.深入的见解,以通俗易懂及小而直接的示例解释了一个个晦涩抽象的概