Windows恶意软件API调用特征分析

本文讲的是Windows恶意软件API调用特征分析


1.背景

目标:

1)找到病毒调用概率高的API
2)找到病毒调用概率不高,但是当调用频次高的时候,是病毒概率高的API。

通常对病毒使用API的认识都是基于病毒工程师的经验,但是我们并不知道每个API对于是否是病毒的贡献有多大。通过对大量病毒样本的统计分析,我们可以得出相关的数据。

从网上下载3000个样本,1500个病毒,1500个无毒。用沙箱进行扫描,得到样本调用API和是否是病毒。如下图所示

取API的动态调用次数作为每个样本的特征,病毒类标记为1,非病毒类标记为0。如下所示:

{‘LdrUnloadDll’:4, ‘RegCloseKey’:45,…}  1
{‘GetFileSize’:1, ‘NtWriteFile’:4, ….} 0

2. 分析

将样本的API调用次数表示到折线图和条形图上,蓝色表示正常样本,绿色表示病毒样本。如下图所示:

条形图按API调用的次数分布到5个区间1+(1~10),10+(10~100),100+(100~1000),1000+(1000~5000),5000+(5000~)。

通过对大量样本的图形的观察发现,病毒比较常用的API(如:WriteProcessMemory,Process32NextW等)不管是折线图还是条形图,绿色线条所占的比例都很大。

病毒使用率低的API,蓝色线条占的比例比较大。

有些API的调用,折线图绿线比例大,条形图蓝线比例比较大。这种情况下病毒对API的调用次数会很多(会有很多成千上万次的调用),普通样本对API调用次数很少(一般不超过100次)。

因此我们可以计算折线图和条形图中绿色像素所占的比例来评估API对病毒的影响。

3. 方法

P1 = 折线图占用率:绿色像素/(绿色像素+蓝色像素)

P2 = 条形图占用率:绿色像素/(绿色像素+蓝色像素)

1) 计算API对病毒分类的贡献(P1*P2)

对于最能表示病毒特征的API,其被病毒调用的概率要比被正常样本调用的概率大的多,同时高频调用的次数也比正常样本大的多。如Process32NextW

所以P1,P2的值也会很大。

对于最不可能被病毒调用的API,P1,P2的值都会很小。

因此可以用P1*P2来表示API对病毒分类的贡献,进行排序后,数值会往两端移动。

贡献度排序曲线

2) 计算API的高频调用对病毒分类的贡献(P1-P2)

对于__exception__这样的,P1值很大,但是P2值比较小。其高频次调用的情况下是病毒的概率很高,无法单纯的从是否调用来判断是否为病毒。

用P1-P2来评价高频次调用。

4.结果

1)计算P1*P2,进行排序,部分结果如下。

数据结果分别为(API名,(贡献值,API调用次数概率,调用API的样本为病毒的概率,病毒样本数量))

贡献值为1的API,没有被正常样本调用过。(可能是由于样本数量太小造成的,特别是病毒样本数量只有几次的API)。其图像如下:

贡献值比较大的API基本都是病毒常用的,经常用来识别病毒。如排在前10的有:

WriteProcessMemory,NtGetContextThread,gethostbyname,CreateToolhelp32Snapshot,NtSetContextThread,Process32NextW,Process32FirstW,InternetOpenA,

GetComputerNameA,GetFileSizeEx。其图像如下

中间这部分数据用于下一节。

排在后面的都是比较没有病毒特性的API,比如WriteConsoleA,WriteConsoleW,MessageBoxTimeoutW,InternetGetConnectedState,select等。图像示例如下:

2)计算P1-P2,进行排序,部分结果如下。

这部分可以找到那些低频次调用贡献度下,但是高频次调用贡献度大的API。

数据格式(API名,(提升度,API调用次数概率,调用API的样本为病毒的概率,正常样本调用最大次数))

 

比如NtQueryAttributesFile,正常样本使用这个API的可能性更大。但是正常样本很少调用超过10次的。 因此超过10次调用NtQueryAttributesFile的样本就很可能是病毒了。

 

GetFileAttributesW 超过100次调用则很有可能是病毒。

超过10次的__exception__调用时病毒的概率很大。

完整的数据整理看数据部分。

5.结论

1)通过计算贡献度=病毒调用API概率*调用次数比例可以将API两极化

结果会受样本数量的影响,需要过滤掉次总数低的数据

2)通过(调用次数比例-病毒调用API概率)可以找到那些调用次数少时对病毒分析没什么帮助,但是调用次数多时帮助很大的API。

6.数据

1)对病毒识别影响大的API

2) 调用次数少难以区分,调用次数多可以用于识别病毒的API

原文发布时间为:2017年2月8日

本文作者:Change

本文来自合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。

原文链接

时间: 2024-09-16 17:31:04

Windows恶意软件API调用特征分析的相关文章

基于API调用的恶意软件分析技术

基于API的分析技术 根据上一个季度的统计数据发现,使用加壳器.加密器和保护器(这些都是用于对恶意软件进行混淆处理,以防止被系统或安全软件识别出来的方法)的恶意软件的数量正在日益增加.这些加壳器极大的提高了进行静态分析的难度,甚至有些时候根本就无法对其进行静态分析.随着越来多的恶意软越件作者开始采用这些保护性措施,安全分析人员对于恶意软件分析替代技术的兴趣也越来越浓. 其中一种可行的替代方法就是,对代码中通知系统执行某些操作的API调用或命令进行安全检测.这种方法的好处是,不必对经过加壳处理的软

windows phone异步调用api

问题描述 windows phone异步调用api 直接上代码 private void chaxunbutton1_Click(object sender, RoutedEventArgs e) { string s =textBox1.Text; HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://300report.jumpw.com/api/getrole?name=" + HttpUti

使用 .NET 框架类替代 API 调用 (一)

使用 .NET 框架类替代 API 调用 升级到 Microsoft .NET Ken GetzMCW Technologies 2002 年 2 月 摘要:通过学习 Microsoft .NET 框架中某些特定而有用的类,可以减少您对 Win32 API 调用的依赖.本文讨论的每个类都可以代替一个或多个 Win32 API 调用,而在 Microsoft Visual Basic 6.0 中,您必须调用一个或多个 Win32 API 才能完成相同的任务. 目标 查找现有 Win32 API 调

使用 .NET 框架类替代 API 调用 (二)

使用 System.Environment 类 System.Environment 类提供了若干不同的信息,如果没有这些信息,就需要进行多次 Windows API 调用.使用 System.Environment 可以检索: 有关可用驱动器的信息(GetLogicalDrives 方法) Windows 启动后的毫秒数(TickCount 属性) 一般环境设置(由 CurrentDirectory.MachineName.OSVersion.SystemDirectory.UserDomai

使用.NET框架类替代API调用择

.net框架 使用 .NET 框架类替代 API 调用 升级到 Microsoft .NET Ken GetzMCW Technologies2002 年 2 月 摘要:通过学习 Microsoft .NET 框架中某些特定而有用的类,可以减少您对 Win32 API 调用的依赖.本文讨论的每个类都可以代替一个或多个 Win32 API 调用,而在 Microsoft Visual Basic 6.0 中,您必须调用一个或多个 Win32 API 才能完成相同的任务. 目标 查找现有 Win32

Windows Socket API使用经验

本文是我在进行MS-Windows.HP-Unix网络编程的实践过程中总结出来的一些经验,仅供大家参考.本文所谈到的Socket函数如果没有特别说明,都是指的Windows Socket API. 一.WSAStartup函数 int WSAStartup(  WORD wVersionRequested,   LPWSADATA lpWSAData   ); 使用Socket的程序在使用Socket之前必须调用WSAStartup函数.该函数的第一个参数指明程序请求使用的Socket版本,其中

windows常用 API函数

系统API查询 http://www.vbgood.com/api.html http://hi.baidu.com/3582077/item/9cc3483b581f53c5392ffae3 第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄,该函数返回窗口的句柄, 这个函数的定义是这样的 HWND WINAPI FindWindow(LPCSTR lpClassName,LPCSTR lpWindowName);第一个参数填窗口的类名,第二个填窗口的标题名,其实是不需要同时

windows常用API函数

系统API查询 http://www.vbgood.com/api.html http://hi.baidu.com/3582077/item/9cc3483b581f53c5392ffae3 第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄,该函数返回窗口的句柄, 这个函数的定义是这样的 HWND WINAPI FindWindow(LPCSTR lpClassName,LPCSTR lpWindowName);第一个参数填窗口的类名,第二个填窗口的标题名,其实是不需要同时

基于JAVA每月运势api调用代码实例_java

本文实例为大家分享了JAVA每月运势api调用代码,供大家参考,具体内容如下 import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.