mahmoudimus/ida-taskr

GitHub: mahmoudimus/ida-taskr

一个纯 Python 编写的 IDA Pro 并行计算库,通过多进程和异步机制将计算密集型任务卸载到后台执行,避免 IDA 界面冻结。

Stars: 30 | Forks: 4

# ida-taskr ![CI Status](https://static.pigsec.cn/wp-content/uploads/repos/cas/9c/9ca7fbe02b2e484deb58751562e0fc81c40b6fb3048f6912a08f62212beabb0b.svg) ## 概述 IDA Taskr 是一个纯 Python 库,用于 IDA Pro 并行计算。它允许你利用 Qt(内置于 IDA!)的强大功能和 Python 的 multiprocessing,将计算密集型任务卸载到 worker 进程中,而不会冻结 IDA Pro 的 UI。 **主要特性:** - 🚀 简单的装饰器 API - 只需添加 `@cpu_task` 即可在后台运行 - 🔄 基于进程的并行机制,实现真正的多核执行 - 📦 支持大型二进制数据的共享内存 - 🎯 集成 Qt 信号,用于进度回调 - ⚡ 兼容 IDA Pro 9.1 (PyQt5) 和 9.2+ (PySide6) ## 安装 **选项 1:单文件(无需安装)** 下载 [`ida_taskr_amalgamated.py`](https://github.com/mahmoudimus/ida-taskr/releases/latest) 并放入 IDA 的 plugins 文件夹中。就这样 - 一个文件,零依赖! **选项 2:pip install** ``` pip install ida-taskr # 或者从支持 Qt 的 source 构建 pip install -e .[pyqt5] # For IDA Pro 9.1 pip install -e .[pyside6] # For IDA Pro 9.2+ ``` **选项 3:IDA Plugin Manager (HCLI)** 安装一次 [HCLI](https://hcli.docs.hex-rays.com/),然后搜索并 安装 Taskr: ``` hcli plugin search ida-taskr hcli plugin install ida-taskr ``` HCLI 会将插件安装到 `$IDAUSR/plugins/ida-taskr` 下,并且首先 将匹配的 `ida-taskr` 包安装到 IDA 的 Python 环境中。IDA 会 提供 Qt 绑定,因此不会单独安装 PyQt 或 PySide 包。在 命令执行完成后重启 IDA。 对于嵌入或非 HCLI 安装,请使用 IDA 使用的 Python 解释器安装该包: ``` python -m pip install ida-taskr ``` ## 快速开始 ### 最简单的方式:`@cpu_task` 添加一个装饰器,你的函数就会在后台运行: ``` from ida_taskr import cpu_task @cpu_task def analyze_binary(data): """This runs in a background thread - UI stays responsive!""" result = [] for byte in data: result.append(process_byte(byte)) return result # Usage - 立即返回! future = analyze_binary(binary_data) # 在它运行时执行其他工作... # 在需要时获取 result result = future.result() ``` 就这样。一行代码。你的函数现在运行时不会阻塞 IDA。 ### 带回调 在你的任务完成时收到通知: ``` from ida_taskr import cpu_task @cpu_task(on_complete=lambda r: print(f"Done! Found {len(r)} patterns")) def find_patterns(data): return scan_for_patterns(data) # Fire and forget - callback 处理 result find_patterns(binary_data) ``` ### 并行处理 在多个 worker 线程中处理多项: ``` from ida_taskr import parallel @parallel(max_workers=8) def analyze_function(func_ea): """Analyze a single function.""" return get_function_signature(func_ea) # 并行处理 100 个函数 function_addresses = list(idautils.Functions()) futures = [analyze_function(addr) for addr in function_addresses] results = [f.result() for f in futures] ``` ### 使用共享内存处理大型数据 对于大型二进制 blob(兆字节),使用共享内存以避免复制: ``` from ida_taskr import shared_memory_task @shared_memory_task(num_chunks=8) def find_signatures(chunk_data, chunk_id, total_chunks): """ Process one chunk of the binary. chunk_data: memoryview of this chunk (zero-copy!) chunk_id: which chunk this is (0-7) total_chunks: total number of chunks (8) """ signatures = [] for i in range(len(chunk_data) - 16): if is_interesting_pattern(chunk_data[i:i+16]): signatures.append(bytes(chunk_data[i:i+16])) return signatures # ida-taskr 处理所有 shared memory 的复杂性! binary_data = ida_bytes.get_bytes(start_ea, size) # e.g., 8MB all_signatures = find_signatures(binary_data) # Returns list of 8 results ``` ## 装饰器参考 | 装饰器 | 用例 | 示例 | |-----------|----------|---------| | `@cpu_task` | CPU 密集型工作 | 模式扫描,签名生成 | | `@io_task` | I/O 密集型工作 | 网络请求,文件操作 | | `@parallel(n)` | 多个并行任务 | 批量函数分析 | | `@background_task` | 带回调的完全控制 | 进度报告 | | `@shared_memory_task` | 大型数据处理 | 多 MB 的二进制分析 | ### `@background_task` - 完全控制 ``` from ida_taskr import background_task @background_task( max_workers=4, on_complete=lambda r: print(f"Result: {r}"), on_error=lambda e: print(f"Error: {e}"), on_progress=lambda p, m: print(f"[{p}%] {m}"), executor_type='process' # 'thread' or 'process' ) def heavy_analysis(data, progress_callback=None): for i, chunk in enumerate(chunks(data, 100)): process(chunk) if progress_callback: progress_callback(i * 10, f"Processed chunk {i}") return "done" ``` ## 高级用法 ### 直接访问 Executor 要进行更多控制,请直接使用 executor: ``` from ida_taskr import ProcessPoolExecutor, ThreadExecutor # 基于 Process(真正的 parallelism,绕过 GIL) with ProcessPoolExecutor(max_workers=4) as executor: futures = [executor.submit(cpu_task, arg) for arg in args] results = [f.result() for f in futures] # 基于 Thread(适用于释放 GIL 的 IDA SDK 调用) with ThreadExecutor(max_workers=8) as executor: futures = [executor.submit(analyze_func, ea) for ea in function_list] results = [f.result() for f in futures] ``` ### Worker 脚本(双向 IPC) 适用于需要持久化 worker 和双向通信的复杂场景。 在以下情况使用: - 在任务之间保持活动状态的长期运行 worker 进程 - IDA 和 worker 之间的自定义消息协议 - 在工作进展时将结果流式传输回 IDA - 跨多个命令持久化的 worker 状态 ``` from ida_taskr import TaskRunner runner = TaskRunner( worker_script="path/to/worker.py", worker_args=["arg1", "arg2"] ) @runner.on('worker_results') def handle_results(results): print(f"Results: {results}") @runner.on('worker_message') def handle_progress(msg): print(f"Progress: {msg}") runner.start() runner.send_command({"command": "process", "data": [1, 2, 3]}) # Worker 保持存活,可以发送更多 commands... runner.send_command({"command": "analyze", "target": 0x401000}) runner.stop() ``` 请参阅 [examples/](examples/) 获取更详细的示例,包括: - [极简示例](examples/ultra_minimal.py) - 最小可行代码 - [共享内存模式](examples/shared_memory_parallel_example.py) - 大型数据处理 - [签名生成](examples/signature_generation_example.py) - 真实的 IDA 用例 - [QtAsyncio 集成](examples/qtasyncio_event_loop.py) - Async/await 支持 ## 测试 ``` # 运行所有 unit tests ./run_tests.sh # 运行 Qt integration tests pytest tests/integration/test_integration_qt_core.py -v # 运行以获取 coverage pytest tests/ --cov=src/ida_taskr --cov-report=html ``` **支持的配置:** - ✅ Python 3.11, 3.12, 3.13 - ✅ PyQt5 (IDA Pro 9.1) - ✅ PySide6 (IDA Pro 9.2+) ## 文档 - [QtAsyncio 集成](docs/QTASYNCIO.md) - Async/await 和事件循环细节 - [IDA 测试指南](docs/IDA_TESTING.md) - 在 IDA Pro 中运行测试 - [示例 README](examples/README.md) - 全面的示例指南 ## 许可证 📜 MIT 许可证 - 详见 [LICENSE](LICENSE)。 ## 联系方式 📧 有问题或疑问?在 GitHub 上提 issue,或者联系 [@mahmoudimus](https://github.com/mahmoudimus)。
标签:IDA Pro插件, PyQt, Python, 云资产清单, 并行计算, 异步编程, 无后门, 计算机取证, 逆向工具, 逆向工程