字號:
網絡“信使服務”原理及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;
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 + -