ALW1EZ/PANO
GitHub: ALW1EZ/PANO
一个基于 Python 和 Qt 的桌面化 OSINT 调查平台,通过图形与时间线融合 AI 辅助发现数据中的隐藏关联。
Stars: 422 | Forks: 54
# PANO - 平台分析与网络运营
## 📄 许可证
本项目根据知识共享署名-非商业性使用(CC BY-NC)许可证授权。
**你可以自由:**
- ✅ 分享:复制和重新分发材料
- ✅ 改编: remix、转换并基于材料构建
**在以下条款下:**
- ℹ️ 署名:必须提供适当署名
- 🚫 非商业性:不得用于商业目的
- 🔓 无附加限制
## 🙏 感谢
特别感谢所有库作者和贡献者使本项目成为可能。
## 👨💻 作者
由 ALW1EZ 创建,融入 AI ❤️

[](https://creativecommons.org/licenses/by-nc/4.0/)
[](https://www.python.org/downloads/)
[](https://wiki.qt.io/Qt_for_Python)
[](https://github.com/ALW1EZ/PANO/)
**PANO** 是一个功能强大的 OSINT 调查平台,结合了图形可视化、时间线分析和 AI 工具,帮助你发现数据中的隐藏联系和模式。
[开始使用](#getting-started) • [功能特性](#features) • [文档](#development-guide) • [贡献指南](#contributing)
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
## 🚀 开始使用
1. 克隆仓库:
git clone https://github.com/ALW1EZ/PANO.git
cd PANO
2. 运行应用程序:
- Linux:`./start_pano.sh`
- Windows:`start_pano.bat`
启动脚本将自动执行以下操作:
- 检查更新
- 设置 Python 环境
- 安装依赖项
- 启动 PANO
要使用 Email Lookup 转换
你需要先登录 GHunt。
通过启动脚本启动 PANO 后:
1. 手动选择虚拟环境
- Linux:`source venv/bin/activate`
- Windows:`call venv\Scripts\activate`
2. 查看登录指南 [这里](https://github.com/mxrch/GHunt/?tab=readme-ov-file#login)
## 💡 快速入门指南
1. **创建调查**:新建调查或加载现有调查
2. **添加实体**:将实体从侧边栏拖放到图形中
3. **发现联系**:使用转换自动查找关系
4. **分析**:使用时间线和地图视图理解模式
5. **保存**:导出调查以便后续使用
## 🔍 功能特性
### 🕸️ 核心功能
- **交互式图形可视化**
- 拖放实体创建
- 多种布局算法(圆形、层次、径向、力导向)
- 动态关系映射
- 视觉节点和边样式设置
- **时间线分析**
- 时间顺序事件可视化
- 交互式时间线导航
- 事件过滤和分组
- 时间关系分析
- **地图集成**
- 地理数据可视化
- 基于位置的分析
- 交互式地图功能
- 坐标绘制和跟踪
### 🎯 实体管理
- **支持的实体类型**
- 📧 电子邮件地址
- 👤 用户名
- 🌐 网站
- 🖼️ 图像
- 📍 位置
- ⏰ 事件
- 📝 文本内容
- **自定义实体类型**
### 🔄 转换系统
- **电子邮件分析**
- Google 账户调查
- 日历事件提取
- 位置历史分析
- 关联服务发现
- **用户名分析**
- 跨平台用户名搜索
- 社交媒体资料发现
- 平台关联
- 网络存在分析
- **图像分析**
- 反向图像搜索
- 视觉内容分析
- 元数据提取
- 相关图像发现
### 🤖 AI 集成
- **PANAI**
- 自然语言调查助手
- 自动实体提取和关系映射
- 模式识别和异常检测
- 多语言支持
- 上下文感知建议
- 时间线和图形分析
## 🧩 核心组件
### 📦 实体
实体是 PANO 的基本构建块。它们代表可以连接和分析的信息片段:
- **内置类型**
- 📧 电子邮件:带服务检测的电子邮件地址
- 👤 用户名:社交媒体和平台用户名
- 🌐 网站:带元数据的网页
- 🖼️ 图像:带 EXIF 和分析的图像
- 📍 位置:地理坐标和地址
- ⏰ 事件:基于时间的事件
- 📝 文本:通用文本内容
- **属性系统**
- 类型安全的属性验证
- 自动属性获取
- 动态属性更新
- 自定义属性类型
- 元数据支持
### ⚡ 转换
转换是处理实体以发现新信息和关系的自动化操作:
- **操作类型**
- 🔍 发现:从现有实体中查找新实体
- 🔗 关联:连接相关实体
- 📊 分析:从实体数据中提取洞察
- 🌐 OSINT:收集开源情报
- 🔄 丰富:为现有实体添加数据
- **特性**
- 异步操作支持
- 进度跟踪
- 错误处理
- 速率限制
- 结果验证
### 🛠️ 辅助工具
辅助工具是为特定调查任务提供专用 UI 的工具:
- **可用辅助工具**
- 🔍 交叉询问:分析和陈述证词
- 👤 肖像创建:生成面部合成图
- 📸 媒体分析器:高级图像处理和分析
- 🔍 基础搜索:搜索附近兴趣点
- 🔄 翻译器:翻译文本
- **辅助工具特性**
- 自定义 Qt 界面
- 实时更新
- 图形集成
- 数据可视化
- 导出能力
## 📖 开发指南
点击展开开发文档
### 系统要求 - 操作系统:Windows 或 Linux - Python 3.11+ - PySide6 用于 GUI - 联网以使用在线功能 ### 自定义实体 实体是 PANO 的核心数据结构。每个实体代表具有特定属性和行为的信息片段。要创建自定义实体: 1. 在 `entities` 文件夹中创建新文件(例如:`entities/phone_number.py`) 2. 实现你的实体类: ``` 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"]) ``` ### 自定义转换 转换是处理实体并生成新洞察或关系的操作。要创建自定义转换: 1. 在 `transforms` 文件夹中创建新文件(例如:`transforms/phone_lookup.py`) 2. 实现你的转换类: ``` 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 提供额外调查能力的工具。要创建自定义辅助工具: 1. 在 `helpers` 文件夹中创建新文件(例如:`helpers/data_analyzer.py`) 2. 实现你的辅助工具类: ``` 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) ```标签:AI辅助, BSD, ESC4, OSINT, PySide6, Python, Python 3.11, SEO, 二进制发布, 人工智能, 图可视化, 图形可视化, 威胁情报, 平台, 开发者工具, 开源工具, 情报收集, 数据关联, 数据关联分析, 数据挖掘, 无后门, 模式识别, 漏洞研究, 用户模式Hook绕过, 系统分析, 网络分析, 调查平台, 逆向工具, 链接发现, 黄金证书