每日一句(0126)
Your question is another cup of tea.
你的问题完全是另外一回事.
Your question is another cup of tea.
你的问题完全是另外一回事.
问题背景:
有时候我们做程序时有这样的需求:有一个需要运行时间很长的循环,那么程序只有等待循环运行结束后才执行别的程序代码,这样机器一直处于循环之中,而不能响应别的事情,对CPU资源来说是一种浪费,那么可不可以既让循环执行,又可以执行程序另外的一部分代码呢? 答案是可以的,那就要用到多线程了。
相关知识:
进程:是指程序在一个数据集合上运行的过程,是操作系统进行资源分配和调度运行的一个独立单位,简单来说进程就是程序的一次执行。
进程的两个基本属性:
1.进程是一个可拥有资源的独立单位;
2. 进程同时又是一个可以独立调度和分配的基本单位。
操作系统中引入进程的目的是为了使多个程序并发执行,以改善资源利用率及提高系统的吞吐量。
线程:线是进程中的一个实澹 潜幌低扯懒⒌鞫群头峙涞幕 镜ノ弧O叱套约夯 旧喜挥涤邢低匙试矗 挥涤幸恍┰谠诵兄斜夭豢缮俚淖试矗 捎胪 粢桓鼋 痰钠渌 叱坦蚕斫 趟 涤械娜 孔试础M 桓鼋 讨械亩喔鱿叱讨 淇梢圆⒎⒅葱小?br>
问题实现:
VB可不可以创建多线程呢?答案:VB本身不可以,但用API函数VB可以实现。
在VB中创建线程用到以下几个API函数:
‘创建线程API
‘此API经过改造,lpThreadAttributes改为Any型,lpStartAddress改为传值引用:
‘因为函数入口地址是由形参变量传递,如果用传址那将传递形参变量的地址而不是函数的入口地址
‘ 参数dwStackSize为应用程序堆栈大小,lpStartAddress为函数入口地址
Private Declare Function CreateThread Lib ”kernel32″ (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, LpthreadId As Long) As Long
‘终止线程API
Private Declare Function TerminateThread Lib ”kernel32″ (ByVal hThread As Long, ByVal dwExitCode As Long) As Long
‘激活线程API,参数hThread为CreateThread创建的线程句柄
Private Declare Function ResumeThread Lib ”kernel32″ (ByVal hThread As Long) As Long
‘挂起线程API
Private Declare Function SuspendThread Lib ”kernel32″ (ByVal hThread As Long) As Long
了解完上面的API函数后请看下面的实例:
实例效果:此实例实现三个图片框的背景色一起变色。
实例的窗体布局见图:
程序的工程窗口:
源代码如下
窗体中的代码:
Option Explicit
‘开始
Private Sub Command1_Click()
On Error Resume Next
With myThreadleft
.Initialize AddressOf Fillleft ’传递过程地址给线程
.ThreadEnabled = True
End With
With myThreadright
.Initialize AddressOf Fillright
.ThreadEnabled = True
End With
With myThreadbottom
.Initialize AddressOf Fillbottom
.ThreadEnabled = True
End With
MsgBox ”多线程正在运行…,看看图片框控件的变色效果!”, 64, ”信息”
’终止线程运行
Set myThreadleft = Nothing
Set myThreadright = Nothing
Set myThreadbottom = Nothing
End Sub
‘结束
Private Sub Command2_Click()
Unload Me
End Sub
模块中的代码:
Option Explicit
‘时间计数API
Private Declare Function GetTickCount Lib ”kernel32″ () As Long
‘声明cls_thread类的对象变量
Public myThreadleft As New cls_thread, myThreadright As New cls_thread, myThreadbottom As New cls_thread
Sub Main()
Load Form1
Form1.Show
End Sub
Public Sub Fillleft()
Static Bkgcolor As Long
Dim LongTick As Long, Longcounter As Long
On Error Resume Next
For Longcounter = 0 To 3000
DoEvents
Bkgcolor = Longcounter Mod 256
Form1.Picture1.BackColor = RGB(Bkgcolor, 0, 0)
LongTick = GetTickCount
While GetTickCount - LongTick < 10 ’延时10毫秒,下同
Wend
Next
Set myThreadleft = Nothing ’如果循环结束则终止当前线程运行,下同
End Sub
Public Sub Fillright()
Static Bkgcolor As Long
Dim LongTickValue As Long, Longcounter As Long
On Error Resume Next
For Longcounter = 0 To 3000
DoEvents
Bkgcolor = Longcounter Mod 256
Form1.Picture2.BackColor = RGB(0, Bkgcolor, 0)
LongTickValue = GetTickCount
While GetTickCount - LongTickValue < 10
Wend
Next
Set myThreadright = Nothing
End Sub
Public Sub Fillbottom()
Static Bkgcolor As Long
Dim LongTick As Long, Longcounter As Long
On Error Resume Next
For Longcounter = 0 To 3000
DoEvents
Bkgcolor = Longcounter Mod 256
Form1.Picture3.BackColor = RGB(0, 0, Bkgcolor)
LongTick = GetTickCount
While GetTickCount - LongTick < 10
Wend
Next
Set myThreadright = Nothing
End Sub
类模块中的代码:
‘功能:创建多线程类,用于初始化线程。 类名:cls_Thread
‘参数:LongPointFunction 用于接收主调过程传递过来的函数地址值
‘调用方法:1.声明线程类对象变量 Dim mythread as cls_Thread
‘ 2.调用形式:With mythread
‘ .Initialize AddressOf 自定义过程或函数名 ’(初始化线程) .
‘ .ThreadEnabled = True ’(设置线程是否激活)
‘ End With
‘ 3.终止调用: Set mythread = Nothing
‘ Crate By : 陈宇 On 2004.5.10 Copyright(C).Ldt By CY-soft 2001–2004
‘ Email:4y4ycoco@163.com
‘ Test On: VB6.0+Win98 AND VB6.0+WinXP It’s Pass !
Option Explicit
‘创建线程API
‘此API经过改造,lpThreadAttributes改为Any型,lpStartAddress改为传值引用:
‘因为函数的入口地址由形参变量传递,如果用传址那将传递形参变量的地址而不是函数的入口地址
Private Declare Function CreateThread Lib ”kernel32″ (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, LpthreadId As Long) As Long
‘终止线程API
Private Declare Function TerminateThread Lib ”kernel32″ (ByVal hThread As Long, ByVal dwExitCode As Long) As Long
‘激活线程API
Private Declare Function ResumeThread Lib ”kernel32″ (ByVal hThread As Long) As Long
‘挂起线程API
Private Declare Function SuspendThread Lib ”kernel32″ (ByVal hThread As Long) As Long
Private Const CREATE_SUSPENDED = &H4 ’线程挂起常量
‘自定义线程结构类型
Private Type udtThread
Handle As Long
Enabled As Boolean
End Type
Private meTheard As udtThread
‘初始化线程
Public Sub Initialize(ByVal LongPointFunction As Long)
Dim LongStackSize As Long, LongCreationFlags As Long, LpthreadId As Long, LongNull As Long
On Error Resume Next
LongNull = 0
LongStackSize = 0
LongCreationFlags = CREATE_SUSPENDED ’创建线程后先挂起,由程序激活线程
’创建线程并返线程句柄
meTheard.Handle = CreateThread(LongNull, LongStackSize, ByVal LongPointFunction, LongNull, LongCreationFlags, LpthreadId)
If meTheard.Handle = LongNull Then
MsgBox ”线程创建失败!”, 48, ”错误”
End If
End Sub
‘获取线程是否激活属性
Public Property Get ThreadEnabled() As Boolean
On Error Resume Next
Enabled = meTheard.Enabled
End Property
‘设置线程是否激活属性
Public Property Let ThreadEnabled(ByVal Newvalue As Boolean)
On Error Resume Next
’若激活线程(Newvalue为真)设为TRUE且此线程原来没有激活时激活此线程
If Newvalue And (Not meTheard.Enabled) Then
ResumeThread meTheard.Handle
meTheard.Enabled = True
Else ’若激活线程(Newvalue为真)且此线程原来已激活则挂起此线程
If meTheard.Enabled Then
SuspendThread meTheard.Handle
meTheard.Enabled = False
End If
End If
End Property
‘终止线程事件
Private Sub Class_Terminate()
On Error Resume Next
Call TerminateThread(meTheard.Handle, 0)
End Sub
总结:
本程序的缺点是程序运行时CPU占用率高。
至此全部源代码结束,在实例的基础上可以根据个人需要做出不同的多线程应用程序,可以用此类模块创建ActiveX DLL,然后引用这个DLL来进行调用。
——————————————————————
公告栏
———————————
留言板
———————————
看广告玩游戏送QQ币
迅雷5.4.0026无广告免安装版(推荐)
(070126更新)点击这里下载
——————————————————————
公告栏
———————————
留言板
———————————
看广告玩游戏送QQ币
使用Norton官方卸载工具彻底卸载Norton
Norton官方卸载工具可彻底卸载计算机上所有Norton 2004/2005/2006,还可卸载Norton Ghost 10.0/9.0/2003。
像我一样被Norton卸载折磨的朋友,试试这个工具吧…
卸载过程如下:
1、下载下面三个文件
下载第一个文件,单击MSIFIX.bat,将该文件保存到Windows桌面上。
下载第二个文件,单击SymNRT.exe,将该文件保存到Windows桌面上。
下载第三个文件,单击SYMMSICLEANUP.reg,将该文件保存到Windows桌面上。
2、运行下面三个文件
在Windows桌面上,双击MSIFIX 图标:
单击”运行”。
在Windows桌面上,双击SymNRT图标:
单击”运行”。
在Windows桌面上,双击SYMMSICLEANUP图标:
单击”运行”。
3、这样就完成了Norton软件的彻底卸载。
注意:
1、如果已安装了其他Symantec软件,执行以上步骤可能会造成这些软件不可运行。这是由于很多Symantec软件都共享相同的文件和注册表项,因此删除一个软件的所有文件和项可能会导致其他软件所使用的文件也被删除。
2、由于系统情况各异及Norton本身卸载情况较为复杂,本人不对使用本文中提到的方法可能出现的意外负责,请自行决定是否使用该工具。
来源:http://www.b9527.net/?q=node/1067
——————————————————————
公告栏
———————————
留言板
———————————
看广告玩游戏送QQ币
(原)PC蛋蛋答题赚银蛋小技巧
参加比赛时系统会自动送1000个银蛋,一开始时就一次全下注到一个数字上(中不中那就要碰运气了),我碰了三次就中了。我现在已经17万多银蛋了。
如果第一次没有碰中,点获取银蛋>>>点击广告重新获取银蛋300个”。第一个问题出现时,看地址栏中,最后就是ask1.html ,把最后那个数字改成7,最终就是ask7.html,然后把整个地址复制(Ctrl+v)到剪贴板中。
问题:
《天国的阶梯》导演是谁
林权泽
金基德
康佑硕
这是正确答案 李长秀
张容佑
———————-
目前淘宝网游戏频道有多少件商品 地址:ask4.html
20多万件
50多万件
这里正确答案130多万件
200多万件
500多万件
———————
然后把这个地址复制下来。连续回车四次,就有1200个银蛋。如果输完也就周而复始。接下来就是去下注了。
如果没有注册点这里注册
——————————————————————
公告栏
———————————
留言板
———————————
看广告玩游戏送QQ币
“熊猫烧香”病毒的手动清除方法!
最近单位的电脑中了一个可恶的病毒“熊猫烧香”,一查居然是 2007 年第一周排行榜第一的病毒。这个病毒对 Windows 和常用的系统组件,如 IE、Messenger 等的运行倒没有多大影响,但是它会自行搜索硬盘上扩展名为 .EXE、.HTM、.ASP、.CHM 等几种类型的文件,把这些文件当作宿主,寄生在这些文件里。一旦这几种类型的文件被感染,文件的图标就会变成一个很恶心的烧香熊猫的样子,同时文件大小变大(病毒已经寄生在其中),只要试图运行这些中毒的文件,病毒就会进一步地疯狂扩散。
受病毒的影响,几乎所有的应用软件基本上都不能正常运行了。而且病毒还具有自行关闭防火墙和杀毒软件的能力,电脑上的瑞欠阑鹎奖惚磺恐平 茫SYMANTEC能检测),病毒监控虽然可以运行,但也被取消了随系统启动一同加载的权利;同时连 Windows 安全中心也未能幸免,Security Center 服务被整个删除;另外在文件夹选项中也无法查看隐藏的文件夹和文件了,这是一个常见问题,在文件夹选项中设置“显示所有文件夹和文件”后无法保存设置。
由于瑞星已经“泥菩萨过河、自身难保”,所以不得不手动清除。
1.在任务管理器的进程列表中关闭 SPCOLSV.EXE 病毒进程。这个 SPCOLSV.EXE 明显是在模仿系统进程 SPOOLSV.EXE。
2.删除位于 %SystemRoot%system32Drivers 文件夹中的 SPCOLSV.EXE 文件。%SystemRoot%system32Drivers 文件夹中不应该存在 .EXE 文件,所以很好找。
3.按照 KB555640 提供的方法,恢复资源管理器不能显示隐含文件的问题:
http://support.microsoft.com/kb/555640/zh-cn
或把以下蓝色字复制到文本文件中,保存成.reg 运行就可以了(PS:vic miao)
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\Hidden\SHOWALL]
“RegPath”=”Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced”
“Text”=”Show all files and forders”
“Type”=”radio”
“CheckedValue”=dword:00000001
“ValueName”=”Hidden”
“DefaultValue”=dword:00000002
“HKeyRoot”=dword:80000001
“HelpID”=”shell.hlp#51105″
这篇 KB 还是 youyang 写的,向 youyang 同学致敬。
4.每个硬盘分区的根目录都有两个隐含的文件 AUTORUN.INF 和 SETUP.EXE,将这些垃圾全部删除。
5.在注册表 HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersion
Run 中把病毒的启动项 svcshare 删除。如果存在多个用户帐户,每个用户帐户的 HKEY_CURRENT_USER 都要清理。
6.恢复杀毒软件随系统启动的加载项,以瑞星为例,在注册表 HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun 中加上一个 RavTask,设置命令为 ”C:RiSingRavRavTask.exe” -system 即可,其中 C:RisingRAV 是瑞星的默认安装位置。
7.在另一台“安全中心”服务正常的电脑上打开注册表,将 HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServiceswscsvc 的全部内容导出为 .REG 文件,复制到故障电脑上导入注册表,然后重新启动 Windows,恢复被病毒删除的“安全中心”服务。
到这个地步,病毒的主要文件基本上就被清理干净了。但是还剩下那些已经变成了熊猫嘴脸的 .EXE 文件,一开始不知道如何恢复。试过瑞星、江民和金山提供的熊猫烧香病毒专杀工具,但它们都只能清理上面提到的 AUTORUN.INF 和 SETUP.EXE,对于已经被寄生的 .EXE 文件无法自动恢复。后来在反间谍软件《超级巡警》里找到了一个熊猫烧香病毒专杀工具 1.6,名为 KillPanda.BAT,这个工具总算没有让人失望,经过扫描后,被寄生的 .EXE、.HTM 等类型的文件都恢复了默认图标,而且文件大小也恢复正常了,可以正常运行,总算避免了需要全部重新安装的厄运。不过所有被寄生过的文件,文件的生成时间、修改时间和访问时间就都保不住了,最后还是留下了一点“后遗症”。
———————————
公告栏
———————————
留言板
———————————
看广告玩游戏送QQ币
VB之Win32 API编程–判断本地或远程文件是否存在的简易方法
中午休息时,在FOX API(我常用的Win32 API浏览器)上发现了一个简单极好用的Win32API函数,是用来判断本地文件或远程机器文件是否存在的:
1. Private Declare Function PathFileExists Lib ”shlwapi.dll” Alias ”PathFileExistsA” (ByVal pszPath As String) As Long
这是封装在Shell32.DLL系统文件里的一个函数,既可以判断本地文件是否存在,又可以判断远程电脑上的文件是否存在。函数返回值是个Long型变量,返回两个值0,1。1表示文件存在(True),0表示文件不存在(False)。而且只有一个参数szPath,是个字符串变量,如果要判断本地的文件是否存在其路径可写为:”C:\Windows\Config\SysBook.Txt”),如果文件在远程电脑上,其路径可写为(假设对方电脑IP为192.168.0.2)
“\\192.168.0.2\d$\javatools\somefile.txt“,如果其电脑名为WorkStation可写为
“\\workstation\javatools\somefile.txt”,当然这个函数还可以查找网站上的网页文件如:”http://www.microsoft.com/ms.htm“
我们可以写个简单的自定义公用函数来完成这个功能,在自定义函数里调用这个API函数
Public Function GetFileExists(ByVal FileName As String) As Boolean
If FileName = ”” Then
MsgBox ”请输入文件名”, vbInformation, ”提示”
Exit Function
Else
GetFileExists = CBool(PathFileExists(FileName))
End If
End Function
在窗体界面上加一按钮,和一文本框
Private Sub Command1_Click()
Dim T As Boolean
T = GetFileExists(”F:\it\Develope\Retail\Bill\vssver.scc”)
If T = True Then
Text1.Text = ”该文件存在”
Else
Text1.Text = ”该文件不存在”
End If
End Sub
当然GetFileExists其中的参数还可以写成
“\\192.168.0.2\d$\javatools\somefile.txt“
“\\workstation\javatools\somefile.txt“
“http://www.microsoft.com/ms.htm“
这个函数除了能判断文件是否存在外,还可以判断本地或远程文件夹
是否存在,我觉得这要比用Dir这个VB自带函数来判断文件是否存在要好用多了,而且也不需要调用FileSystemObject组件来操作了。
来源:不详
——————————————————————
公告栏
———————————
留言板
———————————
看广告玩游戏送QQ币
VB程序中用ADO对象动态创建数据库和表
摘要: 本文阐述了在VB程序中利用ADO对象动态创建数据库和数据表的方法,这些方法在开发VB数据库应用程序中很有实用价值,它可以提高数据库程序灵活性。
关键词:数据库、数据表、ADO、ADOX
1: 问题的提出
在Visual Basic中,常用的数据访问接口有下列三种:数据库访问对象(DAO,Data Access Object)、远程数据库对象(RDO,Remote Data Object)和ActiveX数据对象(ADO,ActiveX Data Object )。数据库访问技术一直在不断进步,而这三种接口的每一种都分别代表了该技术的不同发展阶段。最新的是ADO,它是比RDO和DAO更加简单,然而更加灵活的对象模型。正因如此,越来越多的人在用VB开发数据库软件时使用ADO作为数据访问接口。在开发过程中,我们通常的使用的方法是:先使用数据库管理系统(例如:Microsoft Access)或VB中的可视化数据管理器建立好数据库和数据表结构,然后在程序中通过使用ADODC数据库控件或引用ADO对象与数据库中的表建立连接,再通过数据库感知控件(例如:文本框、DataGrid等)来进行数据库的各种操作。在这种开发过程中,我们有时需要面对这样一个问题:如何让用户在程序运行过程中动态地建立自己所需的数据库和数据表以提高程序的灵活性呢?在程序运行过程中建立自己所需的数据库和数据表,其本质就是用代码(或者说通过编程)来建立数据库和数据表。众所周知,在Foxpro或ASP编程中,这是很容易的一件事件。那么在VB数据库编程中又是怎样来操作的呢?在VB数据库编程中,如果使用DAO作为数据库访问接口技术,则可以用CreateDatabase结合CreateTableDef方法来实现,目前已有不少书和杂志都讲到了这种方法,本文就不再讲述了;但你如果使用的是最新的数据库访问接口技术ADO,你却发现目前的书和杂志上没有文章讲到如何用代码来建立数据库和数据表的方法,可有时我们非常需要用到这种方法,下面我们就来解决这个问题。
2: ADO与ADOX
我们先来对ADO 和ADOX进行简单的认识。在VB6中,使用ADO开发数据库应用程序时,我们要引用对象库”Microsoft ActiveX Data Objects 2.5 Library”, 这个东西的简称就是ADO,它是VB6数据库最核心的对象群,也是VB数据库开发人员经常所引用的对象库,在VB6中你可以看到它的各种版本,从2.0版到2.6版都有,很多人对它已经很熟悉,在此我们不再详细介绍。如果要在程序运行过程中创建数据库和表,我们还要引用对象库”Microsoft ADO Ext 2.1. For DDL Security”,简称为ADOX,其库文件名为是:Msadox.dll。ADOX是对 ADO 对象和编程模型的扩展,它将 ADO 扩展为包括创建、修改和删除模式对象,如表格和过程。它还包括安全对象,用于维护用户和组,以及授予和撤消对象的权限。ADOX的对象如下表所示:
对象
说明
Catalog
包含描述数据源模式目录的集合。
Column
表示表、索引或关键字的列。
Group
表示在安全数据库内有访问权限的组帐号。
Index
表示数据库表中的索引。
Key
表示数据库表中的主关键字、外部关键字或唯一关键字。
Procedure
表示存储的过程。
Table
表示数据库表,包括列、索引和关键字。
User
表示在安全数据库内具有访问权限的用户帐号。
View
表示记录或虚拟表的过滤集。
ADOX常用方法有:Append(包括Columns、Groups、Indexes、Keys、Procedures、Tables、Users、Views)、Create(创建新的目录)、Delete(删除集合中的对象)、Refresh(更新集合中的对象)等等。有关 ADOX 的详细信息,请在 http://www.microsoft.com/data/ado 中参阅 Microsoft 发布的有关 ADOX说明的 Web 页。
3: 在原有数据表的基础上产生新的数据表
如果仅仅是在已有的数据表的基础上产生新的数据表,我们只要引用对象库”Microsoft ActiveX Data Objects 2.5 Library”再利用Select…Into语句就可以了。例如:有一个名为Wage.mdb的数据库,数据库中有一个名为”工资表”数据表,该数据表的字段有:编号、姓名、基本工资、津贴、应发工资、扣款、实发工资等,这个表中已经有很多的记录。现在我们把其中的实发工资大于2000的记录筛选出来组成一个新表,新表的名称由用户从文本框中输入,新表中我们只要三个字段,它们是:编号、姓名、实发工资。我们用下列程序就可以实现:
(事先在窗体中添加一个文本框Text1和一个命令按钮Command1)
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim command As New ADODB.command
Private Sub Command1_Click()
Dim bm As String
Dim sql As String
If Text1.Text <>”” Then
bm = Trim(Text1.Text)
sql= ”Select 编号,姓名,实发工资 Into ” + bm + ” From 工资表 Where 实发工资>2000″
Set command.ActiveConnection = conn
command.CommandText = sql
command.Execute
Else
MsgBox ”你必须输入一个名字”
End If
Private Sub Form_Load()
Dim str As String
str = App.Path
If Right(str, 1) <>”\” Then
str = str + ”\”
End If
pstr = ”Provider=Microsoft.Jet.OLEDB.3.51;”
pstr = pstr & ”Persist Security Info=False;”
pstr = pstr & ”Data Source=” & str & ”wage.mdb”
conn.Open pstr
rs.CursorLocation = adUseClient
rs.Open ”工资表”, conn, adOpenKeyset, adLockPessimistic
Set DataGrid1.DataSource = rs
End Sub
当然,我们还可以把程序设计得更好,比如:让用户先在窗口中任意选择所需的字段和一些条件,然后再组合生成一个新表。但无论如何,这种操作只能在从原表的基础上产生一个新表,不能产生一个数据库文件,并且新表和原表放在同一个数据库中。
4: 建立新的数据库和表
前面讲到的方法有一定的局限性,它不能让用户产生自己所需的数据库文件,即使能产生数据表也只能在原有表的基础上生成。我们现在的目的就是让用户利用ADO对象在程序运行过程中创建数据库和表,就好象他利用Access来建立数据库和表一样。为此,我们应该引用对象库”Microsoft ActiveX Data Objects 2.5 Library”和”Microsoft ADO Ext 2.1. For DDL Security”
我们不妨用一个实例来说明具体的操作过程和方法。我们的实例要达到目的是:在程序运行过程中建立一个数据库,数据库的名称由用户输入。然后在数据库中建立一个名为”MyTable”的数据表,数据表中有三个字段,它们分别是:”编号”(整数型)、 ”姓名”(字符型,宽度为8)、”住址” (字符型,宽度为50),接着在数据表中添加一条记录,最后在DataGrid控件中把记录的内容显示出来,并且让用户在DataGrid控件中任意修改、添加记录。
首先在VB中新建一个窗体,然后在”工程”菜单中引用对象库”Microsoft ActiveX Data Objects 2.5 Library”和”Microsoft ADO Ext 2.1. For DDL Security”。接着定义三个窗体级的对象变量和一个窗体级的字符串变量,它们的具体定义是:
Dim cat As New ADOX.Catalog ’不用cat用另外一个名字也可以
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim pstr As String ’定义该变量是为了后面的书写方便
为了更灵活地创建数据库,我们可以在窗体中加入一个通用对话框、一个DataGrid控件,三个命令按钮,它们的标题分别是:创建数据库和表、查看、更新。通用对话框的作用是给用户输入数据库文件名和决定数据库的存放位置。 ”创建数据库和表”命令按钮对应的代码是:
Private Sub Command1_Click()
Dim fm As String ’fm变量用来获取用户输入的文件名
CommonDialog1.Filter = ”MDB文件(*.mdb)|*.mdb|AllFiles(*.*)|*.*|”
CommonDialog1.FilterIndex = 1
CommonDialog1.InitDir = ”D:\Jthpaper”
CommonDialog1.Flags = 6
CommonDialog1.Action = 2
If CommonDialog1.FileName = ”” Then
MsgBox ”你必须输入一个文件名,请重新保存一次!”
Exit Sub
Else
fm = CommonDialog1.FileName
End If
pstr = ”Provider=Microsoft.Jet.OLEDB.4.0;” ’不能把这里的4.0改为3.51
pstr = pstr & ”Data Source=” & fm
cat.Create pstr ’创建数据库
Dim tbl As New Table
cat.ActiveConnection = pstr
tbl.Name = ”MyTable” ’表的名称
tbl.Columns.Append ”编号”, adInteger ’表的第一个字段
tbl.Columns.Append ”姓名”, adVarWChar, 8 ’表的第二个字段
tbl.Columns.Append ”住址”, adVarWChar, 50 ’表的第三个字段
cat.Tables.Append tbl ’建立数据表
conn.Open pstr
rs.CursorLocation = adUseClient
rs.Open ”MyTable”, conn, adOpenKeyset, adLockPessimistic
rs.AddNew ’往表中添加新记录
rs.Fields(0).Value = 9801
rs.Fields(1).Value = ”孙悟空”
rs.Fields(2).Value = ”广州市花果山”
rs.Update
End Sub
上面程序中有一个需要说明的地方,这就是语句:pstr = ”Provider=Microsoft.Jet.OLEDB.4.0;”,这个语句表示Microsoft Jet OLEDB驱动程序的版本是4.0,这是目前最新的版本,利用它你可以用VB中的ADO对象访问Access2000及其以下版本所建立的数据库。你不能把这里的”4.0″改为”3.51″,否则程序不能正常运行;在VB6中,3.51版本的Microsoft Jet OLEDB驱动程序对应的是Access97数据库。换而言之,用这种方法建立的数据库和表跟用Access2000所建立的数据库和表是同一类型的,你只能直接用Access2000来打开,虽然你可以用VB6来访问这种数据库和其中的数据表,但你不能用Access97或VB6中的”可视化数据管理器”来直接打开。
在程序运行时只要用户单击该命令按钮就可以创建自己所需的数据库。”查看”命令按钮对应的代码是:
Private Sub Command3_Click()
Set DataGrid1.DataSource = rs
End Sub
“更新”命令按钮对应的代码是:
Private Sub Command4_Click()
rs.UpdateBatch
End Sub
我们这个实例只是用来说明问题,在实际应用当中你可以把它进一步改进,例如:你在窗体中再增加一些文本框和组合框,供用户输入或选择数据表的名称、字段的名称、字段的宽度和小数位数。这样,用户就可以自主地决定数据库的所有内容了,程序的灵活性也就大大提高了。
5: 结束语
如果你使用的是最新的数据访问接口技术ADO(Microsoft强烈建议大家使用这种最新技术),你又想在程序运行过程中创建数据库文件和数据表,此时,你应该在Visual Basic 6.0中引用对象库”Microsoft ActiveX Data Objects 2.5 Library”和”Microsoft ADO Ext 2.1. For DDL Security”,然后使用ADOX对象的Create、Append等方法就可以实现。 这种方法使用的Microsoft Jet OLEDB驱动程序的版本是4.0,因此,使用这种方法建立的数据库文件和数据表可以直接使用Access2000打开。笔者在VB数据库软件开发过程中已多次使用这种方法,该方法在提高程序的灵活性和满足用户的特殊需要方面有很大的作用。
——————————————————————
公告栏
———————————
留言板
———————————
看广告玩游戏送QQ币
Sniffer-黑客们最常用的入侵手段
随着Internet及电子商务的日益普及,Internet的安全也越来越受到重视。在Internet安全隐患中扮演重要角色的是Sniffer和Scanner,本文将介绍Sniffer以及如何阻止sniffer。
大多数的黑客仅仅为了探测内部网上的主机并取得控制权,只有那些”雄心勃勃”的黑客,为了控制整个网络才会安装特洛伊木马和后门程序,并清除记录。他们经常使用的手法是安装sniffer。
在内部网上,黑客要想迅速获得大量的账号(包括用户名和密码),最为有效的手段是使用 ”sniffer” 程序。这种方法要求运行Sniffer 程序的主机和被监听的主机必须在同一个以太网段上,故而在外部主机上运行sniffer是没有效果的。再者,必须以root的身份使用sniffer 程序,才能够监听到以太网段上的数据流。
黑客会使用各种方法,获得系统的控制权并留下再次侵入的后门,以保证sniffer能够执行。在Solaris 2.x平台上,sniffer 程序通常被安装在/usr/bin 或/dev目录下。黑客还会巧妙的修改时间,使得sniffer程序看上去是和其它系统程序同时安装的。
大多数 ”ethernet sniffer”程序在后台运行,将结果输出到某个记录文件中。黑客常常会修改ps程序,使得系统管理员很难发现运行的sniffer程序。
”ethernet sniffer”程序将系统的网络接口设定为混合模式。这样,它就可以监听到所有流经同一以太网网段的数据包,不管它的接受者或发送者是不是运行sniffer的主机。 程序将用户名、密码和其它黑客感兴趣的数据存入log文件。黑客会等待一段时间 —– 比如一周后,再回到这里下载记录文件。
一、什么是sniffer
与电话电路不同,计算机网络是共享通讯通道的。共享意味着计算机能够接收到发送给其它计算机的信息。捕获在网络中传输的数据信息就称为sniffing(窃听)。
以太网是现在应用最广泛的计算机连网方式。以太网协议是在同一回路向所有主机发送数据包信息。数据包头包含有目标主机的正确地址。一般情况下只有具有该地址的主机会接受这个数据包。如果一台主机能够接收所有数据包,而不理会数据包头内容,这种方式通常称为”混杂” 模式。
由于在一个普通的网络环境中,帐号和口令信息以明文方式在以太网中传输, 一旦入侵者获得其中一台主机的root权限,并将其置于混杂模式以窃听网络数据,从而有可能入侵网络中的所有计算机。
二、sniffer工作原理
通常在同一个网段的所有网络接口都有访问在物理媒体上传输的所有数据的能力,而每个网络接口都还应该有一个硬件地址,该硬件地址不同于网络中存在的其他网络接口的硬件地址,同时,每个网络至少还要一个广播地址。(代表所有的接口地址),在正常情况下,一个合法的网络接口应该只响应这样的两种数据帧:
1、帧的目标区域具有和本地网络接口相匹配的硬件地址。
2、帧的目标区域具有”广播地址”。
在接受到上面两种情况的数据包时,nc通过cpu产生一个硬件中断,该中断能引起操作系统注意,然后将帧中所包含的数据传送给系统进一步处理。
而sniffer就是一种能将本地nc状态设成(promiscuous)状态的软件,当nc处于这种”混杂”方式时,该nc具备”广播地址”,它对所有遭遇到的每一个帧都产生一个硬件中断以便提醒操作系统处理流经该物理媒体上的每一个报文包。(绝大多数的nc具备置成 promiscuous方式的能力)
可见,sniffer工作在网络环境中的底层,它会拦截所有的正在网络上传送的数据,并且通过相应的软件处理,可以实时分析这些数据的内容,进而分析所处的网络状态和整体布局。值得注意的是:sniffer是极其安静的,它是一种消极的安全攻击。
通常sniffer所要关心的内容可以分成这样几类:
1、口令
我想这是绝大多数非法使用sniffer的理由,sniffer可以记录到明文传送的userid和passwd.就算你在网络传送过程中使用了加密的数据,sniffer记录的数据一样有可能使入侵者在家里边吃肉串边想办法算出你的算法。
2、金融帐号
许多用户很放心在网上使用自己的信用卡或现金帐号,然而sniffer可以很轻松截获在网上传送的用户姓名、口令、信用卡号码、截止日期、帐号和pin.
3、偷窥机密或敏感的信息数据
通过拦截数据包,入侵者可以很方便记录别人之间敏感的信息传送,或者干脆拦截整个的email会话过程。
4、窥探低级的协议信息。
这是很可怕的事,我认为,通过对底层的信息协议记录,比如记录两台主机之间的网络接口地址、远程网络接口ip地址、ip路由信息和tcp连接的字节顺序号码等。这些信息由非法入侵的人掌握后将对网络安全构成极大的危害,通常有人用sniffer收集这些信息只有一个原因:他正在进行一次欺诈,(通常的ip地址欺诈就要求你准确插入tcp连接的字节顺序号,这将在以后整理的文章中指出)如果某人很关心这个问题,那么sniffer对他来说只是前奏,今后的问题要大得多。(对于高级的hacker而言,我想这是使用sniffer的唯一理由吧)
三、 哪里可以得到sniffer
Sniffer是黑客们最常用的入侵手段之一。你可以在经过允许的网络中运行sniffer,了解它是如何有效地危及本地机器安全。
Sniffer可以是硬件,也可以是软件。现在品种最多,应用最广的是软件Sniffer,绝大多数黑客们用的也是软件Sniffer。
以下是一些也被广泛用于调试网络故障的sniffer工具:
商用sniffer:
1. Network General.
Network General开发了多种产品。最重要的是Expert Sniffer,它不仅仅可以sniff,还能够通过高性能的专门系统发送/接收数据包,帮助诊断故障。还有一个增强产品”Distrbuted Sniffer System”可以将UNIX工作站作为sniffer控制台,而将sniffer agents(代理)分布到远程主机上。
2. Microsoft’s Net Monitor
对于某些商业站点,可能同时需要运行多种协议–NetBEUI、IPX/SPX、TCP/IP、802.3和SNA等。这时很难找到一种sniffer帮助解决网络问题,因为许多sniffer往往将某些正确的协议数据包当成了错误数据包。Microsoft的Net Monitor(以前叫Bloodhound)可以解决这个难题。它能够正确区分诸如Netware控制数据包、NT NetBios名字服务广播等独特的数据包。(etherfind只会将这些数据包标识为类型0000的广播数据包。)这个工具运行在MS Windows 平台上。它甚至能够按MAC地址(或主机名)进行网络统计和会话信息监视。只需简单地单击某个会话即可获得tcpdump标准的输出。过滤器设置也是最为简单的,只要在一个对话框中单击需要监视的主机即可。
免费软件sniffer
1. Sniffit由Lawrence Berkeley 实验室开发,运行于Solaris、SGI和Linux等平台。可以选择源、目标地址或地址集合,还可以选择监听的端口、协议和网络接口等。这个SNIFFER默认状态下只接受最先的400个字节的信息包,这对于一次登陆会话进程刚刚好。
2. SNORT:这个SNIFFER有很多选项供你使用并可移植性强,可以记录一些连接信息,用来跟踪一些网络活动。
3. TCPDUMP:这个SNIFFER很有名,linux,FREEBSD还搭带在系统上,是一个被很多UNIX高手认为是一个专业的网络管理工具,记得以前TsutomuShimomura(应该叫下村侵吧)就是使用他自己修改过的TCPDUMP版本来记录了KEVINMITNICK攻击他系统的记录,后来就配合FBI抓住了KEVINMITNICK,后来他写了一文:使用这些LOG记录描述了那次的攻击,HowMitnickhackedTsutomuShimomurawithanIPsequenceattack
(http://www.attrition.org/security/newbie/security/sniffer/shimomur.txt)
4. ADMsniff:这是非常有名的ADM黑客集团写的一个SNIFFER程序。
5. linsniffer:这是一个专门设计杂一LINUX平台上的SNIFFER。
6. Esniffer:这个也是一个比较有名的SNIFFER程序。
7. Solsniffer:这是个Solarissniffer,主要是修改了SunSniff专门用来可以方便的在Solair平台上编译。
8. Ethereal是一基于GTK+的一个图形化Sniffer
9. Gobbler(for MS-DOS&Win95)、Netman、NitWit、Ethload…等等。
四、sniffer的安装使用。
我主要以sniffit为例分别介绍在nt和linux下的应用。
[1] 在linux下的sniffit
安装软件的安装很简单:
1、用tar zvfx sniffit.*.*.*.tgz将下载下来的sniffit.*.*.*.tgz解压缩到你想要的目的文件夹,如果版本是0.3.7的话,你会看到该目录下出现一个sniffit.0.3.7的目录。
2、cd sniffit.0.3.7
3、./configure && make,只要在这个过程中终端上没有意外的error信息
出现,你就算编译成功了–可以得到一个二进制的sniffit文件。
4、make clean把不用的垃圾扫掉……
、使用方法
1、参数
这个东东具有如下的命令选项:
-v显示版本信息
-t让程序去监听指定流向某IP的数据包
-s让程序去监听从某IP流出的IP数据包,可以使用@通配符,如-t199.145.@
-i显示出窗口界面,能察看当前在你所属网络上进行连接的机器
-I扩展的交互模式,忽略所有其它选项,比-i强大得多……
-c利用脚本来运行程序
-F强制使程序使用网络硬盘
-n显示出假的数据包。象使用ARP、RARP或者其他不是IP的数据包也会显示出来
-N只运行plugin时的选项,使其它选项失效
在-i模式下无法工作的参数:
-b同时做-t和-s的工作……
-d将监听所得内容显示在当前终端–以十六进制表示
-a将监听所得内容显示在当前终端–以ASCII字符表示
-x打印TCP包的扩展信息(SEQ,ACK,Flags),可以与’-a’,’-d’,’-s’,’-t’,’-b’一起运作,注意– 它是输出在标准输出的,如果只用-t,-s,-b 而没有其它参数配合的话不会被写入文件。
-R将所有通信记录在文件中
-r这一选项将记录文件送往sniffit,它需要-F的参数配合指明设备,假设你用’eth0’(第一块网卡)来记录文件,你必须在命令行里面加上’-Feth0’或者’或者’或者’或者’或者’-Feth’-A遇到不认识的字符时用指定的字符代替-P定义监听的协议,DEFAULT为TCP–也可以选IP、ICMP、UDP……
-p定义监听端口,默认为全部
-l设定数据包大小,default是300字节。
-M激活插件
-I,-i模式下的参数
-D所有的记录会被送到这个磁盘上。
-c模式下的参数
-L
其中logparam可以是如下的内容:
raw:轻度
norm:常规
telnet:记录口令(端口23)
ftp:记录口令(端口21)
mail:记录信件内容(端口25)
比如说”ftpmailnorm”就是一个合法的logparam
2、图形仿真界面
就是上面所说的-i选项啦,我们输入sniffit-i会出现一个窗口环境,从中可以看到自己所在的网络中有哪些机器正在连接,使用什么端口号,其中可用的命令如下:
q退出窗口环境,结束程序
r刷新屏幕,重新显示正在在连线的机器
n产生一个小窗口,包括TCP、IP、ICMP、UDP等协议的流量
g产生数据包,正常情况下只有UDP协议才会产生,执行此命令要回答一些
关于数据包的问题
F1改变来源网域的IP地址,默认为全部
F2改变目的网域的IP地址,默认为全部
F3改变来源机器的端口号,默认为全部
F4改变目的机器的端口号,默认为全部
、一些示例
假设有以下的设置:在一个子网中有两台主机,一台运行了sniffer,我们称之为sniffit.com,另一台是66.66.66.7,我们称之为target.com。
<1>你希望检查sniffer是否能运行sniffit:~/#sniffit-d-p7-t66.66.66.7 并且开另一个窗口:
sniffit:~/$telnettarget.com7
你可以看到sniffer将你telnet到对方7号端口echo服务的包捕获了。
<2>你希望截获target.com上的用户密码
sniffit:~/#sniffit-p23-t66.66.66.7
<3>target.com主机的根用户声称有奇怪的FTP连接并且希望找出他们的击键
sniffit:~/#sniffit-p21-l0-t66.66.66.7
<4>你希望能阅读所有进出target.com的信件
sniffit:~/#sniffit-p25-l0-b-t66.66.66.7&或者sniffit:~/#sniffit-p25-l0-b-s66.66.66.7&
<5>你希望使用用户交互界面
sniffit:~/#sniffit-i
<6>有错误发生而且你希望截获控制信息
sniffit:~/#sniffit-Picmp-b-s66.66.66.7
<7>Gowildonscrollingthescreen.
sniffit:~/#sniffit-Pip-Picmp-Ptcp-p0-b-a-d-x-s66.66.66.7
与之效果相当的是sniffit:~/#sniffit-Pipicmptcp-p0-b-a-d-x-s66.66.66.7
<8>你可以用’more66*’读取下列方式记录下的密码
sniffit:~/#sniffit-p23-A.-t66.66.66.7或者sniffit:~/#sniffit-p23-A^-tdummy.net
、高级应用
1、用脚本执行
这是配合选项-c的,其执行方法也很简单,比如以如下方式编辑一个叫sh的文件
selectfromhost180.180.180.1
selecttohost180.180.180.10
selectbothport21
然后执行:sniffit-csh
说明:监听从180.180.180.1送往180.180.180.10的数据包,端口为FTP口。这里不做更多说明,你可以自己去看里面的README。
2、插件
要获取一个插件是很简单的,你将它放入sniffit的目录下,并且象如下方式编辑sn_plugin.h文件:
#define PLUGIN1_NAME ”Myplugin”
#define PLUGIN1(x) main_plugin_function(x)
#include ”my_plugin.plug”
注意:
a)你可以让plugin从0-9,所以从PLUGIN0_NAME到PLUGIN1_NAME……不必是连续的
d)#include”my_plugin.plug”这是我的插件源代码放置的地方。如果想详细了解的话,还是看看里面的plugin.howto吧。
3、介绍tod
这东东便是sniffit最有名的一个插件了,为什么叫TOD呢–touchofdeath,它可以轻易地切断一个TCP连接,原理是向一个TCP连接中的一台主机发送一个断开连接的IP包,这个IP包的RST位置1,便可以了。
将下载下来的tod.tar.gz拷贝到sniffit所在目录下,解压安装后ln-stodsniffit_key5就可以将这相程序与F5键连接起来,想切断哪台机器的话,只要在窗口中将光标指到需要断线的机器上按下F5键就可以了。你可以自由地定义成其它的F功能键–F1~F4不行,它们已经被定义过了……
[2] 在NT下的sniffit
Sniffit 0.3.7推出了NT版本,也支持WINDOWS2000,这个sniffit需要WinPcap包,就是类似与libpcap的包,支持WIN32平台上可以信息包捕获和网络分析,是基于UNIX的libpcap和BPF(Berkeley 分帧过滤器)模型的包。它包括内核级的包过滤驱动程序,低级动态连接库(packet.dll),和高级系统无关性库(libpcap,基于0.4a6版本)。
这个WinPcap信息包捕获启动程序可把设备驱动增加在Windows 95, Windows 98, Windows NT 和 Windows 2000 上,可以有能力捕获和发送通过原始套接口的信息包(raw packets),Packet.dll是一个能用来直接访问BPF驱动程序的API。
WinPcap在http://netgroup-serv.polito.it/windump和http://netgroup-serv.polito.it/analyzer这两个工具中成功应用。最新的WinPcap是版本2.02,修补了2.01版本中的一些缺陷,并且支持WIN2000。具体信息和源代码可以在下面这个站点找到:
http://netgroup-serv.polito.it/winpcap/
下面是在WIN2K中安装的步骤:
1)先下载packet.exe这个程序后展开安装。
2)打开WINDOWS2000的控制面板
3)从控制面板中双击”网络和拨号连接”图标,在打开”本地连接”图标,并选择属性选项。
4)在显示的对话框中选择”安装”,安装网络组件。
5)再在出现的对话框中选择”协议”,点击”增加”。
6)在出现的对话框中选择”从磁盘安装”,选择正确路径,就是刚才你解压的网络设备驱动程序(这个文件夹中必须包含packet.inf和packet.sys)的地方,在选择确定。
7)在选择”Packet capture Driver v X.XX ”,并按照指示来完成安装,往往要你WINDOWS2000的安装光盘。
8)查看网络组件中有没有 Packet capture Driver v X.XX 这一行,有的话说明这个驱动程序已经建立并绑定了网络接口。
再重新启动机器。然后解压sniffit_nt.0.3.7.beta,再使用命令行模式,我简单的使用了一个命令行,刚开始是使用sniffit -t 192.168.0.1 -p 21,想监视下21 FTP端口的密码捕获成不成功,但出现”Automatic network device lookup not yet supported in Win32 version… use ’-F /Device/Packet_{31BB7ED2-125E-11D4-8F11-D79985727802}’ to force the choice,Read the README.FIRST on how to force network devices.的提示,于是我按照其提示所示,使用了sniffit -F /Device/packet_{31BB7ED2-125E-11D4-8F11-D79985727 802} -t 192.168.0.1 -p 21命令,这时出现下面的提示:
Forcing device to /Device/packet_{31BB7ED2-125E-11D4-8F1 quested)…
Make sure you have read the docs carefully.
Sniffit.0.3.7 Beta is up and running…. (192.168.0.1)
这就表明sniffit在工作了,于是在FTP到NT的端口,输入密码,随即就可以在刚才SNIFFIT的目录下看到一个关于192.168.0.2.1281-192.168.0.1.21的文件,打开后查看里面的内容如下所示:
USER xundi
PASS xxxxxxx——–>我隐藏了,XIXI
SYST
PORT 192,168,0,2,5,2
LIST
PORT 192,168,0,2,5,3
LIST
CWD g:
CWD c
PORT 192,168,0,2,5,26
LIST
CWD hack
PORT 192,168,0,2,5,88
LIST
看,是不是很整洁啊,至于文件名为何是这样192.168.0.2.1281-192.168.0.1.21,那是应该是一个客户/服务器模式,客户端的连接是随意开一个1281端口地址和192.168.0.1的21口连接。
五、如何监测主机正在窃听(sniffed)
如何才知道有没有sniffer在我的网上跑呢?这也是一个很难说明的问题,比较有说服力的理由证明你的网络有sniffer目前有这么几条:
1、你的网络通讯掉包率反常的高。
通过一些网络软件,你可以看到你的信息包传送情况(不是sniffer),向ping这样的命令会告诉你掉了百分几的包。如果网络中有人在听,那么你的信息包传送将无法每次都顺畅的流到你的目的地。(这是由于sniffer拦
截每个包导致的)
2、你的网络带宽将出现反常。
通过某些带宽控制器(通常是火墙所带),你可以实时看到目前网络带宽的分布情况,如果某台机器长时间的占用了较大的带宽,这台机器就有可能在听。在非高速信道上,如56Kddn等,如果网络中存在sniffer,你应该也可以察觉出网络通讯速度的变化。
3、通常一个sniffer的记录文件会很快增大并填满文件空间。在一个大型网络中,sniffer明显加重机器负荷。这些警告信息往往能够帮助管理员发现sniffer。
4、一个主机上的sniffer会将网络接口置为混杂模式以接收所有数据包。对于某些UNIX系统, 通过监测到混杂模式的网络接口。虽然可以在非混杂模式下运行sniffer,但这样将只能捕获本 机会话。只有混杂模式下的 sniffing才能捕获以太网中的所有会话,其它模式只能捕获本机会话。
对于SunOS、linux和其它BSD Unix系统,如下命令:
”ifconfig -a”
会显示所有网络接口信息和是否在混杂模式。DEC OSF/1和IRIX等系统需要指定设备。要找到系统中有什么网络接口,可以运行如下命令:
# netstat -r
Routing tables
Internet:
Destination Gateway Flags Refs Use Interface
default iss.net UG 1 24949 le0
localhost localhost UH 2 83 lo0
然后通过如下命令检查每个网络接口:
#ifconfig le0
le0: flags=8863
inet 127.0.0.1 netmask 0xffffff00 broadcast 255.0.0.1
入侵者经常会替换ifconfig等命令来避开检查,因此一定要检查命令程序的校验值。
在ftp.cert.org:/pub/tools/的cpm程序(SunOS平台)可以检查接口是否有混杂模式标记。
这些命令只在sniffer与内核存在链接时有效。而在缺省情况,sniffer是没有与内核链接的。大多数的Unix系统,例如Irix、Solaris、SCO等,都没有任何标记来指示是否处于混杂模式,因此入侵者能够窃听整个网络而却无法监测到它。
如果机器上使用两块网卡,把一块设置为杂乱模式,并把IP地址设置为0.0.0.0,另一块卡处于正常的模式并是正确的地址,这样将很难发现SNIFFER的存在。
注意:要监测只采集数据而不对任何信息进行响应的窃听设备,需要逐个仔细检查以太网上所有物理连接,不可能仅通过远程发送数据包或ping就可以检查计算机是否正在窃听.
六、如何阻止sniffer
<1>交换
随着交换机的成本和价格的大幅度降低,交换机已成为非常有效的使sniffer失效的设备。目前最常见的交换机在第三层(网络层)根据数据包目标地址进行转发,而不太采取集线器的广播方式,从理论上讲,通过交换设备对网络进行分段后,sniffer将无法透过边界而窥探另一边的数据包。但是,请注意:这是在边界设备不转发广播包的情况下(这也是通常的网络情况)。一旦入侵者使用spoofer诱骗某个边界设备而将自己的广播包流入不该进入的网段后,原理上还是在一个共享设备端使用sniffer,而实际上将是听到了边界的另一边).当然,这样会牵涉到ip欺诈和Mac欺诈的问题,然而,你别忘了,sniffer和spoofer是很少分开来的。
<2>加密
目前有许多软件包可用于加密连接,从而使入侵者即使捕获到数据,但无法将数据解密而失去窃听的意义。
<3>入侵检测
使用诸如Tripwire之类的工具,生成文件系统的MD5″数据指纹”,及时发现被修改的系统文件;
<4)使用antisniffer软件
一些流行的检测SNIFFER的程序:
http://www.attrition.org/security/newbie/security/sniffer/promisc.c –是一个很小的C程序,当编译好后,会查找本地机器上任何处于杂乱模式的NIC网络适配卡。
http://www.attrition.org/security/newbie/security/sniffer/neped.c –是一个用来远程检查任何嗅探活动的程序,可惜它只在LINUX下编译,当然你也可以简单的使用’ifconfig-a’来检查你的UNIX机器是否有PROMISC标志。
http://www.l0pht.com/antisniff/这是L0pht写的很好的反SNIFFER程序,L0PHT还打算公开LINUX版本上的源码版本。
下面我介绍一下sentinel的用法
Sentinel主要是设计思想是portable,arrcurate implementation,就是说小巧点,精确实现几个熟知的杂乱方式探测技术。其中Sentinel支持三种方法的远程杂乱探测模式:DNS测试,Etherping测试,和ARP测试,其中还有一种ICMP ping Latency(ICMP PING反应时间)正在开发中。
此程序需要Libnet和libpcap库来支持,大家可以到下面的地址去下载:
LIbnet 1.0: http://www.packetfactory.net/Projects/libnet
libpcap 0.4: ftp://ftp.ee.lbl.gov/libpcap-0.4.tar.Z
首先说下它其中使用的三种模式:
–ARP测试模式:
这种方法是采用发送一个ARP请求,其中包含所有正确信息除了伪造的目标主机MAC硬件地址给我们的目标主机,这样如果目标主机没有处于杂乱模式,它将不会理睬这些信息包,因为这些信息包其认为不是指定给它们的,所以不会进行响应和回复,但如果此目标机器处于杂乱模式,ARP请求就会发生并进行内核处理,通过机器的回应信息我们就可以知道其处于杂乱模式。这种方法结合内核的特性来查看机器的运作状态,请看下面的Etherping 测试模式。
– DNS测试模式:
DNS测试主要是针对网络数据收集工具能执行IP到名字反转解析来提供DNS名字来代替IP地址(The DNS tests operate on the premise that many attacker network data gathering tools perform IP to name inverse resolution to provide DNS names in place of IP addresses)。在执行反转查询中,工具会从被动网络工具
模式转变为主动网络工具,而那些没有监视网络书记的工具就不会去解析信息包中的IP地址。利用这种信息,ANTI SNIFFER工具可以自身在本地主机中变为杂乱模式并在我们网络中发送无数个伪造的主机,这样,ANTI SNIFFER
工具就可以嗅探DNS请求来查看目标是否在请求解析那些不存在主机。
–Etherping 测试模式:
Etherping 测试模式依赖于目标主机的内核,也就所谓的内核测试。在通常情况下,硬件网络接口卡过滤和丢弃那些MAC地址不同于自己机器上的MAC地址的信息包或者不是广播Ethernet 地址的地址。就是说信息包是正确和实际的Ethernet地址或者是广播Ethernet地址,接口就会把这些地址COPY和传递给内核进行进一步处理。
但某些系统假定包含在以太帧中的数据包含某个目标主机中正确的IP地址或者广播地址,但具有不同于本地主机的MAC地址,当NIC设置为杂乱模式,发送给目标主机的每个数据包它还是傻傻的传递给操作系统进行分析。这样通过发送包含正确IP地址和不正确MAC地址的ICMP ECHO包给要检测的主机,如果目标主机回应了我们的请求,我们就知道其处于杂乱模式了。
多种LINUX内核存在这种问题,其中NETBSD也可以利用这个问题来检测杂乱模式,但需要使用广播地址的信息包,这种信息包使用带伪造ether帧的IP地址,如66:66:66:66:66:66.
关于WINDOWS95,98,NT的操作系统在杂乱模式中确实是检查信息包ETHER地址的,如果信息包的NIC ETHER地址符合本地主机就让堆栈来处理。但WINDOWS对广播的ether信息包存在问题,在普通环境下,如机器不在杂乱模式下,NIC只把含有起本身MAC地址的信息包或者ether地址是ff:ff:ff:ff:ff:ff传递给内核。但当在杂乱模式中驱动程序是检查ETHER地址,但它只检查ETHER地址的第一个八未组是否为Oxff就来判断信息包是否为广播或者其他,因此如果我们建立一个包含EHTER地址为ff:00:00:00:00:00的IP正确的信息包并发送给目标机器,如果其进行了响应的回应,就表示起处于杂乱模式。
但对WINDOWS的这种方法是依赖于所用的驱动程序的,默认的微软驱动程序有此特性并且大多数供应商的驱动程序也有此特性,但某些NIC过滤广播只是依靠第一个八为组,所以这些卡不适合此方法。
–网络和机器的反应时间测试(也可以说ICMP PING反应时间):
这种模式是比较有效的测试方法,依据是靠对操作系统的影响来测试。但其中的坏处就是这些测试会在短期内产生一些多数量的网络通信。
这些测试假定当网络卡不处于杂乱模式时提供硬件过滤,这样的话,信息包不是指定给本身机器的将被网络卡丢弃。当在这中情况下,在网络通信信息量将动态增长对操作系统的影响很小,相反的处于杂乱状态的机器由于不
对这层进行过滤,就把这些信息传递给系统或者用户模式进行过滤,会对操作系统产生比较大的影响。简单的说,我们先正常情况下PING一机器,再我们构建很多伪造的TCP连接来ping程序来ping目标,并且注意RTT(round
trip time),这样处于杂乱模式的机器由于会处理这些垃圾信息包,并影响系统并导致网络反映时间增加,然后来比较各个RTT,经过多次测试和人工判断就能决定目标机器上是否存在SNIFFER。
Sentinel是根据这些方法来进行测试的程序,是有源代码形式发放的。使用于OPENBSD 2.6 ;FREEBSD 3.X;NETBSD 1.4.1;LINUX2.2.X平台。
编译后使用方法为:
#./sentinel -t 192.168.0.1 -a 是ARP测试。
#./sentinel -t 192.168.0.1 -e 是etherping test;
#./sentinel -t 192.168.0.1 -f 1.1.1.1 -d 是DNS测试;
#./sentinel -t 192.168.0.1 -f 1.1.1.1 -d -a -e 是允许所有模式进行测试。
——————————————————————
公告栏
———————————
留言板
———————————
看广告玩游戏送QQ币
显卡常见故障全面解决
一、接触不良
显卡接触不良是导致显卡不能稳定工作的原因之一,而出现接触不良主要是有以下的四种可能造成的。第一,不少价格低廉的主板的AGP插槽用料不是很好,AGP槽不但不能和显卡PCB紧密接触,有的主板还省略AGP插槽的卡子,这就让我们的显卡在插槽中有了松动的空间。其次,就是在安装显卡的过程中,一些劣质的机箱背后挡板的空档不能和主板AGP插槽对齐,在强行上紧显卡螺丝以后,过一段时间可能导致显卡的PCB变形,这是AGP显卡和插槽接触不良的另外一个原因。还有就是我们通常谈到的显卡“金手指”本身的问题。不少劣质的显卡的金手指上的镀层金属厚度不够,在多次插拔显卡后,镀层金属已经脱落,导致显卡的金手指在潮湿的空气中氧化。最后一种情况就是灰尘在AGP插槽周围堆积,使得显卡金手指和主板的接触出现问题。随着大功率的显卡风扇的出现,这个问题已经出现的越来越频繁了。
解决办法:针对接触不良的的显卡,如果根据判断发现是显卡在尺寸上和机箱不能“兼容”,只要尝试的去松开显卡的螺丝就可以了。如果你担心电脑在使用过程中会遇到撞击、移动而导致电脑运行产生问题,那么你可以使用宽胶带将显卡挡板固定在它的位置,如果还不放心就把显卡两边的机箱都装上,把显卡的的挡板夹在中间。如果你的显卡金手指遇到了氧化问题,那么解决的时候可能要麻烦许多,首先你要使用绘图橡皮把金手指上的锈渍除掉,如果清除以后你的显卡能够正常工作,那么你是幸运的,如果显卡还不能正常的工作,我们就需要使用除锈剂清洗金手指,然后在金手指上轻轻的敷上一层焊锡,以增加金手指的厚度,注意不要让相临的金手指之间短路哦。
二、 供电问题
和CPU升级的时候遇到的问题非常相似,当初设计的电路往往不能应付后来出现的硬件设备的供电需求。随着显卡功耗的迅速增加,显卡升级的时候总会有可能会遇到AGP供电不足的问题,尤其是在炎热的夏天,GPU巨大的功耗对于主机电源、主板的供电电路都会是一个严峻的考验。如果您在运行大型的3D游戏的时候,经常遇到黑屏的问题,而且这个时候您有刚刚升级了显卡,笔者建议您有必要检查下主机电源和主板供电的问题。如果您的显卡在冬天运行良好,而到了夏天则非常的不稳定,那么除了检查下显卡本身的散热,还应当注意下供电问题,因为在炎热的夏天,开关管电源和主板的MOS管会比冬天的时候工作’辛苦’许多。
解决办法:如果是因为AGP供电不足而引起的显卡工作不正常,可以在CMOS设置中关闭AGP加速功能,让我们的显卡做为一块普通的没有AGP加速功能的显卡来用,如果你觉得在性能上损失比较大,我们也有折中的办法,就是将AGP总线加速速度降低一个层次,比如AGP4X可以使之运行在AGP2X。较低的AGP总线速度比起较高的AGP总线速度可以大幅度的提高系统的稳定性。如果您所购买的主板能够调节AGP电压,那么恭喜你,也许您可以通过提高AGP电压来满足显卡比较高的供电需求。一般来说,将AGP电压提高0.1-0.2V,不会对硬件造成什么伤害,但是AGP的供电却比原来稳定许多。最后要谈到的是我们还可以听取主板厂商的建议,打一个客户服务电话或者上一下厂商网站的论坛,也许会有让人兴奋的收获。笔者的一位朋友曾经遇到过显卡供电不足的问题,他所使用的主板是某知名厂商一年半以前的产品,在使用各种’软性’办法不能解决以后,该厂商的工程师主动提出把主板邮寄回厂,由工程师帮忙修改电路以增强AGP的供电能力。至于是不是每个人都能碰上这样的’好事’,那还要看看你的运气了。
三、CMOS设置不合理
世界上没有哪件产品是完美的,硬件产品也是如此。显卡的发展速度是如此之快,以至于不少新的特性和功能,对于我们的硬件系统来说,不仅不能完美支持,而且还会直接影响我们电脑的稳定性。边带寻址功能的设计初衷是为了利用闲置的总线带宽来增加显示子系统的带宽,但是VIA毕竟不是AGP标准的创立者,所以,对于大多数的VIA显卡来说,边带寻址功能的支持都不够完美,不少主板生产厂商为了稳定起见,在出厂的默认设置中就关闭来该功能,如果你在VIA系统的CMOS设置中把边带寻址打开了,那么它十有八九就是影响你电脑稳定性的罪魁祸首。
再就是主板的ACPI高级电源管理系统里有一个项目叫做VIDEO OFF METHOD,通过它我们设置显示器的关闭方式,遗憾的是不少的主板对新的显卡支持有限,所以在显示器进入休眠以后经常出现难以唤醒的黑屏现象。
解决办法:在CMOS设置中把出问题的选项关掉^_^,要是不怕麻烦的话可以吧BIOS刷到最新版本,可以解决不少的兼容性问题哦。
四、VGA插头上的隐患
显卡上的VGA插头在多次插拔以后可能会导致针孔中的簧片变松,使得其不能和显示器的信号线公头良好接触;还有就是对显示器信号线的暴力拉扯,也可能导致VGA插头信号传输问题。对于常见的15针的VGA插头,1、2、3脚分别对应红、绿、蓝三色信号,其正常的电压波动范围是0.03V-0.06V;13、14脚分别对应显示器的行扫描信号和场扫描信号,对于行扫描输出信号,正常工作的时候电压应该为3V-5V,场扫描信号不应该高过1V。如果你在对VGA插头暴力操作以后,显示器黑屏,经过测量后发现VGA插头的针脚输出电压异常,那么基本上可以断定VGA插头出现了问题。
解决办法:碰到VGA插头内部簧片松动的情况,可以使用焊锡把显示器信号线公头上的针脚加粗,让松动的簧片重新和显示器信号线紧密接触。对于检查出中现问题的VGA针脚,可以顺着VGA插头找到PCB板上的对应焊点,发现断路,重新补焊就可以了。
五、刷新BIOS和更改驱动程序引起的故障
曾经有一段时间,DIY群体中兴起了一阵显卡BIOS替换的热潮,不少人希望通过把名牌显卡的BIOS文件刷到自己显卡中这样的手段来提高显卡性能。这样的做法也许有效,但是本质上讲,使用名牌显卡的BIOS文件所带来的硬件性能的提升不过是BIOS文件中对显存的频率以及延迟的重新设置造成的,大多数主流的显卡BIOS文件已经相当完善,不可能通过更改BIOS文件来取得性能上巨大的提升,相对于硬件性能微乎其微的提升,稳定性上的我们的损失可能会更大一些。就是同一厂商同一型号的显卡,他们的BIOS文件也是不相同的,厂商也会根据该批出厂的显卡的具体情况对BIOS文件进行一定的修改,以增强产品稳定性,而我们手中的这块和名牌显卡一点“亲戚关系”都没有的显卡,在用了别人的BIOS之后,出现稳定性问题也是正常的了。如果您在更新显卡BIOS以后,经常性的出现黑屏、游戏中自动退出或者屏幕上出现有规律条纹的现象,那么很有可能您刷的BIOS有问题。
解决办法:刷回原来的显卡BIOS文件就可以了。除非你真的需要通过刷新显卡的BIOS文件来解决兼容性问题,否则,还是尽量让显卡使用原来的BIOS吧,毕竟刷BIOS是一件麻烦的事情。对于主流的显卡,刷新BIOS文件不会有性能上的提升,否则,网络上铺天盖地的高性能显卡选购文章就不会只谈到显卡的核心频率和显存频率,而不谈显卡BIOS的版本号了。
以上就是应付简单的显卡故障的几条不传秘籍,相信您在“进修”完这篇文章之后一定可以大声的说出:“让黑屏走开!”当然,如果您遇到的问题比较严重,比如显卡芯片上有焦糊味道或者PCB上的电容一个个的都变“啤酒肚”,那你还是赶紧拿到显卡的维修点去吧,因为这已经不是显卡常见的一般故障了。
来源:中关村在线
——————————————————————
公告栏
———————————
留言板
———————————
看广告玩游戏送QQ币