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. 尽情享受吧!
## 如何更新 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!
谢谢!
对于 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 ```标签:fzf, GDB插件, Python, SOC Prime, 代码提示, 开发工具, 无后门, 自动补全, 逆向工具