如何让卷积神经网络人脸识别把熊猫识别为秃鹫

互联网资讯列表 - ITeye资讯频道
资讯月刊下载
第94期(15-12)
京东商品详情页应对“双11”大流量的技术实践
第94期(15-12)
2015年JavaScript开发者调查报告
京东商品详情页应对“双11”大流量的技术实践
第93期(15-11)
如果Java 失宠于Oracle,那么未来会怎么样?
已经火爆2年的Docker,其快速部署的特性,受到开发者的热烈欢迎,在测试、开发环境中被广泛使用,但却迟迟无法让企业放心在生产环境中大规模使用。 Docker过去一年的发展 安全:2015年4月推出的Docker 1.6版本,让使用者得以建立私有的Docker Registry,不必将映像档储存在Docker Hub上,Docker的安全性得到解决。 网络:过去Docker受人诟病的网络功能,也终于 ...
关于2016年对技术的预测众说纷纭,我有一些在MongoDB公司的朋友和我说了他们的预测。关于Kafka和Container Orchestration的预测看来非常正确。我还想补充的一点是,微服务仍将很重要,以及Apache Spark将会如同星星之火燎原。我觉得Scala、Go、Python将急剧上升,Java将保持稳定。很多很酷的新项目和技术会以大数据,云和devops的工作形式出现。让我们一 ...
几乎可以肯定的是,容器技术将在刚刚到来的新一年中继续重塑IT面貌;这里我们将一同了解接下来即将真实出现的几项重要征兆。 目前几乎每一款主流IT产品都要么直接采用容器技术、要么内置容器支持能力,而容器也将在刚刚到来的新一年中继续重塑IT面貌。 下面我们一起来看容器技术以及围绕其建立起来的生态系统如何通过六种关键性方式在2016年中进一步影响IT事务。 我们将看到更多实验性项目 这些实验性项目除了将容器 ...
开发者调查是 Stack Overflow 每 年都要进行的一次开发者用户调查问卷活动,调查对象为在 Stack Overflow 注册的开发者用户。和以往相比,2015 年的调查涵盖面更广,参与人数最多,调查结果包括 157 个国家的 26086 名开发者。在这些人中,有 6800 人是经过认证的全栈工程师,另外还有移动开发者 1900 人,前端开发者 1200 人。 做这项调查,Stack Ov ...
2015年已然过去,2016刚刚开始,回头将目光集中于去年的成就上,以及对将来科学趋势的预测。去年最令人瞩目的一个领域就是深度学习,它是机器学习中越来越流行的一个分支,看起来它会继续向前发展,并会运用到越来越多的行业和领域中。 在过去的一年中,我们有幸通过REoWORK节目与从事人工智能和计算机科学方面的许多大牛进行交流,我们期待在2016年会晤更多的专家,并向他们学习。 作为Q&A系列 ...
我记得几个月前看到Deep Dream研究员们(Leon A. Gatys, Alexander S. Ecker and Matthias Bethge)发布的文章,想着有人能把这些技术开发成API或者网页应用,使得大家能把自己的照片处理成具有各种艺术家风格的照片。所以当看见?ukasz Kidzinski 和Micha? Warcho? 的deepart.io上线时,我就打算试试这款产品,并 ...
文 / 雷欣,李理 从2015年ACL会议的论文可以看出,目前NLP最流行的方法还是机器学习尤其是深度学习,所以本文会从深度神经网络的角度分析目前NLP研究的热点和未来的发展方向。 我们主要关注Word Embedding、RNN/LSTM/CNN等主流的深度神经网络在NLP中的应用,这已经是目前主流的研究方向。此外,已经在机器学习或其它领域比较热门的方法,比如Multi-Model、Reasoni ...
本文作者基于论文阅读及实测,以尝试欺骗神经网络的方式,从工具安装到模型训练,逐步解析神经网络及其背后的数学原理。文章还提供了演示代码下载。 神奇的神经网络 当我打开Google Photos并从我的照片中搜索“skyline”时,它找到了我在八月拍摄的这张纽约地平线的照片,而我之前并未对它做过任何标记。
当我搜索‘cathedral’,Google的神经网络会找到我曾看到的大教堂和教堂。这似乎很 ...
与Android崛起相伴的其实还有战争,而其中最重要且最有争议性的,恐怕就是甲骨文和Google的官司了。 自2010年起,两家公司关于Android系统的一部分是否侵犯了甲骨文的版权和专利,一起争论不休,因为系统中使用了甲骨文拥有的Java。整个官司既持久,又充满戏剧性。 但Google似乎有些乏了,于是决定从下一代的Android N(应该会在2016年发布)开始,系统将不再使用Java A ...
今年的NIPS会议是当下人工智能和深度学习热情的一个聚焦点 —— 从中能够感受到机器学习领域的飞速发展,并且公开了两家新的人工智能初创公司。参会人数相比2014年的大会几乎翻倍(希望明年主办方能设置多个分场),一些受欢迎的工作坊内摩肩接踵。由于大会有将近4000人参加却只接收400篇论文,大部分人还是冲着学习和社交的目的而来。会议期间紧张的社交活动让我想起了Burning Man(美国的一个反传统狂 ...
【编者按】此文是根据京东资深Java工程师张开涛11月21日在msup主办的 into100沙龙第14期《京东商品详情页应对大流量的一些实践》演讲中的分享内容整理而成。 以下为主题内容: 大家来京东打开商品页一般会看到如通用版、闪购、全球购等不同的页面风格,这里面会牵扯到各种各样垂直化的模板页面渲染。以前的解决方案是做静态化,但是静态化一个很大的问题就是页面改版时需要重新全量生成新的静态页。我们有几 ...
近日,家住费城的Dylan Pierce做了一面“魔镜”。整体效果,以及跑程序时的状态如图1所示。他用Raspberry Pi跑程序,拆了一台27英寸BenQ显示器(amazon卖169刀)放在双面镜背面提供显示功能。为了让其更加美观,还特意做了一个木质边框。
看到过类似的作品(或者说项目)已经不下三次了。这或许也可以证明这的确是比较符合人们想要的未来感的产品形式之一。前两次看到分别是2013年 ...
GCM是一种向设备发送简单、可靠信息的技术服务。在过去的半年中,GCM所处理的消息数量增加了一倍有余,每天需要处理1500亿条消息,同时使用该服务的应用增加了四分之一,达到了75万个。以这些为前提,我们还在继续进行有效的更新,为开发者提供更好的服务。 谷歌云推送服务支持主题消息了:通过这种方式,轻易便可按组细分用户设备,立刻将消息发送给整个组的用户。现在我们很高兴地宣布,将支持应用免费不限制使用主题 ...
一个伟大的问题诞生在mechanical-sympathy Google邮件列表,或许已经有许多其他的伟大的问题诞生在此了。问题如下: 引用我不断地听说Docker,就好像他是切片面包以来最伟大的发明一样,但是我还听说低延迟应用在使用它的时候遭受打击。 没有谁比Azul Systems的技术副总裁、首席技术官和联合创始人Gil Tene更适合回答这个问题了。就像我们相信乔丹的三步上栏一样,我们总能依 ...
如今是数码时代,作为IT行业的支柱,软件几乎渗透了人类生活的方方面面。那么作为世界上最热门的行业之一,它的未来又是怎样的呢?本文总结了来自Skyport Systems公司、Ceridian公司、Tasktop公司还有Travel Tripper公司的专家所分享的针对2016年的预测观点。 预测一:告别以软件为中心的安全系统
Skyport Systems是一家提供超安全(hyper-secur ...
Mozilla发布了移动版和桌面版的Firefox 43。新版最重要的变化是发布了64位的Windows版本,但部分网站内容播放需要的插件可能不支持64位Windows版。其它新变化包括,跟踪保护功能允许用户控制黑名单,用户可以选择屏蔽额外的跟踪程序;用户可以在智能地址栏选择搜索建议;Android版加入标签音频指示器;新的开发者工具和bug修正,等等。 来自:Solidot
早在2011年,谷歌就推出最初的云端SQL,并且在整整两年半后成功商用。谷歌表示,经过此次升级,云端SQL的特征表现在:吞吐率达到比早期版本快7倍;服务能扩展至10TB数据,15,000 IOPS;每个实例运行的RAM空间为104GB——这些数字是第一版无法达到的。
随着此次升级,谷歌也改变了云端SQL的定价方案。现在,服务使用相同的实例类型作为计算引擎,正因为如此,也突出谷歌的定价的持续性使用 ...
引言 毫无疑问,神经网络和机器学习在过去几年一直是高科技领域最热门的话题之一。这一点很容易看出,因为它们解决了很多真正有趣的用例,如语音识别、图像识别、甚至是乐曲谱写。因此,在这篇文章,我决定编制一份囊括一些很好的Python机器学习库的清单,并将其张贴在下面。 在我看来,Python是学习(和实现)机器学习技术最好的语言之一,其原因主要有以下几点: 语言简单:如今,Python成为新手程序员首选语 ...
原文链接:The Story Behind the
译者:杰微刊-Leo Xu 一年半以前,我们对使用 WordPress 构建网站所需要采用的技术和开发流程进行大范围的重新思考。 现有的代码库和工作流程我们已经玩儿得很转了,但是10多年的历史遗留已经开始严重阻碍我们着手去构建用户所期望拥有的现代、快速并且对移动端友好的体验。看起来似乎开发者和设计师之间的协作还没 ...
算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。 快速排序使用分治法(Divide and conquer)策略来把一个串行 ...
& 上一页 1
热门互联网资讯
http://ask./docs/
qinghechaoge
原来,开涛是他,开涛的博客好牛的
jdk1.6还是属于sun公司的,被oracle收购后,之后的版本一点新的亮点都没有。我们现在的框架还 ...
hualongsheng1988
应该是Oracle JDK,当初oracle收购sun的时候,好多人都放弃了java,加上最近一段时间 ...
ieanwfg201
支持京东,支持强哥
SaaS会越来越被关注
我落伍了吗
dsjt 写道不使用API 还是不使用 oracle JDK??不使用 oracle JDK??
汪汪汪。。。
不使用API 还是不使用 oracle JDK??
这两个JDK有什么区别吗???
张开涛,原来是他。
甲骨文对此的态度当然是我不听我不听我不听。
white_crucifix
太多中文了,看了头疼,计算机词汇大多是舶来品,用单词没人会诟病吧。又不是日常对话。
基于用户行为的验证感觉是一个比较新鲜的想法呢?能够从根本上去区分用户和机器,不过这需要很强大而且丰富的 ...
python是值得学习的一门技术,之前写过些简单的内容,欢迎大家看看:http://www.hubwi ...
听说wordpress用nodejs重写了,这里有些nodejs的free内容,分享一下:http:/ ...
GoEasy推送支持Java后台推送,JS推送,Android推送,兼容浏览器有IE6,7,8,9,1 ...
不错的学习资料!
success_xing
总觉得淘宝应该有自己的图片分析项目
写道看到这些算法,想起谭浩强坑了一代人。怎么讲?
看到这些算法,想起谭浩强坑了一代人。
cccccccccccccccccc利用机器学习进行恶意代码分类 - 推酷
利用机器学习进行恶意代码分类
最近在Kaggle上微软发起了一个
,并提供了超过500G的数据(解压后)。有意思的是,取得第一名的队伍三个人都不是搞安全出身的,所采用的方法与我们常见的方法存在很大不同,展现了机器学习在安全领域的巨大潜力。在仔细读完他们的代码和相关的论文后,我简单的进行了一些总结与大家分享。
需要指出的是,(1)比赛的主题是恶意代码的分类,不是病毒查杀(2)比赛采用的方法是纯静态分析的方法,不涉及行为分析等动态分析方法。
因此这不意味着这个方法能够取代现有的方法,但是了解它能够为安全研究人员提供一个崭新的思路,至于能否在工业界应用仍待进一步研究。
80年代末期,随着恶意代码的诞生,反恶意代码软件(或称反病毒软件)随之诞生。这个时期的恶意代码所采用的技术较为简单,这使得对应的检测技术也较为容易,早期的反病毒软件大都单一的采用特征匹配的方法,简单的利用特征串完成检测。随着恶意代码技术的发展,恶意代码开始在传播过程中进行变形以躲避查杀,此时同一个恶意代码的变种数量急剧提升,形态较本体也发生了较大的变化,反病毒软件已经很难提取出一段代码作为恶意代码的特征码。在这种情况下,广谱特征码随之诞生,广谱特征码将特征码进行了分段,通过掩码字节对需要进行比较的和不需要进行比较的区段进行划分。然而无论是特征码扫描还是广谱特征,都需要在获得恶意代码样本后,进行特征的提取,随后才能进行检测,这使得对恶意代码的查杀具有一定的滞后性,始终走在恶意代码的后面。为了针对变种病毒和未知病毒,启发式扫描应运而生,启发式扫描利用已有的经验和知识对未知的二进制代码进行检测,这种技术抓住了恶意代码具有普通二进制文件所不具有的恶意行为,例如非常规读写文件,终结自身,非常规切入零环等等。启发式扫描的重点和难点在于如何对恶意代码的恶意行为特征进行提取。特征码扫描、查找广谱特征、启发式扫描,这三种查杀方式均没有实际运行二进制文件,因此均可归为恶意代码静态检测的方法。随着反恶意代码技术的逐步发展,主动防御技术、云查杀技术已越来越多的被安全厂商使用,但恶意代码静态检测的方法仍是效率最高,被运用最广泛的恶意代码查杀技术。
微软提供的数据包括训练集、测试集和训练集的标注。其中每个恶意代码样本(去除了PE头)包含两个文件,一个是十六进制表示的 .bytes 文件,另一个是利用IDA反汇编工具生成的 .asm 文件。如下图所示
Kaggle比赛中最重要的环节就是特征工程,特征的好坏直接决定了比赛成绩。在这次Kaggle的比赛中冠军队伍选取了三个“黄金”特征:恶意代码图像、 OpCode n-gram 和 Headers 个数,其他一些特征包括 ByteCode n-gram ,指令频数等。机器学习部分采用了随机森林算法,并用到了 xgboost 和 pypy 加快训练速度。
本文主要关注恶意代码图像和 OpCode n-gram ,以及随机森林算法的应用。
0x02 恶意代码图像
这个概念最早是2011年由加利福尼亚大学的 Nataraj 和 Karthikeyan 在他们的论文 Malware Images: Visualization and Automatic Classification 中提出来的,思路非常新颖,把一个二进制文件以灰度图的形式展现出来,利用图像中的纹理特征对恶意代码进行聚类。此后,有许多研究人员在这个思路基础上进行了改进和探索。就目前发表的文章来看,恶意代码图像的形式并不固定,研究人员可根据实际情况进行调整和创新。
国内这方面的研究较少,去年在通信学报上有一篇 《基于纹理指纹的恶意代码变种检测方法研究》 ,是由北京科技大学的韩晓光博士和北京启明星辰研究院等合作发表的,目测也是仅有的一篇。
本节介绍最简单的一种恶意代码图像绘制方法。对一个二进制文件,每个字节范围在00~FF之间,刚好对应灰度图0~255(0为黑色,255为白色)。将一个二进制文件转换为一个矩阵(矩阵元素对应文件中的每一个字节,矩阵的大小可根据实际情况进行调整),该矩阵又可以非常方便的转换为一张灰度图。
python代码如下
import numpy
from PIL import Image
import binascii
def getMatrixfrom_bin(filename,width):
with open(filename, 'rb') as f:
content = f.read()
hexst = binascii.hexlify(content)
#将二进制文件转换为十六进制字符串
fh = numpy.array([int(hexst[i:i+2],16) for i in range(0, len(hexst), 2)])
#按字节分割
rn = len(fh)/width
fh = numpy.reshape(fh[:rn*width],(-1,width))
#根据设定的宽度生成矩阵
fh = numpy.uint8(fh)
filename = &your_bin_filename&
im = Image.fromarray(getMatrixfrom_bin(filename,512)) #转换为图像
im.save(&your_img_filename.png&)
利用该代码生成的几种病毒样本图像如下所示
用肉眼可看出,同一个家族的恶意代码图像在纹理上存在一定的相似性,不同的恶意代码家族是有一定区别的。如何用计算机发现和提取这些纹理的相似特征用以分类呢?这就需要用到计算机视觉里的一些技术了。在 Nataraj 和 Karthikeyan 的论文中采用的是 GIST特征 , GIST特征 常用于场景分类任务(如城市、森林、公路和海滩等),用一个五维的感知维度来代表一个场景的主要内容(详情请参考文献[xx])。简单来说,输入图像,输出为对应的GIST描述符,如下图所示
在 matlab 实现里面每个图像的GIST描述符都用一个向量表示,最后用 SVM 完成分类训练。
这已经远远超出了场景识别所能做的。不过,国外有学者利用一些类似前文生成那种不规则图像来欺骗深度学习模型,如下图所示
详情请参考@王威廉老师的微博。当然,二者并没有什么直接关联,因为基于深度学习的图像识别系统的训练数据是一些有意义的图像。但这是一个非常有意思的巧合,至于基于深度学习的图像识别能否用于恶意代码图像的特征提取和分类,我认为是一个潜在的研究点,所能做的也不局限于此,如果有做深度学习的朋友可以伙同做安全的朋友一起研究交流。
0x03 OpCode n-gram
n-gram 是自然语言处理领域的概念,早期的语音识别技术和统计语言模型与它密不可分。 n-gram 基于一个简单的假设,即认为一个词出现的概率仅与它之前的n-1个词有关,这个概率可从大量语料中统计得到。例如“吃”的后面出现“苹果”或“披萨”的概率就会比“公路”的概率大(正常的语料中基本不会出现“吃公路”这种组合),可以看出 n-gram 在一定程度上包含了部分语言特征。
将 n-gra m应用于恶意代码识别的想法最早由Tony等人在2004年的论文 N-gram-based Detection of New Malicious Code 中提出,不过他们的方法是基于 ByteCode 的。2008年 Moskovitch 等人的论文 Unknown Malcode Detection Using OPCODE Representation 中提出利用 OpCode 代替 ByteCode 更加科学。
具体来说,一个二进制文件的 OpCode n-gram 如下图所示
针对这次Kaggle比赛提供的数据,用python提取出其n-gram特征
from collections import *
# 从.asm文件获取Opcode序列
def getOpcodeSequence(filename):
opcode_seq = []
p = re.compile(r'\s([a-fA-F0-9]{2}\s)+\s*([a-z]+)')
with open(filename) as f:
for line in f:
if line.startswith(&.text&):
m = re.findall(p,line)
opc = m[0][10]
if opc != &align&:
opcode_seq.append(opc)
return opcode_seq
# 根据Opcode序列,统计对应的n-gram
def getOpcodeNgram(ops ,n = 3):
opngramlist = [tuple(ops[i:i+n]) for i in range(len(ops)-n)]
opngram = Counter(opngramlist)
return opngram
file = &train/0A32eTdBKayjCWhZqDOQ.asm&
ops = getOpcodeSequence(file)
opngram = getOpcodeNgram(ops)
print opngram
# Counter({('mov', 'mov', 'mov'): 164, ('xor', 'test', 'setnle'): 155...
0x04 决策树和随机森林
决策树在我们日常生活中无处不在,在众多机器学习的书籍中提到的一个例子(银行预测客户是否有能力偿还贷款)如下图所示
在这个在决策树中,非叶子结点如“拥有房产”、“是否结婚”就是所谓的特征,它们是依靠我们的知识人工提取出来的特征。但如果对某个领域不了解,特征数量又较多时,人工提取特征的方法就不可行了,需要依靠算法来寻找合适的特征构造决策树。
限于篇幅,决策树的构造等过程本文不进行展开,网上相关资源非常多。(只要能够充分理解熵和信息增益的概念,决策树其实非常简单)
随机森林是一个非常强大的机器学习方法,顾名思义,它是用随机的方式建立一个森林,森林里面有很多的决策树组成,随机森林的每一棵决策树之间是没有关联的。在得到森林之后,当有一个新的输入样本进入的时候,就让森林中的每一棵决策树分别进行一下判断,预测这个样本应该属于哪一类(对于分类算法),然后看看哪一类被选择最多,就预测这个样本为那一类。
随机森林的思想与 Adaboost 里面的弱分类器组合成强分类器的思想类似,是一种“集体智慧”的体现。例如,屋子里面有n个人,每个人作出正确判断的概率为p(p略高于0.5,这时每个人可视为一个弱分类器),他们判断的过程独立互不影响,最终以多数人的判断为准。这里我们不从数学上来推导,类比抛硬币,对一枚均匀的硬币,抛n次的结果中,正面和反面的次数是差不多的。而对一枚不均匀的硬币,若出现正面的概率略大于反面,抛n次的结果中出现正面次数比反面次数多的概率就会很大。所以即使每个分类器的准确度不高,但是结合在一起时就可以变成一个强分类器。
如图所示,将训练数据有放回的抽样出多个子集(即随机选择矩阵中的行),当然在特征选择上也可以进行随机化(即随机选择矩阵中的列,图中没有体现出来),分别在每个子集上生成对应的决策树
决策过程如下图所示(忽略画风不一致的问题...)
0x05 冠军队伍的实现细节
ASM文件图像
但是在 Kaggle 比赛中冠军队伍采用的方法并不是从二进制文件生成的图像,也不是从 .bytes 文件,竟然是从 .asm 文件生成的图像,他们也没有使用GIST特征,而是使用了前800个像素值作为特征,让人非常费解。
我专门给队伍里的 Jiwei Liu 同学发了一封邮件进行咨询,他给我的答复是: GIST特征 与其他特征综合使用时影响整体效果,所以他们放弃了 GIST特征 ,另外使用 .asm 文件生成图像纯属意外发现...
至于为什么是前800个像素,他的解释是通过反复交叉验证得出的,具体原因不清楚。(在后文的分析中我会谈谈我的一些看法)
OpCode n-gram
这部分的实现不复杂,他们选取n=4,在具体的特征选择上通过计算信息增益选取每个分类与其他分类区分度最高的750个特征。
其他一些特征包括统计 Headers,Bytecode n-gram(n=2,3,4) ,分析指令流(将每个循环固定展开5次)来统计指令频数,这些特征虽然不像前面提到的特征那么有效,但是确实可以在一定程度上提升最终成绩。
冠军队伍的代码是为了参加比赛而写的,时间仓促,又是多人合作完成,导致组织结构很乱,且基本没有注释,可读性较差。更重要的是自己想动手实践一下,所以按照他们的思路写了几个简单的程序,忽略了一些处理起来比较复杂或者难以理解的过程,代码可以在我的github上下载
由于只是做一些简单的试验,不需要太多的数据(否则速度会非常慢),我从微软提供的训练数据中抽取了大概1/10左右的训练子集,其中从每个分类的中都随机抽取了100个样本(9个分类,每个样本2个文件,共1800个文件),这样也不需要用到 pypy 和 xgboost ,只需要用到 numpy 、 pandas 、 PIL 和 scikit-learn 这些库即可
友情提示:要进行这个实验,首先确保有一个比较大的硬盘,推荐使用Linux系统。
这一步需要提前将完整训练集解压好,数量庞大,时间比较久。
from random import *
import pandas as pd
import shutil
rs = Random()
# 读取微软提供的训练集标注
trainlabels = pd.read_csv('trainLabels.csv')
opd = pd.DataFrame()
for clabel in range (1,10):
# 筛选特定分类
mids = trainlabels[trainlabels.Class == clabel]
mids = mids.reset_index(drop=True)
# 在该分类下随机抽取100个
rchoice = [rs.randint(0,len(mids)-1) for i in range(100)]
rids = [mids.loc[i].Id for i in rchoice]
fids.extend(rids)
opd = opd.append(mids.loc[rchoice])
opd = opd.reset_index(drop=True)
# 生成训练子集标注
opd.to_csv('subtrainLabels.csv', encoding='utf-8', index=False)
# 将训练子集拷贝出来(根据实际情况修改这个路径)
sbase = 'yourpath/train/'
tbase = 'yourpath/subtrain/'
for fid in fids:
fnames = ['{0}.asm'.format(fid),'{0}.bytes'.format(fid)]
for fname in fnames:
cspath = sbase + fname
ctpath = tbase + fname
shutil.copy(cspath,ctpath)
本实验中只用到了 .asm 文件,用到了 .asm 文件图像特征(前1500个像素)和 OpCode n-gram特征 (本实验取n=3,将总体出现频数大于500次的3-gram作为特征保留),实现代码与前文基本一致,具体细节可参考完整代码。
scikit-learn
因为 scikit-learn 的存在,将机器学习算法应用到其他领域变得非常方便快捷。例如我们已经抽取了这些恶意代码的 OpCode n-gram 特征(& 3gramfeature.csv &),利用 scikit-learn 即可快速训练一个随机森林
from sklearn.ensemble import RandomForestClassifier as RF
from sklearn import cross_validation
from sklearn.metrics import confusion_matrix
import pandas as pd
subtrainLabel = pd.read_csv('subtrainLabels.csv')
subtrainfeature = pd.read_csv(&3gramfeature.csv&)
subtrain = pd.merge(subtrainLabel,subtrainfeature,on='Id')
labels = subtrain.Class
subtrain.drop([&Class&,&Id&], axis=1, inplace=True)
subtrain = subtrain.as_matrix()
# 将训练子集划分为训练集和测试集 其中测试集占40%
X_train, X_test, y_train, y_test = cross_validation.train_test_split(subtrain,labels,test_size=0.4)
# 构造随机森林 其中包含500棵决策树
srf = RF(n_estimators=500, n_jobs=-1)
srf.fit(X_train,y_train)
print srf.score(X_test,y_test)
这里只对预测的准确度做一个简单的评判。
在只应用 .asm 文件图像特征( firstrandomforest.py )或者Opcode n-gram特征( secondrandomforest.py )的情况下,以及二者相结合的情况( combine.py ),准确率如下所示
由于随机森林训练的过程中存在一定的随机性,因此每次结果不一定完全相同,但总的来说,二者结合的准确率通常要高出许多,基本可以达到98%以上的准确率,而且别忘了我们只用了不到 1/10 的数据
为什么是前800像素
观察.asm文件的格式,开头部分其实是IDA生成的一些信息,如下图所示
可以目测这个长度已经超出了800个像素(800个字节),实际上这800个像素和反汇编代码没有关系!完全就是IDA产生的一些信息,更进一步的说,实际上冠军队伍的方法压根与恶意代码图像没有关系,实际上是用到了IDA产生的信息。
但是仔细观察这些IDA信息,貌似长的都差不多,也没有什么有价值的信息,为什么可以有效区分恶意软件类型呢?
一个大胆的猜想是微软提前将这些恶意代码分好类,在调用IDA进行反汇编的时候是按照每个分类的顺序进行的,由于未知的原因可能导致了这些IDA信息在不同分类上有细微差别,恰好能作为一个非常有效的特征!
好的方法总是简单又好理解的。这次Kaggle比赛也是如此,冠军队伍的方法没有特别难理解的部分。但是请注意:面上的方法并不能体现背后难度和工作量,真正复杂和耗时的部分在于特征选择和交叉验证上。比如他们最终放弃GIST特征正是经过反复对比验证才做出的决定。
这次的Kaggle比赛 归根结底还是比赛 ,最终目标是取得最好成绩,不代表这个方法在实际中一定好用。
放弃GIST特征告诉我们一个宝贵的经验,并不是某个特征好就一定要用,还要考虑它和其他特征综合之后的效果。
比赛的数据是去除了PE头的,而输入输出表对分析恶意代码是很有帮助的,假如微软提供的数据包含了PE头,将输入输出表作为特征,最终的结果应该还能进一步提升。
这个方法的能够发现一些静态方法发现不了的变种,但对于未知的新品种依然无能为力(没有数据,机器学习巧妇难为无米之炊...)
可以尝试将该方法应用到Android和IOS平台的恶意代码检测中。
0x08 资源和参考资料
比赛说明和原始数据
已发表评论数()
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
排版有问题
没有分页内容
视频无法显示
图片无法显示}

我要回帖

更多关于 神经网络模式识别 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信