信使服務是 Windows 2000/XP 內建的通訊服務,讓使用者在網路上如同使用 QQ 般進行即時交流,但無需註冊帳號,僅需知道對方 IP 位址(或區域網路電腦名)即可發送訊息。除命令列 net send 外,也可透過「控制台」發送。接收端必須為 Win2000/XP(Win9x 需手動啟動 WinPopup)。
整個發送過程只需呼叫一個 API 函數:
NET_API_STATUS NetMessageBufferSend(
LPWSTR servername, // 目標伺服器名,NULL 表本機
LPWSTR msgname, // 目標電腦名或 IP
LPWSTR fromname, // 來源電腦名或 IP(可偽造實現匿名)
LPBYTE buf, // 訊息緩衝區(Unicode 編碼)
DWORD buflen // 緩衝區位元組數
);
關鍵在於 fromname 參數:填入假冒的電腦名或 IP 即可實現匿名發送,這也是許多廣告彈窗偽裝來源的原理。
專案建立步驟:VC++ 6.0 新建 Win32 Console Project → 加入 netsend.c → 連結 netapi32.lib。
#define _UNICODE
#define UNICODE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>
#include <Windows.h>
#include <locale.h>
#include <lm.h>
#pragma comment(lib, "netapi32.lib")
int wmain(int argc, wchar_t *argv[]) {
if (argc < 4 || argc > 5) {
wprintf(L"Usage: %s [Count]\n", argv[0]);
return 0;
}
wchar_t *wdest = argv[1];
wchar_t *wfrom = argv[2];
wchar_t *buffer = argv[3];
int count = (argc == 5) ? _wtoi(argv[4]) : 1;
if (count == 0) count = 1;
DWORD dwReturn = NetMessageBufferSend(NULL, wdest, wfrom,
(LPBYTE)buffer, 2 * wcslen(buffer)); // Unicode 需乘 2
if (dwReturn == NERR_Success) {
wprintf(L"Send OK!\n");
while (--count > 0) {
NetMessageBufferSend(NULL, wdest, wfrom, (LPBYTE)buffer, 2 * wcslen(buffer));
}
} else {
// 錯誤碼對照處理...
wprintf(L"Error: %lu\n", dwReturn);
}
return 0;
}
本範例展示了如何利用 NetMessageBufferSend 快速建立信使服務發送程式,幫助開發者理解 Windows 訊息傳遞機制的內部運作。實際應用中請注意資安與濫用風險。