
Graph-basierte OSINT-Untersuchungsplattform mit Zeitachsenanalyse, Entitätsverwaltung und KI-gestützten Transformationen, um versteckte Verbindungen zwischen E-Mails, Benutzernamen, Bildern und Standorten aufzudecken.

PANO ist eine leistungsstarke OSINT-Untersuchungsplattform, die Graphenvisualisierung, Zeitachsenanalyse und KI-gestützte Werkzeuge kombiniert, um Ihnen zu helfen, versteckte Verbindungen und Muster in Ihren Daten aufzudecken.
Erste Schritte • Funktionen • Dokumentation • Mitwirken
https://github.com/user-attachments/assets/6b95e97a-ffdd-4056-b12b-f268d8e5d565
https://github.com/user-attachments/assets/af0c0f65-7b79-417c-a678-a789d42a6003
https://github.com/user-attachments/assets/568b4c28-be78-4559-a607-899fca2f9613
https://github.com/user-attachments/assets/6aa191eb-09de-41d5-b96f-4a2e32d6a0c2
https://github.com/user-attachments/assets/96377b80-e137-4eb4-9387-a0db4e49c2c1
https://github.com/user-attachments/assets/4228bda0-6c13-4ea9-bc07-d87abe367e10
Klonen Sie das Repository:
git clone https://github.com/ALW1EZ/PANO.git
cd PANO
Starten Sie die Anwendung:
./start_pano.shstart_pano.batDas Startskript wird automatisch:
Um die E-Mail-Suche-Transformation zu nutzen, müssen Sie sich zuerst bei GHunt anmelden. Nachdem Sie PANO über die Startskripte gestartet haben:
source venv/bin/activatecall venv\Scripts\activateInteraktive Graphenvisualisierung
Zeitachsenanalyse
Kartenintegration
E-Mail-Analyse
Benutzernamenanalyse
Bildanalyse
Entitäten sind die grundlegenden Bausteine von PANO. Sie repräsentieren einzelne Informationsteile, die verbunden und analysiert werden können:
Eingebaute Typen
Eigenschaftssystem
Transformationen sind automatisierte Operationen, die Entitäten verarbeiten, um neue Informationen und Beziehungen zu entdecken:
Operationstypen
Funktionen
Helfer sind spezialisierte Werkzeuge mit eigenen Benutzeroberflächen für bestimmte Untersuchungsaufgaben:
Verfügbare Helfer
Helfer-Funktionen
Wir begrüßen Beiträge! So können Sie zu PANO beitragen:
Hinweis: Wir verwenden einen einzigen
main-Branch für die Entwicklung. Alle Pull Requests sollten direkt anmaingerichtet werden.
Entitäten sind die zentralen Datenstrukturen in PANO. Jede Entität repräsentiert eine Information mit spezifischen Eigenschaften und Verhaltensweisen. So erstellen Sie eine benutzerdefinierte Entität:
entities (z. B. entities/phone_number.py)from dataclasses import dataclass
from typing import ClassVar, Dict, Any
from .base import Entity
@dataclass
class PhoneNumber(Entity):
name: ClassVar[str] = "Phone Number"
description: ClassVar[str] = "A phone number entity with country code and validation"
def init_properties(self):
"""Initialize phone number properties"""
self.setup_properties({
"number": str,
"country_code": str,
"carrier": str,
"type": str, # mobile, landline, etc.
"verified": bool
})
def update_label(self):
"""Update the display label"""
self.label = self.format_label(["country_code", "number"])
Dieses Projekt ist unter der Creative Commons Attribution-NonCommercial (CC BY-NC) Lizenz lizenziert.
Sie dürfen:
Unter folgenden Bedingungen:
Besonderer Dank gilt allen Bibliotheksautoren und Mitwirkenden, die dieses Projekt ermöglicht haben.
Erstellt von ALW1EZ mit KI ❤️
Transformationen sind Operationen, die Entitäten verarbeiten und neue Erkenntnisse oder Beziehungen generieren. So erstellen Sie eine benutzerdefinierte Transformation:
transforms (z. B. transforms/phone_lookup.py)from dataclasses import dataclass
from typing import ClassVar, List
from .base import Transform
from entities.base import Entity
from entities.phone_number import PhoneNumber
from entities.location import Location
from ui.managers.status_manager import StatusManager
@dataclass
class PhoneLookup(Transform):
name: ClassVar[str] = "Phone Number Lookup"
description: ClassVar[str] = "Lookup phone number details and location"
input_types: ClassVar[List[str]] = ["PhoneNumber"]
output_types: ClassVar[List[str]] = ["Location"]
async def run(self, entity: PhoneNumber, graph) -> List[Entity]:
if not isinstance(entity, PhoneNumber):
return []
status = StatusManager.get()
operation_id = status.start_loading("Phone Lookup")
try:
# Your phone number lookup logic here
# Example: query an API for phone number details
location = Location(properties={
"country": "Example Country",
"region": "Example Region",
"carrier": "Example Carrier",
"source": "PhoneLookup transform"
})
return [location]
except Exception as e:
status.set_text(f"Error during phone lookup: {str(e)}")
return []
finally:
status.stop_loading(operation_id)
Helfer sind spezialisierte Werkzeuge, die zusätzliche Untersuchungsfähigkeiten durch eine eigene Benutzeroberfläche bereitstellen. So erstellen Sie einen benutzerdefinierten Helfer:
helpers (z. B. helpers/data_analyzer.py)from PySide6.QtWidgets import (
QWidget, QVBoxLayout, QHBoxLayout, QPushButton,
QTextEdit, QLabel, QComboBox
)
from .base import BaseHelper
from qasync import asyncSlot
class DummyHelper(BaseHelper):
"""A dummy helper for testing"""
name = "Dummy Helper"
description = "A dummy helper for testing"
def setup_ui(self):
"""Initialize the helper's user interface"""
# Create input text area
self.input_label = QLabel("Input:")
self.input_text = QTextEdit()
self.input_text.setPlaceholderText("Enter text to process...")
self.input_text.setMinimumHeight(100)
# Create operation selector
operation_layout = QHBoxLayout()
self.operation_label = QLabel("Operation:")
self.operation_combo = QComboBox()
self.operation_combo.addItems(["Uppercase", "Lowercase", "Title Case"])
operation_layout.addWidget(self.operation_label)
operation_layout.addWidget(self.operation_combo)
# Create process button
self.process_btn = QPushButton("Process")
self.process_btn.clicked.connect(self.process_text)
# Create output text area
self.output_label = QLabel("Output:")
self.output_text = QTextEdit()
self.output_text.setReadOnly(True)
self.output_text.setMinimumHeight(100)
# Add widgets to main layout
self.main_layout.addWidget(self.input_label)
self.main_layout.addWidget(self.input_text)
self.main_layout.addLayout(operation_layout)
self.main_layout.addWidget(self.process_btn)
self.main_layout.addWidget(self.output_label)
self.main_layout.addWidget(self.output_text)
# Set dialog size
self.resize(400, 500)
@asyncSlot()
async def process_text(self):
"""Process the input text based on selected operation"""
text = self.input_text.toPlainText()
operation = self.operation_combo.currentText()
if operation == "Uppercase":
result = text.upper()
elif operation == "Lowercase":
result = text.lower()
else: # Title Case
result = text.title()
self.output_text.setPlainText(result)