Net-NetSend
view release on metacpan or search on metacpan
my $source_netbios_name_cipher = get_nb_string($mbsource_netbios_name_cleartext);
#Create Netbios Session Request Packet
my $init_packet = $SESSION_REQUEST . $INIT_SESSION_FLAGS .
get_2bytes_length($target_netbios_name_cipher.$source_netbios_name_cipher) .
$target_netbios_name_cipher . $source_netbios_name_cipher;
#Send Netbios Session Request Packet
print $sock $init_packet;
#Receive Session Request Response
my $init_resp="";
my $inmask='';
vec($inmask, fileno($sock), 1)=1;
select(my $outmask = $inmask, undef, undef, 0.25); #0.25 sec timeout
recv($sock, $init_resp,1024, 0);
#print "received data: $init_resp\n";
#print_to_file("c:\\test.log", $init_resp);
#Check Session Request Response for Success
if( $init_resp !~ /^$NB_SESSION_ESTABLISHED/){
my $error = ord(substr($init_resp,0,1));
$error_texts .= "Warning! Session request failed.\n";
$error_texts .= "Opcode: ".$error." (0x".sprintf("%.0x", $error).")\n";
$error_texts .= "Reason: " . $NB_ERROR_TEXT{$error} . ".\n\n";
$error_texts .= $NB_ERROR_HELP{$error} . "\n";
$overall_succes=0;
return;
# $error_texts .= "Warning: Session request failed.\nOpcode: 0x".sprintf("%.0x", ord(substr($init_resp, 0, 1)))."\n";
# $overall_succes = 0;
# return;
}
else{
print "Session established.\n" if $confirm_packets;
}
#Create "Start of Multi-Block Message" Packet
my $smbmrs_header = get_SMB_header($SMB_HEADER_SEND_MULTI_BLOCK_MSG_START);
my $smbmrs_body = get_SMB_body(
$mbsource_netbios_name_cleartext, #source
$mbtarget_netbios_name_cleartext, #target
undef, #message
$SMB_HEADER_SEND_MULTI_BLOCK_MSG_START #type
);
#Netbios - Encapsulate "Start of Multi-Block Message" Request
my $ssbmr_packet = netbios_session_encaps($smbmrs_header.$smbmrs_body, $NB_SESSION_MESSAGE);
#Send "Start of Multi-Block Message" Request
print $sock $ssbmr_packet;
$MBM_MESSAGE_GROUP_ID = receive_and_check_answer_packet($sock,
"Start of Multi Block Message failed",
"MBM start",
$confirm_packets,
0);
# print "\n\nGroup id: ". ord($MBM_MESSAGE_GROUP_ID) . "\n\n";
#split message into parts
my @messageparts;
for(my $start =0; $start < length($mbmessage); $start+=128){
push @messageparts, substr($mbmessage, $start, 128);
}
#send each part of the message
my $teilcounter = @messageparts;
for(my $i = 0; $i < $teilcounter; $i++){
send_part_mbm($messageparts[$i], $teilcounter, $sock, $confirm_packets);
}
#$teilcounter=4;
send_mbm_end($teilcounter, $sock, $confirm_packets);
}
sub send_mbm_end{
my $msg_group_id = shift;
my $sock = shift;
my $confirm_packets = shift;
my $smb_body = chr(0x01)
# . chr($msg_group_id)
. $MBM_MESSAGE_GROUP_ID
. ("\0"x3)
;
my $smb_header=get_SMB_header($SMB_HEADER_SEND_MULTI_BLOCK_MSG_END);
my $mbm_packet = netbios_session_encaps($smb_header.$smb_body, $NB_SESSION_MESSAGE);
print $sock $mbm_packet;
receive_and_check_answer_packet($sock, "End of multi block message request failed", "MBM end", $confirm_packets, 0);
}
sub send_part_mbm{
my ($msg, $teilcounter, $sock, $confirm_packets) = @_;
my $smb_multi_header = get_SMB_header($SMB_HEADER_SEND_MULTI_BLOCK_MSG_TEXT);
my $smb_multi_body =
chr(0x01) #Word Count
. $MBM_MESSAGE_GROUP_ID . "\0" #Group ID alias "Byte Count"
. chr(length($msg)+3) #Not "Buffer format" but message length plus 3!
. "\0" . chr(0x01) #Message Length??? = 256???
. chr(length($msg)) #Not "Buffer format" but exact message length!
. "\0" #unknown
. $msg #Message text
;
my $mbm_packet = netbios_session_encaps($smb_multi_header.$smb_multi_body, $NB_SESSION_MESSAGE);
select(undef, undef, undef, 0.05); #0.05 sec sleep
print $sock $mbm_packet;
receive_and_check_answer_packet($sock, "Part of multi block message request failed", "MBM text", $confirm_packets, 0);
}
sub receive_and_check_answer_packet{
my $sock = shift;
my $warning = shift;
my $packet_desc = shift;
my $confirm_success = shift;
my $die = shift;
( run in 3.016 seconds using v1.01-cache-2.11-cpan-71847e10f99 )