⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 信使服务程序资料.txt

📁 一个采用delphi开的数库系统
💻 TXT
字号:
网络“信使服务”原理及Delphi下的实现 
--------------------------------------------------------------------------------
日期:2005年1月3日 作者:晶晶 人气: 人 [ 大 中 小 ]  
  你是不是碰到这种情况:好好的在做某事,突然之间弹出一个对话框,请你访问某某网站。反正我碰到不少。(注:只有win2000以上的版本提供这个功能)

那么它是怎么来的(废话:肯定是别人发的咯)?我是说它是怎么做出来的,就是它的原理是什么?

其实这是win2000中提供的一项服务(依靠netapi32.dll中的api)-“信使服务”。它本来是为了在局域网中简单对话或者提示而出现的,可现在却被用在互联网上用来做广告了,而且对于一般的用户(区别于电脑高手)是没有办法拒绝的!下面是我原来帮朋友编写的一个程序部分核心代码,通过它来解释一下,并且给出如何拒绝这种服务的办法。

1.编写信使服务部分
    信使服务的核心是netapi32.dll提供的“netmessagebuffersend”api函数,这里写出它的在delphi中的声明,因为在delphi中并没有给出它的object pascal声明,所以要自己在单元中声明:

function netmessagebuffersend(servername:pwidechar;
                                             toname:pwidechar;
                                             fromname:pwidechar;
                                             buf: pwidechar;
                              var buflen:integer):integer;stdcall; external 'netapi32.dll' name 'netmessagebuffersend';

注意其中的参数都是pwidechar类型哟!而且不是普通的pcha类型,所以我们要做个简单的转化,转化的过程到是很简单,使用stringtowidechar函数即可。
现在解释一下其中的参数:

servername:服务器名,可以写你的名字,当然也可以用nil;
toname:接受方的ip地址;(注意:这里不是integer类型!)
fromname:发送人的名字,就是你的了,你可以写你的名字,也可以写别的了;
buf:消息主体的内容;
buflen:消息主体的大小,设大点就可以了。

现在我们可以设置几个string变量了,假设string1是你的名字,string2是接受者的ip,string3是消息内容。

const
  max_length=1025;//设置消息内容的大小,够大了吧,呵呵
var
  string1,string2,string3:string;
  pstring1,pstring2:array[0..28] of pwidechar;
  pstring3:array[0..1024]o of pwidechar;
  length,i,j:integer;
  //下面先进行一个转换,讲string类型转换成api函数的pwidechar类型
begin
  for i:=0 to 28 do pstring1[i]:=#0;//将所有的字节都填充#0字符
  stringtowidechar(string1,psting1,length);//这个rtl函数可以完成这个转换
  for i:=0 to 28 do pstring2[i]:=#0
  stringtowidechar(string2,psting2,length);
  for i:=0 to 1024 do pstring1[i]:=#0
  stringtowidechar(string3,psting3,length);
//length返回实际转换的空间(字节长度),不要管他!
//转换完成了,现在可以调用这个api了
j:=netmessagebuffersend(nil,@psting2,@pstring1,@pstring3,max_length);
//判断一下是否发送成功
if j<>0 then
begin 
messagebox(handle,pchar('send error!'),pchar('error'),mb_ok)
else 
messagebox(handle,pchar('send success!'),pchar('ok'),mb_ok);
end;

整个功能大致就完成了。你可以发挥你的想象,如:
对一段ip发送消息,其实就是一个循环而已,但在ip的处理字符串中有一点小技巧的(我的程序就实现了这个功能,呵呵);
还可以对一个ip地址进行多次的发送,轰炸它,呵呵

2.如何禁止信使服务:
  禁止信使服务有几种方法,我这里就讲两种,一种是直接操作,一种是在程序中实现的方法。
直接操作:你可以按下面这个步骤来禁止服务
开始菜单->控制面板->管理工具->服务->messenger服务,右键点击出弹出菜单,按“停止服务”即可;
程序中的操作:
在我这个程序中其实用到一个小的技巧,因为在dos环境下windows提供了著名的net命令,你只要在dos窗口下敲上如下命令:net /?就可以看到net提供的各种服务了,我们这里就用到了stop和start两个子服务!那么我们就可以直接隐藏运行他们就可以了,呵呵简单吧?代码如下:
停止服务:
winexec(pchar('net stop messenger'),sw_hide);
启动服务:
winexec(pchar('net start messenger'),sw_hide);
好了,你可以写出一个简单的信使服务程序了,你甚至还可以做到先ping对方的ip,看它是否在线,如果在线就可以发信息给它了。由于在程序中是利用winsock中的icmp协议来ping对方的,这个东西要详细讲看来又要写这么多了,打字太麻烦了,如果谁想看看我的程序和所有的源代码,可以给我来信:tufeiping@vip.sina.com,希望大家做出更好更全面的程序来,到时候可不要来烦我哟!呵呵
 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -