为你的VB程序程序加密(VB新手)

2/27/2006来源:Visual Basic教程人气:9757

VB的好处我就不多说了。VB初学者模仿能力很强,总希望自己的程序看起来专业一点,如用密码登录、制作限次版、限时版、强行启动等等,其实这些东西并不神秘,在VB里只要用少量代码就可实现。
  1.最简单的可执行文件密码登录:
  在程序启动时加入以下代码:
  PRivateSubForm_Load()
  DimaasVariant
  a=InputBox("请输入密码!")
  Ifa<>"****"ThenMsgBox"密码错误,您不能使用本软件!":End注释:****为预先设定的字符
  EndSub
  怎么样,能唬人吧。什么?太烂!
  2.在硬盘上建立一个文件用于存放密码,这样就可以读写修改了
  OnErrorGoTosss
  注释:若文件不存在,则捕获该错误,建立密码
  Open("c:\abc.abc")ForInputAs#1
  注释:文件存在,则打开文件
  Input#1,b注释:将密码读入变量b
  Close#1
  a=InputBox("请输入密码!")
  Ifa<>bThenMsgBox"密码错误,您不能使用本软件!":End
  ExitSub
  sss:
  a=InputBox("请建立密码!")
  Open("c:\abc.abc")ForOutputAs#2注释:在硬盘上建立存放密码的文件
  Print#2,a
  Close#2
  MsgBox"建立密码成功!"
  使用InputBox输入密码的缺点是密码被显示出来,大家可以另建一个窗体代替输入对话框,加入一TextBox并将其PassWordChar属性设为*就行了。文件abc.abc可用任何文本文件打开编辑,因此在你未学会加密算法之前可将文件命名为*.sys或*.dll,并放在windows或system目录下,甚至将其属性设为隐藏,哈哈,系统文件谁敢乱改!不过要小心不要覆盖真正的系统文件。
  用启动登录的方法加密会令用户反感,最好只用在软件中较重要的修改数据部分或用于多用户登录。如果你想制作共享软件,那就先试试限次版吧。
  3.软件限定使用次数说白了也是在硬盘中的某个地方作个标记,每启动一次就记数一次,当次数加到一定值时就不允许使用软件。以上代码稍加改动也能实现:
  PrivateSubForm_Load()
  OnErrorGoTosss
  注释:若文件不存在,则建立文件
  Open("c:\abc.abc")ForInputAs#1
  注释:文件存在,则打开文件
  Input#1,b注释:将数值读入变量b
  Close#1
  Ifb>100ThenMsgBox"对不起,您只能使用本软件100次!":End
  注释:提示用户使用次数并退出程序
  c=b+1注释:计数器加1
  Open("c:\abc.abc")ForOutputAs#3
  Print#3,c注释:将加1后的数值写入文件
  Close#3
  ExitSub
  sss:
  Open("c:\abc.abc")ForOutputAs#2
  Print#2,1注释:建立文件,并写入数值1
  Close#2
  EndSub
  4.大家一定对win.ini和system.ini文件很熟悉吧,它是一种专门用来保存应用程序初始化信息和运行环境信息的文本文件,Windows软件的初始化参数的获取与保存是通过读取扩展名为.ini的文本文件来实现的。目前很多软件干脆就把软件密码保存在自己的ini文件中。VB只要利用API的GetPrivateProfileString和WritePrivateProfileString两个函数就可以很方便地读写ini文件,从而可以保存、读出和验证密码。首先认识一下ini文件。
  ini文件的形式为:
  [section1]
  keyword1=value1
  keyword2=value2
  ……
  [section2]
  keyword1=value1
  keyword2=value2
  ……
  section是段名,keyword是关键字名,value为关键字对应的设定值
  首先用WritePrivateProfileSection创建新的段名和关键字名:
  DeclareFunctionWritePrivateProfileSectionLib"kernel32"Alias"WritePrivateProfileSectionA"(ByVallpAppNameAsString,ByVallpStringAsString,ByVallpFileNameAsString)AsLong
  DeclareFunctionWritePrivateProfileStringLib"kernel32"Alias"WritePrivateProfileStringA"(ByVallpapplicationNameAsString,ByVallpKeyNameAsAny,ByVallpStringAsAny,ByVallpFileNameAsString)AsLong
  A=WritePrivateProfileSection("user","password","c:\windows\user.ini")
  在windows目录下的user.ini文件中创建新段名user及该段名下的关键字password,如果目录下没有user.ini文件,则创建该文件
  B=WritePrivateProfileString("user","password","1234","c:\windows\user.ini"),设定关键字user的值为1234。这样在你的user.ini文件就会多出一段:
  [user]
  password=1234
  利用GetPrivateProfileString函数可以读出password的值:
  DeclareFunctionGetPrivateProfileStringLib"kernel32"Alias"GetPrivateProfileStringA"(ByVallpApplicationNameAsString,ByVallpKeyNameAsAny,ByVallpDefaultAsString,ByVallpReturnedStringAsString,ByValnSizeAsLong,ByVallpFileNameAsString)AsLong
  DimkeyasString*255
  c=GetPrivateProfileString("user","password","false",key,255,"c:\windows\user.ini")
  Ifkey="false"then
  MsgBox"文件不存在或没有该字段"
  Else:Form1.Print"Thepasswordis";key
  该函数将文件user.ini中password的值(即你设定的密码)赋予key,若发生错误(文件不存在或没有该段名)则key的值为“false”,注意一定要声明变量key的长度并与函数中的值一致。这样你就可以将key与登录密码进行对照或直接处理key的值来决定是否继续运行程序。
  使用ini文件存储密码还有一个好处,就是设计者可以建立几个段名来存储不同的密码,从而可实现多用户登录。
  5.在注册表中标记密码可能是保护你的劳动成果的最高境界了。主要方法是在注册表中创建一个键名,在键值里存放你的密码,以后运行时则取出该数据进行验证或处理,当满足条件时终止程序。可以认为注册表是"以乱取胜",只要你选择到一个隐蔽的位置做标记或存放数据,不用做任何加密算法的处理都应该是比较安全的。令人惊喜的是VB很容易利用API操作注册表。这里只简单介绍几个API函数,大家只要参照函数说明,正确引用变量传递数据,不需要任何技巧就可操作注册表。
  RegCreateKeyEx:创建关键字,如果关键字已存在,则将只简单地将它打开
  RegOpenKey:用于打开某键
  RegSetValueEx:打开某键后,用于设置其键值
  RegQueryValueEx:查询一个存在的值,如果此函数调用成功,会返回ERROR_SUCCESS标志
  制作限时版只要会用几个函数如day、month、year、date就行了。例如到了2001年就不能执行程序:
  a=Year(Date)
  ifa>=2001thenMsgBox"对不起,该软件已过期":End
  你还可以用前面的方法使条件满足时在硬盘上作个标记,而用户通过修改系统时间、重新安装也不能再使用软件。
  怎么样?学会了对硬盘的简单读写操作,这些东东一点也不神秘了吧!虽然不是很高明,但很多软件都确实使用这种方法进行简单加密;随着解密手段越来越高明,单一加密方法已成为过去,一些软件同时在ini文件和注册表等地方做标记,当然不是简单的把你输入的保存起来,win9x拨号上网时如果选择保存密码也会在硬盘上生成user.pwl文件,不过该文件加了密,强行用文本编辑器打开时只会看到些乱码。哈哈,又心痒痒想学其他招数了吧!->