From 8cf5fcd24b3e02364df9cd7ba339aae133b34a2d Mon Sep 17 00:00:00 2001 From: shadowy-pycoder <35629483+shadowy-pycoder@users.noreply.github.com> Date: Fri, 15 Aug 2025 14:59:49 +0300 Subject: [PATCH] updated network package to work on android --- arpspoof/arpspoof.go | 14 +++++++++++--- network/network.go | 31 +++++++++++++++++++++++++++++++ version.go | 2 +- 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/arpspoof/arpspoof.go b/arpspoof/arpspoof.go index 2bba3bd..58bce7a 100644 --- a/arpspoof/arpspoof.go +++ b/arpspoof/arpspoof.go @@ -200,9 +200,14 @@ func (ar *ARPSpoofer) ARPTable() *ARPTable { func NewARPSpoofer(conf *ARPSpoofConfig) (*ARPSpoofer, error) { arpspoofer := &ARPSpoofer{} // determining interface - iface, err := network.GetDefaultInterface() + var iface *net.Interface + var err error + iface, err = network.GetDefaultInterface() if err != nil { - return nil, err + iface, err = network.GetDefaultInterfaceFromRoute() + if err != nil { + return nil, err + } } if conf.Interface != "" { arpspoofer.iface, err = net.InterfaceByName(conf.Interface) @@ -236,7 +241,10 @@ func NewARPSpoofer(conf *ARPSpoofConfig) (*ARPSpoofer, error) { } else { gwIP, err = network.GetDefaultGatewayIPv4() if err != nil { - return nil, fmt.Errorf("failed fetching gateway ip: %w", err) + gwIP, err = network.GetDefaultGatewayIPv4FromRoute() + if err != nil { + return nil, fmt.Errorf("failed fetching gateway ip: %w", err) + } } } arpspoofer.gwIP = gwIP diff --git a/network/network.go b/network/network.go index 2c5e6e7..bdef9a4 100644 --- a/network/network.go +++ b/network/network.go @@ -139,6 +139,21 @@ func GetDefaultInterface() (*net.Interface, error) { return net.InterfaceByName(defaultInterface) } +func GetDefaultInterfaceFromRoute() (*net.Interface, error) { + cmd := exec.Command("sh", "-c", `ip -4 route get 8.8.8.8 | tr -d '\n'`) + routeRaw, err := cmd.Output() + if err != nil { + return nil, err + } + routeFields := strings.Fields(string(routeRaw)) + for i, f := range routeFields { + if f == "dev" && i+1 < len(routeFields) && routeFields[i+1] != "tun" { + return net.InterfaceByName(routeFields[i+1]) + } + } + return nil, fmt.Errorf("failed getting default interface from route") +} + func GetDefaultGatewayIPv4() (netip.Addr, error) { cmd := exec.Command("sh", "-c", `ip -4 route show 0.0.0.0/0 | awk '{print $3 " " $5}'`) ipdevRaw, err := cmd.Output() @@ -167,6 +182,22 @@ func GetDefaultGatewayIPv4() (netip.Addr, error) { return netip.Addr{}, fmt.Errorf("gateway IPv4 not found ") } +func GetDefaultGatewayIPv4FromRoute() (netip.Addr, error) { + cmd := exec.Command("sh", "-c", `ip -4 route get 8.8.8.8 | awk '{print $3}' | tr -d '\n'`) + ipstrRaw, err := cmd.Output() + if err != nil { + return netip.Addr{}, err + } + ip, err := netip.ParseAddr(string(ipstrRaw)) + if err != nil { + return netip.Addr{}, err + } + if !ip.IsValid() || !ip.Is4() { + return netip.Addr{}, fmt.Errorf("failed getting default gateway from route") + } + return ip, nil +} + func GetGatewayIPv4FromInterface(iface string) (netip.Addr, error) { cmd := exec.Command("sh", "-c", fmt.Sprintf("ip -4 route show dev %s", iface)) routes, err := cmd.Output() diff --git a/version.go b/version.go index 168cd96..3604c1f 100644 --- a/version.go +++ b/version.go @@ -1,3 +1,3 @@ package mshark -const Version string = "mshark v0.0.14" +const Version string = "mshark v0.0.15"