Skip to content

Instantly share code, notes, and snippets.

@INeddHelp
Last active June 19, 2024 18:52
Show Gist options
  • Save INeddHelp/645f3a6200ebffdd33ddd364f177b085 to your computer and use it in GitHub Desktop.
Save INeddHelp/645f3a6200ebffdd33ddd364f177b085 to your computer and use it in GitHub Desktop.
Scanshield Executable (Python version)
#!/usr/local/bin/python3.12
import os
import psutil
import subprocess
import tkinter as tk
from tkinter import messagebox
import sys
class Scanshield:
def __init__(self, root=None):
if root:
self.root = root
self.root.title("ScanShield")
self.root.config(padx=50, pady=50)
self.password_label = tk.Label(root, text="Please enter the admin password to scan the PC:")
self.password_label.pack()
self.password_entry = tk.Entry(root, show="*", width=30)
self.password_entry.pack()
self.password_entry.focus()
self.password_entry.bind("<Return>", lambda event: self.get_password())
self.execute_button = tk.Button(root, text="Execute", command=self.get_password)
self.execute_button.pack()
self.center_window()
def center_window(self):
self.root.update_idletasks()
width = self.root.winfo_width()
height = self.root.winfo_height()
screen_width = self.root.winfo_screenwidth()
screen_height = self.root.winfo_screenheight()
x = (screen_width - width) // 2
y = (screen_height - height) // 2
self.root.geometry(f'{width}x{height}+{x}+{y}')
def save_process_info(self):
processes = psutil.process_iter(attrs=[
'pid', 'name', 'cmdline', 'num_threads', 'username', 'ppid', 'exe', 'cwd', 'terminal',
'cpu_times', 'cpu_percent', 'memory_info', 'memory_percent', 'num_fds', 'create_time',
'status', 'nice'
])
log_file_path = os.path.join(os.path.expanduser("~/Desktop"), 'processes.log')
with open(log_file_path, 'w') as f:
for process in processes:
try:
process_info = process.info
pid = process_info['pid']
name = process_info['name']
status = process_info['status']
cmd = process_info['cmdline']
exe = process_info['exe']
memory_info = process_info['memory_info']
memory_percent = process_info['memory_percent']
num_threads = process_info['num_threads']
cwd = process_info['cwd']
terminal = process_info['terminal']
cpu_times = process_info['cpu_times']
cpu_percent = process_info['cpu_percent']
num_fds = process_info['num_fds']
create_time = process_info['create_time']
nice = process_info['nice']
p = psutil.Process(pid)
ports = self.get_open_ports(pid)
f.write(f"Process ID: {pid}\n")
f.write(f"Name: {name}\n")
f.write(f"status: {status}\n")
f.write(f"Command: {cmd}\n")
f.write(f"Executable: {exe}\n")
f.write(f"Memory Info: {memory_info}\n")
f.write(f"Memory Percent: {memory_percent}\n")
f.write(f"Number of Threads: {num_threads}\n")
f.write(f"Current Working Directory: {cwd}\n")
f.write(f"Terminal: {terminal}\n")
f.write(f"CPU Times: {cpu_times}\n")
f.write(f"CPU Percent: {cpu_percent}\n")
f.write(f"Number of File Descriptors: {num_fds}\n")
f.write(f"Create Time: {create_time}\n")
f.write(f"Nice Value: {nice}\n")
f.write(f"Port(s) used: {ports}\n")
f.write("---------------------\n")
except psutil.ZombieProcess:
continue
print("Log file saved to", log_file_path)
def get_open_ports(self, pid):
connections = psutil.Process(pid).connections()
ports = "lsof -i -a -p {pid}"
result = os.popen(ports).read()
return result
def execute_with_admin_privileges(self, password):
try:
self.execute_button.config(state="disabled")
command = f'cd ~ | echo {password} | sudo -S /usr/local/bin/scanshield -scan'
process = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
if process.returncode != 0:
if "incorrect password" in process.stderr.lower():
messagebox.showerror("Error", "Incorrect password. Please try again.")
self.password_entry.delete(0, 'end')
self.execute_button.config(state="normal")
else:
print(f"Error: {process.stderr}")
messagebox.showerror("Error", f"Scanning failed: {process.stderr}")
self.password_entry.delete(0, 'end')
self.execute_button.config(state="normal")
else:
print(f"Success: {process.stdout}")
messagebox.showinfo("Success", "Scanning completed successfully.")
file_path = os.path.join(os.path.expanduser("~/Desktop"), 'processes.log')
if os.path.exists(file_path):
subprocess.run(['open', file_path])
sys.exit()
else:
print(f"The file {file_path} does not exist.")
messagebox.showerror("Error", f"The file {file_path} does not exist.")
except Exception as e:
self.execute_button.config(state="disabled")
print(f"Error: {e}")
messagebox.showerror("Error", f"An error occurred: {e}")
self.password_entry.delete(0, 'end')
self.execute_button.config(state="normal")
def get_password(self):
password = self.password_entry.get()
if password:
self.execute_with_admin_privileges(password)
else:
messagebox.showerror("Error", "Password cannot be empty.")
def main():
if len(sys.argv) > 1:
if sys.argv[1] == "-scan":
app = Scanshield()
app.save_process_info()
elif sys.argv[1] == "-gui":
root = tk.Tk()
app = Scanshield(root)
root.mainloop()
else:
print("Invalid argument.")
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment