
ग्राफ-आधारित OSINT जांच मंच जिसमें टाइमलाइन विश्लेषण, एंटिटी प्रबंधन और ईमेल, उपयोगकर्ता नाम, छवियों और स्थानों पर छिपे कनेक्शनों को उजागर करने के लिए AI-संचालित रूपांतरण शामिल हैं।

PANO एक शक्तिशाली OSINT जांच मंच है जो ग्राफ विज़ुअलाइज़ेशन, समयरेखा विश्लेषण और AI-संचालित उपकरणों को जोड़ता है ताकि आप अपने डेटा में छिपे कनेक्शन और पैटर्न खोज सकें।
आरंभ करें • विशेषताएं • दस्तावेज़ीकरण • योगदान
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
रिपॉजिटरी क्लोन करें:
git clone https://github.com/ALW1EZ/PANO.git
cd PANO
एप्लिकेशन चलाएं:
./start_pano.shstart_pano.batस्टार्टअप स्क्रिप्ट स्वचालित रूप से:
Email Lookup ट्रांसफॉर्म का उपयोग करने के लिए आपको पहले GHunt से लॉगिन करना होगा। स्टार्टर स्क्रिप्ट के माध्यम से pano शुरू करने के बाद;
source venv/bin/activatecall venv\Scripts\activateइंटरएक्टिव ग्राफ विज़ुअलाइज़ेशन
समयरेखा विश्लेषण
मानचित्र एकीकरण
ईमेल विश्लेषण
उपयोगकर्ता नाम विश्लेषण
छवि विश्लेषण
इकाइयां PANO की मूलभूत संरचना हैं। वे सूचना के अलग-अलग टुकड़ों का प्रतिनिधित्व करती हैं जिन्हें जोड़ा और विश्लेषित किया जा सकता है:
अंतर्निहित प्रकार
गुण प्रणाली
ट्रांसफॉर्म स्वचालित संचालन हैं जो नई जानकारी और संबंध खोजने के लिए इकाइयों को संसाधित करते हैं:
संचालन प्रकार
सुविधाएं
सहायक विशेष उपकरण हैं जिनमें विशिष्ट जांच कार्यों के लिए समर्पित UI होते हैं:
उपलब्ध सहायक
सहायक सुविधाएं
हम योगदान का स्वागत करते हैं! PANO में योगदान करने के लिए:
नोट: हम विकास के लिए एक ही
mainब्रांच का उपयोग करते हैं। सभी पुल रिक्वेस्ट सीधेmainपर की जानी चाहिए।
इकाइयां PANO में मुख्य डेटा संरचनाएं हैं। प्रत्येक इकाई विशिष्ट गुणों और व्यवहारों के साथ सूचना का एक टुकड़ा दर्शाती है। कस्टम इकाई बनाने के लिए:
entities फ़ोल्डर में एक नई फ़ाइल बनाएं (जैसे, 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"])
यह प्रोजेक्ट क्रिएटिव कॉमन्स एट्रीब्यूशन-नॉनकमर्शियल (CC BY-NC) लाइसेंस के अंतर्गत लाइसेंस प्राप्त है।
आप स्वतंत्र हैं:
इन शर्तों के तहत:
सभी लाइब्रेरी लेखकों और योगदानकर्ताओं को विशेष धन्यवाद जिन्होंने इस प्रोजेक्ट को संभव बनाया।
ALW1EZ द्वारा AI ❤️ के साथ बनाया गया
ट्रांसफॉर्म ऑपरेशन हैं जो इकाइयों को संसाधित करते हैं और नई अंतर्दृष्टि या संबंध उत्पन्न करते हैं। कस्टम ट्रांसफॉर्म बनाने के लिए:
transforms फ़ोल्डर में एक नई फ़ाइल बनाएं (जैसे, 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)
सहायक विशेष उपकरण हैं जो समर्पित UI इंटरफेस के माध्यम से अतिरिक्त जांच क्षमताएं प्रदान करते हैं। कस्टम सहायक बनाने के लिए:
helpers फ़ोल्डर में एक नई फ़ाइल बनाएं (जैसे, 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)