Last active
June 19, 2024 18:52
-
-
Save INeddHelp/645f3a6200ebffdd33ddd364f177b085 to your computer and use it in GitHub Desktop.
Scanshield Executable (Python version)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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