Voltron是一个可扩展的调试器界面配置工具,以Python写成. 它的目标是增强调试器(包括LLDB, GDB, VDB and WinDbg)的用户体验,方式是允许自由组合各种工具视图,这些视图从宿主调试器处获取数据。你可以跟搭积木一样随便组合这些终端界面的视图来构建切合自己需要的调试界面。
Voltron并不试图讨好所有人。与其说它会成为你常用的调试器命令行的完整替代品,不如说它在试图以补充的方式让调试器命令行界面更易用。你可以只是简单的在调试器的命令行旁边加个寄存器视图,也可以把它折腾得跟OllyDbg差不多。
下面是内建的视图类型:
- 寄存器
- 反汇编
- 栈
- 内存
- 断点
- Backtrace
看看作者本人的设置:
任何调试指令都可以被分割进一个视窗,并用一个指定的Pygments lexer高亮:
更多截图见 这儿.
voltron
支持 LLDB, GDB, VDB and WinDbg/CDB (通过 PyKD) ,可以跑在macOS, Linux和Windows上.
WinDbg支持刚刚加入, 若发现任何问题请开个issue.
下面是支持的架构:
| | lldb | gdb | vdb | windbg |
|---------|------|-----|-----|--------|
| x86 | ✓ | ✓ | ✓ | ✓ |
| x86_64 | ✓ | ✓ | ✓ | ✓ |
| arm | ✓ | ✓ | ✓ | ✗ |
| arm64 | ✓ | ✗ | ✗ | ✗ |
| powerpc | ✗ | ✓ | ✗ | ✗ |
用下面的脚本下载安装:
$ git clone https://github.com/snare/voltron
$ cd voltron
$ ./install.sh
如果你想把这个python包装到当前用户的 site-packages
目录, 就加个-u
参数:
$ ./install.sh -u
如果你在windows上没有shell装不上, 或者喜欢手动安装, 来看这个 手动安装文档.
-
如果你的调试器支持初始化脚本(lldb是
.lldbinit
,gdb是.gdbinit
), 把它设置成在里面执行entry.py
脚本, 来保证每次启动载入Vultron。 完整的路径在voltron
包里。 举个例子, 在macOS里它可能是*/Library/Python/2.7/site-packages/voltron/entry.py*。install.sh
脚本执行时如果在当前路径里探测到了GDB或者LLDB会自动把它加进去。LLDB:
command script import /path/to/voltron/entry.py
GDB:
source /path/to/voltron/entry.py
-
如果需要的话,手动启动你的调试器,然后初始化Voltron。
比较新的LLDB版本里不需要手动初始化Voltron:
$ lldb target_binary
老点的版本里你就得在载入调试对象后手动调用
voltron init
了:$ lldb target_binary (lldb) voltron init
GDB:
$ gdb target_binary
VDB:
$ ./vdbbin target_binary > script /path/to/voltron/entry.py
WinDbg/CDB仅通过Bash On Windows支持. 作者已通过 Git Bash 和 ConEmu进行了测试. PyKD可以在启动调试器时一并启动Voltron:
$ cdb -c '.load C:\path\to\pykd.pyd ; !py --global C:\path\to\voltron\entry.py' target_binary
-
在另一个终端(我用iTerm panes)里启动任一UI视图. 在LLDB, WinDbg和GDB这几个调试器下这几个视图会立刻更新. 在VDB下它们需要等到下个更新点 (跑到断点, 走完一步, 等等)才会更新:
$ voltron view register $ voltron view stack $ voltron view disasm $ voltron view backtrace
-
设个断点,开动.
(*db) b main (*db) run
-
当断点被触发时, 视图会被更新到寄存器/堆栈/内存/等等当前的状态。 调试器命令行里的每个指令都会利用调试器的「暂停挂钩」更新视图。所以每次你step,或者触发断点,视图都会更新。
看看github上的 wiki.
Q. 为什么我载入Voltron时碰到一个ImportError
?
A. 你机器上可能不只装了一个版本的python,而且你把Voltron装到错误版本的python上了. 看看下面这个细节更多的 安装指南.
Q. GEF? PEDA? PwnDbg? fG's gdbinit?
A. 这些都是超牛的GDB扩展。它们的主要目的是给挖洞提供更多针对性的命令,但是又都提供了各自独立的上下文来显示寄存器啊,栈啊,代码啊等等,跟Voltron一样。这些工具都在每次调试器暂停时打印各自的上下文。Voltron则另辟蹊径,在调试器里塞了个RPC服务器,而让显示数据的视图可以容纳在其他终端(甚至浏览器,乃至synchronising with Binary Ninja中。这样用户就有机会给他们的调试器构建一个更干净的多窗口界面。Volkan不需要这些工具就可以工作的很好,但你也可以改改这些工具,把它们本来在各自上下文里显示的内容钩到另外的Voltron视图里,就可以鱼与熊掌得兼了。
Q. 为什么我载入Voltron时碰到一个巨长的python backtrace,里面有error: [Errno 48] Address already in use
?(这个是译者加的,Surge用户特供。。。)
A.
因为Voltron默认的配置使用5555端口进行RPC通讯,这个端口被Surge占了……从Voltron源码里把config/default.cfg
拷贝为~/.voltron/config
(不存在请自行创建),然后找个文本编辑器改掉即可。
来github上的 issue tracker 了解了解,有问题就提问.
要是你还在载入Voltron时碰见ImportError
问题, 请瞅瞅是否遵循了你用的平台的 安装指南.
在较旧的LLDB版本下, voltron init
命令只能在载入调试目标后手动执行,因为没有目标Voltron不能开始挂钩。Voltron会自动尝试注册其事件处理代码,如果voltron init
是必需的会加以提示。
关于WinDbg/CDB支持的更多信息请看 这儿.
作者的主要工作平台是macOS和最新的LLDB。我们会尽最大努力解决其他架构和平台上的问题,但是LLDB/macOS/x64到目前为止是测试最全的。希望Volkan别给你造成麻烦——但这事还是得看人品。
看看授权文件.
如果你在用Voltron——并且不讨厌——参加会议碰见的时候可以给我买杯啤酒。这个协议同样适用于其他的贡献者——richo的贡献可值好几杯呢。
感谢我之前的雇主Assurance and Azimuth Security给了我在这个项目上工作的时间。
向richo致谢,为了他给Voltron的所有贡献。
fG!的gdbinit脚本是这个项目一开始的灵感。
感谢Willi实现VDB支持.
Voltron现在使用Capstone作为反汇编器,以及调试器主机端内部的反汇编机制。这是一个强大的开源跨平台反汇编器,下一代逆向工程和调试工具将在其基础上诞生。看看吧。
感谢grazfather当下和未来的贡献.