最终目标是使用模块创建ARP侦听器和发件人。
我想替换:
my $IP = "xx.x.x.xx"; #this is an actual local ip address
my $MacAddress = "ff:ff:ff:ff:ff:ff"; # this is an actual macadd
my $LAN = "xx.x.x.xx/24"; #this has the ip and subnetmask
使用模块Sys::Addrr
在每次运行程序时自动获取IP和LAN,这包括在不同的计算机上。
我已经使用cpan- https://metacpan.org/pod/Sys::HostAddr
获得了这么多代码my $sysaddr = Sys::HostAddr->new();
my $href = $sysaddr->ip();
foreach my $interface ( keys %{$href} ){
foreach my $aref ( @{$href->{$interface}} ){
print " $aref->{address}\n";
print " $aref->{netmask}\n";
}
}
但是我不理解这个代码或结构的sytanx足以能够仅提取第一个数组引用以供使用。使用Data::Dumper
我能够看到细分,注意它将我想要的地址分配到1位置,但我仍然无法提取它以供使用在该计划中。
我还注意到通过Sys::Addr
无法获得MacAddress - 我假设需要另一个模块。
编辑: 运行时提取的信息是:
$VAR1 = {
'lo' => [
{
'address' => 'x.x.x.x',
'netmask' => 'x.x.x.x'
}
],
'eth0' => [
{
'netmask' => 'x.x.x.x',
'address' => 'x.x.x.x'
}
]
};
我正在尝试提取" eth0"用于程序的两个变量中的内容。
没有此新增内容的完整代码供用户参考如下:
use strict;
use warnings;
use Net::Pcap::Easy;
use Net::Netmask;
use Net::ARP;
use Sys::HostAddr
my $IP = "x.x.x.x"; #IP Address omitted for example
my $MacAddress = "ff:ff:ff:ff:ff:ff"; #Mac Address omitted for example
my $LAN = "x.x.x.x/24"; # address omitted for example
my $parentpid = $$;
my $childpid = fork() // die "Fork Failed $!\n";
if ($childpid){
print "perl lab6.pl $IP\n";
print "Scanning $LAN\n";
print "Starting parent $$ with child $childpid\n";
print "Starting child pid $childpid\n";
&send_loop;
sleep 1;
print "Killing child $childpid\n";
kill 'KILL', $childpid;
waitpid ($childpid, 0);
print "Exiting parent $$\n";
exit;
}
else {
&cap_packs;
}
sub cap_packs{
my $listener = Net::Pcap::Easy->new(
dev => "eth0",
filter => "arp",
packets_per_loop => 1,
arp_callback => sub {
my($npe,$ether,$arp,$header)=@_;
print "Hello";
if($arp->{opcode}==2){
my $iphex = $arp->{spa};
my @ip =($iphex=~/(..)(..)(..)(..)/);
my $ipstr = hex($ip[0]).".". hex($ip[1]).".".
hex($ip[2]).".".hex($ip[3]);
print "Host $ipstr is alive.";
}
}
);
$listener->loop while 1;
}
sub send_loop{
my $netobj = new Net::Netmask($LAN);
for my $Remote_IP ($netobj->enumerate) {
Net::ARP::send_packet(
"eth0",
$IP,
$Remote_IP,
$MacAddress,
"ff:ff:ff:ff:ff:ff",
"request");
}
}
答案 0 :(得分:0)
对于Sys::Addr
我想出了如何让它正常工作。
my $sysaddr = Sys::HostAddr->new();
my $IP;
my $LAN;
my $href = $sysaddr->ip();
ints:foreach my $interface ( keys %{$href} ){
foreach my $aref ( @{$href->{$interface}} ){
$IP = "$aref->{address}\n";
$LAN = "$aref->{address}:$aref->{netmask}\n";
if ($interface eq "eth0"){last ints}
}
}
这使我可以利用' eth0'作为一个全局变量。