lebr0nli/GEP

GitHub: lebr0nli/GEP

GEP 是一个 GDB 增强提示符插件,通过集成 fzf 模糊搜索、智能自动补全和 fish 式自动建议等功能,显著提升 GDB 命令行的交互体验。

Stars: 137 | Forks: 12

# GEP (GDB Enhanced Prompt) https://github.com/lebr0nli/GEP/assets/61896187/0832d4e9-001c-44e7-b3aa-a22bf879b895 `GEP` (GDB Enhanced Prompt) 是一个 GDB 插件,它能让你的 GDB 命令提示符更加方便和灵活。 ## 为什么需要这个插件? GDB 原本的提示符使用的是硬编码的内置 GNU readline 库,我们无法轻松地添加自定义函数和快捷键绑定。以前实现这些功能的旧方法是修改 GDB 的 C 源代码并重新编译。 但现在,你可以使用 GEP 在 Python 中编写函数并轻松绑定任意快捷键,无需任何修改! 而且,GEP 已经内置了一些很棒的功能,你可以直接使用它们! ## 功能 - Ctrl+r 使用 [fzf](https://github.com/junegunn/fzf) 进行历史记录反向搜索 - 键在历史记录中进行部分字符串匹配 - TAB 自动补全,支持: - fzf(当安装了 fzf 时) - 浮动窗口(类似于 IPython 的自动补全) - 类似 [fish](https://fishshell.com) 的自动建议( 键接受建议) - 使用 fzf 管理断点: - Alt/Esc/Option+t 启用/禁用断点 - Alt/Esc/Option+x 删除断点 - 可以通过修改 `geprc.py` 来构建自定义快捷键绑定及其回调函数 - 兼容你最喜欢的最新版本 GDB 插件: - [pwndbg/pwndbg](https://github.com/pwndbg/pwndbg) - [hugsy/gef](https://github.com/hugsy/gef) - [bata24/gef](https://github.com/bata24/gef.git) - [cyrus-and/gdb-dashboard](https://github.com/cyrus-and/gdb-dashboard) ## 如何安装? 确保你拥有 GDB 12.1+(为了获得最佳体验,最好是 GDB 14.1+)并且编译时启用了 Python3.10+ 绑定,然后: 1. 安装 git 2. 确保你已安装 [virtualenv](https://packaging.python.org/en/latest/guides/installing-using-pip-and-virtual-environments/#installing-virtualenv) 3. 安装 fzf:[安装指南](https://github.com/junegunn/fzf#installation)(可选,但 GEP 配合 fzf 使用效果更好) 4. 通过以下方式安装此插件: ``` # 如果你愿意,也可以选择其他目录来安装 GEP git clone --depth 1 https://github.com/lebr0nli/GEP.git ~/.local/share/GEP ~/.local/share/GEP/install.sh ``` 5. 尽情享受吧!
对于 portable pwndbg 用户 在你安装了 git、fzf 和 pwndbg 之后,你可以通过以下方式安装 GEP: ``` # 如果你愿意,也可以选择其他目录来安装 GEP git clone --depth 1 https://github.com/lebr0nli/GEP.git ~/.local/share/GEP ~/.local/share/GEP/install.sh --skip-venv ```
## 如何更新 GEP 的版本? 如果你的 `~/.gdbinit` 类似于这样:`source ~/.local/share/GEP/gdbinit-gep.py`,那么你可以通过以下方式更新 GEP: ``` cd ~/.local/share/GEP && git pull && ./install.sh ``` ## 更多配置 你可以修改 `/path/to/GEP/gdbinit-gep` 中的历史记录、自动补全以及其他 GEP 配置。 你还可以通过修改 `/path/to/GEP/geprc.py` 来添加自定义快捷键绑定。 ## 权衡与副作用 由于 GDB 没有提供完善的 Python API 来完全控制和模拟其提示符,因此该插件会有一些副作用。 不过,这些副作用是可以避免的,以下是避免它们的方法: ### `TUI 模式` 不知为何,GEP 会破坏 GDB 中的 TUI 模式,因此建议在使用 GEP 时不要使用 GDB 内置的 TUI(参见 issue #13)。 我个人建议不使用 gdb TUI,而是尝试使用 [pwndbg/pwndbg](https://github.com/pwndbg/pwndbg)、[hugsy/gef](https://github.com/hugsy/gef) 和 [cyrus-and/gdb-dashboard](https://github.com/cyrus-and/gdb-dashboard) 来增强你的调试体验。 ### `gdb.event.before_prompt` GDB Python API 事件:`gdb.event.before_prompt` 可能只会被调用一次。 因此,如果你正在使用监听此事件的 GDB 插件,此插件将引发一些 bug。 为避免这种情况,你可以通过将这些回调函数添加到 `gdb.prompt_hook` 来更改它们,`gdb.prompt_hook` 与 `event.before_prompt` 的效果几乎相同,但 `gdb.prompt_hook` 可以被直接调用,因此该插件仍然可以为你模拟该回调! ### `dont-repeat` 当你的输入为空并直接按 ENTER 时,如果历史记录中的上一条命令不具有 `dont-repeat` 属性,GDB 就会再次执行它。 据我所知,目前没有 GDB API 可以用来检查命令的属性。 所以,我将一些具有该属性的常用命令(针对原生 GDB API 和 GEF)添加到了一个集合中,以避免重复执行它们。 如果你有一些自定义的、具有 `dont-repeat` 属性的函数,也请手动将你的命令添加到该集合中。 ## 卸载 如果安装后你的 `~/.gdbinit` 文件如下所示: ``` source /path/to/GEP/gdbinit-gep.py ``` 那么,你可以通过以下方式卸载该插件: ``` rm -rf /path/to/GEP ``` 并从你的 `~/.gdbinit` 中移除 `source /path/to/GEP/gdbinit-gep.py`。 ## Bug、建议和想法 如果你发现了任何 bug,或者对该插件有任何建议/想法,请随时在 GitHub issue 页面留下你的反馈,或向我发送 pull request! 谢谢!
标签:fzf, GDB插件, Python, SOC Prime, 代码提示, 开发工具, 无后门, 自动补全, 逆向工具