一个调用 delve 的接口,加了 TUI 的水项目
- 添加
tracker.go
用于跟踪数据,且monitor
的 size 默认为 4,可以持续运行,直到trackers
中的 key 地址处的值发生变化(也就是内存断点?)。由于是使用的step-in
运行速度会很慢(因为每一个函数都会进入,不像continue
可以直接到断点处),期待改进 - 发现一个问题:当执行
run
之后,由于栈地址发生变化,原先的监控和跟踪不一定能适用(因为保存的是计算之后的地址),加入todo,应该在保存地址的时候顺便保存一份表达式,在执行run
的时候根据表达式再次生成监控数据(但是这样的话,函数内的 监控又会不对,emmm)
- 抽出
Monitors.go
用于监控,且monitor
的 size 默认为 4 - 添加功能:当监控的数据发生变化的时候,自动显示 监视器 界面,并在界面上标红
- 调整了
initCommand
函数的初始化布局,使用内存逃逸。 - 把
GetDataFromAddress
放到api.go
中,因为感觉更像是 api 提供的能力 - 添加监控的时候可以引用寄存器的值和运算,例如
monitor $Rsp+0x20
- 添加
print <address> <size>
命令,用于打印某个地址处的值,以size
的方式
- 添加
monitor <address> <size>
命令,用于监视某个地址处的值,发生变化时,会变红(todo:用协程实时监控,发生变化就提示)
- 拆出
UICommand.go
,仅用于处理命令的函数 - 拆出
UIView.go
,仅用于处理UI视图函数 - Error 用
channel
的方式传递,接收到 error 之后,显示在右下角
- 添加
focus <id>
命令,让用户可以切换视图,当前窗体由红色边框标注,按下enter
或者esc
即返回命令输入窗口,例如在 反汇编窗口可以上下键移动(但不是实时,是缓存数据,这里有待改进)
- 更改 focus 提供两种方法:
- 重新创建
ui.grid
对象 - 使用反射更改 item 的 focus 值
- 重新创建
- 将 ViewInfo.go 拆出
- 改变输入命令后的
dealWithEnter
函数对命令的查找逻辑,从switch
变更到map[string]*Command
,利用回调函数执行。并将所有的switch
单独拆成函数 - 命令提示字典从 map 中自动获取
- 执行指令出现 error 时,显示在右下角的窗体中,例如输入
clear 4
但是没有 ID 为 4 的断点时:
- 添加 help 信息,执行
help <command>
可以查看对应命令的用法,例如执行 help b
- 将 Data.go 整合至 UI.go 里,UI.go 里将 view 与 data 绑定,为了到时候更换视图方便,比如说现在放内存的窗口,想用来监视变量。
- 添加历史命令界面
- 添加断点界面
- 标注指令所在的函数的名称,无法获取到的不标注,以黄色注释标注
- 在执行命令之后,寄存器的值如果发生了变化,则会用红色标注(Rip寄存器除外)
例如执行了 sub rsp, 0xb8
之后,寄存器 Rsp 的值发生变化,标注为红色
- api.go/ui.go/data.go 使用 channel
api.go里 Continue
函数使用 channel 代替 Sleep,解决运行时间和效率问题
ui.go 和 data.go 在获取数据和更新界面的时候使用 errgroup
来处理异常(纯学习,感觉用不到)
- 添加反汇编 地址 指令,详细见 d/disassembly
右下角还没想好放什么,先空着
最左边是指令地址,中间的 #
表示是否在该地址处有断点,右边是指令
当前 Rip 所指向的命令由红色标注
通过接口获取到的寄存器有很多个,在这里就截取到 R15
寄存器,其他的感觉使用场景有限
默认是看 Rsp
寄存器内值的地址,也就是栈上的数据
详情请见 UI.go/initCommands
函数