diff --git a/Networksc/VenomAge.py b/Networksc/VenomAge.py index 7d8e7f3..a81f209 100644 --- a/Networksc/VenomAge.py +++ b/Networksc/VenomAge.py @@ -1,202 +1,335 @@ import tkinter as tk +from tkinter import messagebox, ttk import subprocess import random +import re +import os -from tkinter import messagebox - -form = tk.Tk() -form.title("VenomAge") -form.geometry("600x400") -form.resizable(True,True) - -var = messagebox.showinfo("Warning ", "Welcome to VenomAge") - - - -label=tk.Label(form, font='italic 17 bold',text="Choose The Action You Want") -label.pack() - -label9=tk.Label(form, font='italic 8 bold',text="@Batu Kapicioglu") -label9.place(x=465,y=370) - -label10=tk.Label(form, font='italic 7 bold',text="Linux") -label10.place(x=25,y=373) - -def mac_veri(): - - form.destroy() - form2 = tk.Tk() - form2.title("VenomAge") - form2.geometry("600x400") - form2.resizable(True, True) - - var = messagebox.showinfo("Warning ", "Mac_Changer Starting") - - label1=tk.Label(form2, font='italic 17 bold' ,text="Mac Address Changer") - label1.pack() - - label2=tk.Label(form2, font='italic 10 bold' ,text="Interface :") - label2.place(x=10,y=50) - - label3=tk.Label(form2, font='italic 10 bold' ,text="Mac Address :") - label3.place(x=10,y=90) - - label3=tk.Label(form2, font='italic 17 bold' ,text="Rondom MAC Address") - label3.place(x=167,y=200) - - label3=tk.Label(form2, font='italic 10 bold' ,text="Interface :") - label3.place(x=10,y=260) - - label11 = tk.Label(form2, font='italic 7', text="**This is the demo version which is still under development and improvement.**") - label11.place(x=55, y=373) - - entry_inter=tk.Entry(form2) - entry_inter.place(x=150,y=50) - - entry_mac=tk.Entry(form2) - entry_mac.place(x=150,y=90) - - entry_inter_rndom=tk.Entry(form2) - entry_inter_rndom.place(x=150,y=260) - - - - def inter(): - intere=str(entry_inter.get()) - mac = str(entry_mac.get()) - - subprocess.call(['ifconfig',intere,'down']) - subprocess.call(['ifconfig', intere, 'hw','ether',mac]) - subprocess.call(['ifconfig', intere, 'up']) - - if entry_inter.get() : - msg=messagebox.showinfo("WARNING",message="Successful") - elif entry_inter.get() : - msg=messagebox.showinfo("WARNING",message="Successful") - else : - msg2 = messagebox.showinfo("WARNING", message="Example : eth_ , tun_ , wlan_") +# --- Helper Functions --- +def validate_mac(mac): + """Validate MAC address format: XX:XX:XX:XX:XX:XX""" + pattern = r'^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}$' + return bool(re.match(pattern, mac)) +def validate_ip(ip): + """Validate IPv4 address format""" + pattern = r'^(\d{1,3}\.){3}\d{1,3}$' + if not re.match(pattern, ip): + return False + parts = ip.split('.') + return all(0 <= int(p) <= 255 for p in parts) - buton4 = tk.Button(form2, font='italic 12 bold', text='CHANGE', fg='white', bg='blue', command=inter) - buton4.place(x=360, y=78) - def inter1(): - intere1=str(entry_inter_rndom.get()) - a=["0f:b1:f3:c4:8f:1e ", "fe:37:c9:fb:b4:cd ", "14:81:b9:03:3b:ba", "29:0b:20:81:80:5e", "84:9c:08:01:ea:6f","72:93:b4:d9:14:9e", - "06:ec:9f:0d:4c:00","a8:93:05:01:63:f7","7b:59:04:57:72:7d","34:97:bd:eb:bd:77","29:53:84:21:52:4b","5c:bb:01:90:6f:a8","7e:93:e0:ba:18:fe","f3:77:4c:80:70:fb","fd:ac:9f:35:6b:47"] - b = random.choice(a) - mac = "84:9c:08:01:ea:6f" +def get_interfaces(): + """List available network interfaces""" + try: + return sorted(os.listdir('/sys/class/net/')) + except Exception: + return ['eth0', 'wlan0', 'lo'] - subprocess.call(['ifconfig',intere1,'down']) - subprocess.call(['ifconfig', intere1, 'hw','ether',b]) - subprocess.call(['ifconfig', intere1, 'up']) - if entry_inter_rndom.get() : - msg=messagebox.showinfo("WARNING",message="Successful") - elif entry_inter_rndom.get(): - msg=messagebox.showinfo("WARNING",message="Successful") - else : - msg1 = messagebox.showinfo("ERROR", message="Please Change Interface") - msg2 = messagebox.showinfo("WARNING", message="Example : eth_ , tun_ , wlan_") +def generate_random_mac(): + """Generate a valid random MAC address (locally administered, unicast)""" + mac = [random.randint(0x00, 0xFF) for _ in range(6)] + mac[0] = (mac[0] & 0xFE) | 0x02 # locally administered, unicast + return ':'.join(f'{b:02x}' for b in mac) +def get_current_mac(interface): + """Get current MAC address of an interface""" + try: + result = subprocess.run( + ['cat', f'/sys/class/net/{interface}/address'], + capture_output=True, text=True + ) + return result.stdout.strip() or "Unknown" + except Exception: + return "Unknown" - buton5 = tk.Button(form2,font='italic 12 bold', text='Rondom Mac Adres', fg='white', bg='blue', command=inter1) - buton5.place(x=360, y=250) +def get_current_ip(interface): + """Get current IP address of an interface""" + try: + result = subprocess.run( + ['ip', 'addr', 'show', interface], + capture_output=True, text=True + ) + match = re.search(r'inet (\S+)', result.stdout) + return match.group(1) if match else "Not assigned" + except Exception: + return "Unknown" - form2.mainloop() -def ipveri(): +# --- Root Permission Check --- - form.destroy() - form3 = tk.Tk() - form3.title("VenomAge") - form3.geometry("600x400") - form3.resizable(True, True) +def check_root(): + if os.geteuid() != 0: + root_check = tk.Tk() + root_check.withdraw() + messagebox.showerror( + "Permission Error", + "This application requires root privileges.\n" + "Please run with: sudo python3 VenomAge.py" + ) + root_check.destroy() + exit(1) - var = messagebox.showinfo("Warning ", "IP Changer Starting") - label1 = tk.Label(form3, font='italic 17 bold', text="IP Changer") - label1.pack() +check_root() - label2 = tk.Label(form3, font='italic 10 bold' ,text="Interface :") - label2.place(x=10, y=50) - label3 = tk.Label(form3, font='italic 10 bold' , text="IP Address :") - label3.place(x=10, y=90) +# --- Main Window --- - label3 = tk.Label(form3, font='italic 10 bold' ,text="Netmask Address:") - label3.place(x=10, y=130) - - label4= tk.Label(form3, fg='red', text="eth0" ) - label4.place(x=150, y=50) - - label11 = tk.Label(form3, font='italic 7',text="**This is the demo version which is still under development and improvement.**") - label11.place(x=65, y=373) - - entry_ip = tk.Entry(form3) - entry_ip.place(x=150, y=90) - - entry_netmas = tk.Entry(form3) - entry_netmas.place(x=150, y=130) - - entry_inter = tk.Entry(form3) - entry_inter.place(x=150, y=50) - - def ipchan(): - inter= str(entry_inter.get()) - ipad = str(entry_ip.get()) - netmas = str(entry_netmas.get()) - - subprocess.call(['ifconfig', inter, ipad , 'netmask' , netmas]) - - - if entry_netmas.get() == "255.255.255.0": - msg = messagebox.showinfo("WARNING", message="Successful") - elif entry_netmas.get() == "255.255.0.0": - msg = messagebox.showinfo("WARNING", message="Successful") - elif entry_netmas.get() == "255.0.0.0": - msg = messagebox.showinfo("WARNING", message="Successful") - elif entry_netmas.get() == "255.255.255.0": - msg = messagebox.showinfo("WARNING", message="Successful") - else: - - msg1 = messagebox.showinfo("ERROR", message="Please enter value in netmask range") - msg2 = messagebox.showinfo("WARNING", message="Example : 255.255.255.0 , 255.255.0.0 , 255.0.0.0") - - - - - - buton5 = tk.Button(form3, font='italic 12 bold', text='Changer', fg='white', bg='blue', command=ipchan) - buton5.place(x=240, y=180) - - form3.mainloop() - -def localobj(): - - form.destroy() - form4 = tk.Tk() - form4.title("VenomAge") - form4.geometry("800x400") - form4.resizable(True, True) - - var = messagebox.showinfo("Warning ", "**This Demo Currently Unavailable") - - label11 = tk.Label(form4, font='italic 13 bold ',fg='red', text="**This is the DEMO version which is still under development and improvement.**") - label11.place(x=5, y=173) - -buton2=tk.Button(form,font='italic 14 bold',text='Ip Address Changer',fg='white',bg='blue',command=ipveri) -buton2.pack(padx=30,pady=40) - -buton=tk.Button(form,font='italic 14 bold',text='Mac Changer',fg='white',bg='blue',command=mac_veri) -buton.pack(padx=10 , pady=40) - -buton3=tk.Button(form,font='italic 14 bold',text='Local Network Scanner',fg='white',bg='blue',command=localobj) -buton3.pack(padx=10,pady=40) +form = tk.Tk() +form.title("VenomAge") +form.geometry("600x400") +form.resizable(True, True) + +messagebox.showinfo("Welcome", "Welcome to VenomAge") + +tk.Label(form, font='italic 17 bold', text="Choose The Action You Want").pack() +tk.Label(form, font='italic 8 bold', text="@Batu Kapicioglu").place(x=465, y=370) +tk.Label(form, font='italic 7 bold', text="Linux").place(x=25, y=373) + + +def open_mac_changer(): + form.withdraw() + win = tk.Toplevel(form) + win.title("VenomAge - MAC Changer") + win.geometry("620x420") + win.resizable(True, True) + win.protocol("WM_DELETE_WINDOW", lambda: (win.destroy(), form.deiconify())) + + tk.Label(win, font='italic 17 bold', text="MAC Address Changer").pack(pady=5) + + # --- Manual MAC Change Section --- + tk.Label(win, font='italic 11 bold', text="--- Manual Change ---").place(x=10, y=48) + + tk.Label(win, font='italic 10 bold', text="Interface:").place(x=10, y=78) + interfaces = get_interfaces() + combo_inter = ttk.Combobox(win, values=interfaces, width=18) + combo_inter.place(x=150, y=78) + + tk.Label(win, font='italic 10 bold', text="New MAC:").place(x=10, y=110) + entry_mac = tk.Entry(win, width=22) + entry_mac.place(x=150, y=110) + + lbl_current_mac = tk.Label(win, font='italic 9', text="Current MAC: -", fg='gray') + lbl_current_mac.place(x=10, y=140) + + def on_inter_select(event=None): + iface = combo_inter.get().strip() + if iface: + lbl_current_mac.config(text=f"Current MAC: {get_current_mac(iface)}") + + combo_inter.bind("<>", on_inter_select) + + def change_mac(): + interface = combo_inter.get().strip() + mac = entry_mac.get().strip() + + if not interface: + messagebox.showwarning("Warning", "Please select or enter an interface (e.g. eth0, wlan0)") + return + if not validate_mac(mac): + messagebox.showerror( + "Error", + "Invalid MAC address format!\n" + "Expected: XX:XX:XX:XX:XX:XX\n" + "Example: 00:1A:2B:3C:4D:5E" + ) + return + if not messagebox.askyesno("Confirm", f"Change MAC of '{interface}' to:\n{mac}?"): + return + + try: + r_down = subprocess.run(['ifconfig', interface, 'down'], capture_output=True, text=True) + r_mac = subprocess.run(['ifconfig', interface, 'hw', 'ether', mac], capture_output=True, text=True) + r_up = subprocess.run(['ifconfig', interface, 'up'], capture_output=True, text=True) + + if r_mac.returncode == 0: + messagebox.showinfo( + "Success", + f"MAC address changed!\nInterface: {interface}\nNew MAC: {mac}" + ) + lbl_current_mac.config(text=f"Current MAC: {get_current_mac(interface)}") + else: + err = r_mac.stderr or r_down.stderr or r_up.stderr + messagebox.showerror("Error", f"Command failed:\n{err}") + except Exception as e: + messagebox.showerror("Error", f"An error occurred:\n{str(e)}") + + tk.Button( + win, font='italic 11 bold', text='Change MAC', + fg='white', bg='blue', command=change_mac + ).place(x=400, y=103) + + # --- Random MAC Section --- + tk.Label(win, font='italic 11 bold', text="--- Random MAC ---").place(x=10, y=220) + + tk.Label(win, font='italic 10 bold', text="Interface:").place(x=10, y=252) + combo_inter_rand = ttk.Combobox(win, values=interfaces, width=18) + combo_inter_rand.place(x=150, y=252) + + lbl_rand_preview = tk.Label(win, font='italic 9', text="Will use: -", fg='gray') + lbl_rand_preview.place(x=10, y=282) + + def change_random_mac(): + interface = combo_inter_rand.get().strip() + if not interface: + messagebox.showwarning("Warning", "Please select or enter an interface (e.g. eth0, wlan0)") + return + + mac = generate_random_mac() + lbl_rand_preview.config(text=f"Will use: {mac}") + + if not messagebox.askyesno("Confirm", f"Change MAC of '{interface}' to random:\n{mac}?"): + return + + try: + r_down = subprocess.run(['ifconfig', interface, 'down'], capture_output=True, text=True) + r_mac = subprocess.run(['ifconfig', interface, 'hw', 'ether', mac], capture_output=True, text=True) + r_up = subprocess.run(['ifconfig', interface, 'up'], capture_output=True, text=True) + + if r_mac.returncode == 0: + messagebox.showinfo( + "Success", + f"Random MAC applied!\nInterface: {interface}\nNew MAC: {mac}" + ) + else: + err = r_mac.stderr or r_down.stderr or r_up.stderr + messagebox.showerror("Error", f"Command failed:\n{err}") + except Exception as e: + messagebox.showerror("Error", f"An error occurred:\n{str(e)}") + + tk.Button( + win, font='italic 11 bold', text='Random MAC', + fg='white', bg='blue', command=change_random_mac + ).place(x=400, y=245) + + tk.Label( + win, font='italic 7', + text="** This is the demo version which is still under development and improvement. **" + ).place(x=55, y=395) + + +def open_ip_changer(): + form.withdraw() + win = tk.Toplevel(form) + win.title("VenomAge - IP Changer") + win.geometry("600x400") + win.resizable(True, True) + win.protocol("WM_DELETE_WINDOW", lambda: (win.destroy(), form.deiconify())) + + tk.Label(win, font='italic 17 bold', text="IP Changer").pack(pady=5) + + VALID_NETMASKS = ["255.255.255.0", "255.255.0.0", "255.0.0.0"] + interfaces = get_interfaces() + + tk.Label(win, font='italic 10 bold', text="Interface:").place(x=10, y=55) + combo_inter = ttk.Combobox(win, values=interfaces, width=18) + combo_inter.place(x=150, y=55) + + tk.Label(win, font='italic 10 bold', text="IP Address:").place(x=10, y=90) + entry_ip = tk.Entry(win, width=22) + entry_ip.place(x=150, y=90) + + tk.Label(win, font='italic 10 bold', text="Netmask:").place(x=10, y=125) + combo_netmask = ttk.Combobox(win, values=VALID_NETMASKS, width=18) + combo_netmask.place(x=150, y=125) + + lbl_current_ip = tk.Label(win, font='italic 9', text="Current IP: -", fg='gray') + lbl_current_ip.place(x=10, y=160) + + def on_inter_select(event=None): + iface = combo_inter.get().strip() + if iface: + lbl_current_ip.config(text=f"Current IP: {get_current_ip(iface)}") + + combo_inter.bind("<>", on_inter_select) + + def change_ip(): + interface = combo_inter.get().strip() + ip = entry_ip.get().strip() + netmask = combo_netmask.get().strip() + + if not interface: + messagebox.showwarning("Warning", "Please select or enter an interface") + return + if not validate_ip(ip): + messagebox.showerror( + "Error", + "Invalid IP address format!\nExample: 192.168.1.100" + ) + return + if netmask not in VALID_NETMASKS: + messagebox.showerror( + "Error", + "Invalid netmask!\nValid values:\n" + "\n".join(VALID_NETMASKS) + ) + return + if not messagebox.askyesno("Confirm", f"Change IP of '{interface}' to:\n{ip} / {netmask}?"): + return + + try: + result = subprocess.run( + ['ifconfig', interface, ip, 'netmask', netmask], + capture_output=True, text=True + ) + if result.returncode == 0: + messagebox.showinfo( + "Success", + f"IP changed!\nInterface: {interface}\nNew IP: {ip}\nNetmask: {netmask}" + ) + on_inter_select() + else: + messagebox.showerror("Error", f"Command failed:\n{result.stderr}") + except Exception as e: + messagebox.showerror("Error", f"An error occurred:\n{str(e)}") + + tk.Button( + win, font='italic 12 bold', text='Change IP', + fg='white', bg='blue', command=change_ip + ).place(x=240, y=200) + + tk.Label( + win, font='italic 7', + text="** This is the demo version which is still under development and improvement. **" + ).place(x=65, y=373) + + +def open_network_scanner(): + form.withdraw() + win = tk.Toplevel(form) + win.title("VenomAge - Local Network Scanner") + win.geometry("800x400") + win.resizable(True, True) + win.protocol("WM_DELETE_WINDOW", lambda: (win.destroy(), form.deiconify())) + + tk.Label( + win, font='italic 13 bold', fg='red', + text="** This is the DEMO version which is still under development and improvement. **" + ).place(x=5, y=173) + + +# --- Main Buttons --- + +tk.Button( + form, font='italic 14 bold', text='IP Address Changer', + fg='white', bg='blue', command=open_ip_changer +).pack(padx=30, pady=40) + +tk.Button( + form, font='italic 14 bold', text='MAC Changer', + fg='white', bg='blue', command=open_mac_changer +).pack(padx=10, pady=40) + +tk.Button( + form, font='italic 14 bold', text='Local Network Scanner', + fg='white', bg='blue', command=open_network_scanner +).pack(padx=10, pady=40) form.mainloop()