首页
社区
课程
招聘
[分享]自写自用的调试分析工具 udbg
发表于: 2021-5-9 14:10 28206

[分享]自写自用的调试分析工具 udbg

2021-5-9 14:10
28206

自己利用业余时间写了很长时间了,核心功能使用rust开发,上层逻辑使用lua开发,不敢说比现有的调试器更好用,主要是方便我自己用来做一些自动化调试分析的事情

release页面下载dist.zip解压到本地即可使用,路径中不要包含Unicode字符

要介绍的内容有点多,文档还在完善中...

主要是命令行启动

完整的命令行语法如下

软件截图
图片描述

设置断点最简单的方法是在反汇编视图中,选择对应汇编语句,按F2

但如果想设置更复杂的断点需要使用bp命令,列几个常用的断点设置示例

bp命令的完整帮助 bp -h

如果需要了解bp命令的详细实现方式,参考script/udbg/command/bp.lua

通过脚本定制更复杂的断点处理逻辑

除了堆栈视图,还可以使用dp -r rsp来查看堆栈;udbg目前未实现基于符号的堆栈回溯,dp -r本质上是暴力搜索堆栈上的返回地址

udbg自带的调试引擎支持加载pdb符号,可在配置文件中通过__config.symbol_cache = 'D:/Symbols来指定pdb符号所在的目录,目录结构和windbg的符号缓存目录一致,可以在windbg里下载系统所需要的符号

udbg首先会根据dll/exe里的pdb路径去加载符号,如果没有的话再寻找dll所在目录下的同名pdb,如果也没有就会去符号缓存目录中加载

如果想给一个模块手动指定pdb路径,可以使用命令 load-symbol xx.dll D:\xx.pdb

也可以在配置文件中写脚本来自动加载

可以通过脚本配置更复杂的异常处理

在目标断下时,可以通过如下脚本来启动一个单步跟踪过程

config下的client.lua为第一个被执行的配置脚本,主要用于定制一些跟客户端UI相关的配置,配置脚本示例如下

config下的udbg/plugin/init.lua会在调试器初始化时被执行,可以做一些跟调试器相关的配置,比如

注意,执行client.luaudbg/plugin/init.lua的是两个不同的lua虚拟机,前者是给客户端UI使用的,后者是给调试器核心使用的

 
udbg 0.1.0
metaworm
 
USAGE:
    udbg.exe [FLAGS] [OPTIONS] [--] [ARGS]
 
FLAGS:
    -a, --attach       Attach target
    -h, --help         Prints help information
    -W, --no-window    Dont show the main window
    -o, --open         Open the target, not attach
    -p, --pid          Target as pid
        --version      Prints version information
    -V, --verbose      Show the verbose info
    -w, --watch        Watch the executed lua script
 
OPTIONS:
    -A, --adaptor <adaptor>          Specify the adaptor [default: ]
    -r, --remote <address:port>      Connect to udbg server, with cui [env: UDBG_SERVER=]
        --cwd <directory>            Set CWD for target
    -e, --execute <lua path>         Execute lua script
    -c, --config <udbg config>...    Set the __config
 
ARGS:
    <target-path>    Create debug target
    <args>...        Shell Arguments to target
udbg 0.1.0
metaworm
 
USAGE:
    udbg.exe [FLAGS] [OPTIONS] [--] [ARGS]
 
FLAGS:
    -a, --attach       Attach target
    -h, --help         Prints help information
    -W, --no-window    Dont show the main window
    -o, --open         Open the target, not attach
    -p, --pid          Target as pid
        --version      Prints version information
    -V, --verbose      Show the verbose info
    -w, --watch        Watch the executed lua script
 
OPTIONS:
    -A, --adaptor <adaptor>          Specify the adaptor [default: ]
    -r, --remote <address:port>      Connect to udbg server, with cui [env: UDBG_SERVER=]
        --cwd <directory>            Set CWD for target
    -e, --execute <lua path>         Execute lua script
    -c, --config <udbg config>...    Set the __config
 
ARGS:
    <target-path>    Create debug target
    <args>...        Shell Arguments to target
 
bp                                        设置断点
    <address>       (string)              断点地址
    <vars...>       (optional string)     变量列表
 
    -n, --name        (optional string)   断点名称
    -c, --cond        (optional string)   中断条件
    -l, --log         (optional string)   日志表达式
    -f, --filter      (optional string)   日志条件
    -s, --statistics  (optional string)   统计表达式
    -t, --type        (optional bp_type)  断点类型(e|w|a)(1|2|4|8)
    --tid             (optional number)   命中线程
    --temp                                临时断点
    --symbol                              转换为符号
    --hex                                 十六进制显示
    --caller                              显示调用者
    -m, --module                          模块加载断点
bp                                        设置断点
    <address>       (string)              断点地址
    <vars...>       (optional string)     变量列表
 
    -n, --name        (optional string)   断点名称
    -c, --cond        (optional string)   中断条件
    -l, --log         (optional string)   日志表达式
    -f, --filter      (optional string)   日志条件
    -s, --statistics  (optional string)   统计表达式
    -t, --type        (optional bp_type)  断点类型(e|w|a)(1|2|4|8)
    --tid             (optional number)   命中线程
    --temp                                临时断点
    --symbol                              转换为符号
    --hex                                 十六进制显示
    --caller                              显示调用者
    -m, --module                          模块加载断点
add_bp('kernel32!CreateFileW', function()
    local path = read_wstring(reg.rcx)
    log('[CreateFileW]', path)
    if path:find 'xxx' then
        -- 返回true表示这个断点会中断给用户处理
        return true
    end
    -- 在调用 CreateFileW 的返回点处设置断点
    add_bp(reg.rsp, function()
        log('[CreateFileW]', 'return', reg.rax)
    end, {temp = true, type = 'table'})
end)
add_bp('kernel32!CreateFileW', function()
    local path = read_wstring(reg.rcx)
    log('[CreateFileW]', path)
    if path:find 'xxx' then
        -- 返回true表示这个断点会中断给用户处理
        return true
    end
    -- 在调用 CreateFileW 的返回点处设置断点
    add_bp(reg.rsp, function()
        log('[CreateFileW]', 'return', reg.rax)
    end, {temp = true, type = 'table'})
end)
 
 
 
function uevent.on.module_load(m)
    if m.base == PA 'xx.dll' then
        m:load_symbol [[D:\xx.pdb]]
    end
end
function uevent.on.module_load(m)
    if m.base == PA 'xx.dll' then
        m:load_symbol [[D:\xx.pdb]]
    end
end
function uevent.on.exception(tid, code, first)
    if code == STATUS_CPP_EH_EXCEPTION then
        return 'run'
    end
    if reg.rip == 0 then
        return 'run'
    end
end
function uevent.on.exception(tid, code, first)
    if code == STATUS_CPP_EH_EXCEPTION then
        return 'run'
    end
    if reg.rip == 0 then
        return 'run'
    end
end
-- 单步跟踪1000步并输出每一步的汇编语句
local count = 1000
local disasm = disasm
ui.continue('step', function()
    count = count - 1
    local pc = reg._pc
    log(hex(pc), disasm(pc).string)
    return count == 0
end)
-- 单步跟踪1000步并输出每一步的汇编语句
local count = 1000
local disasm = disasm
ui.continue('step', function()
    count = count - 1
    local pc = reg._pc

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 12
支持
分享
最新回复 (16)
雪    币: 219
活跃值: (88)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不明觉厉,支持一下
2021-5-9 14:29
0
雪    币: 357
活跃值: (3618)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
3
牛叉
2021-5-9 14:32
0
雪    币: 876
活跃值: (599)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
2021-5-9 16:47
0
雪    币: 4818
活跃值: (3364)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5

弄一些过反调试的东西进去,现在的调试器,好多都 过不了反调试

最后于 2021-5-9 18:04 被linghaien编辑 ,原因:
2021-5-9 18:03
0
雪    币: 414
活跃值: (1731)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
linghaien 弄一些过反调试的东西进去,现在的调试器,好多都 过不了反调试
反调试这个需求可能比较小众,后面会考虑以插件的形式实现一些反调试功能
2021-5-9 18:12
0
雪    币: 8403
活跃值: (4331)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
牛叉,试用了下,界面很清爽,希望楼主能持续更新,期待增加新功能,还有问题目前仅有x86版本吗?
2021-5-9 21:02
0
雪    币: 3305
活跃值: (2027)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
跟x64dbg比还是差了一大堆,不过很好了。
2021-5-9 21:39
0
雪    币: 414
活跃值: (1731)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
十年后 牛叉,试用了下,界面很清爽,希望楼主能持续更新,期待增加新功能,还有问题目前仅有x86版本吗?
没有x86版本,暂时也不考虑提供x86版本,但是支持调试WOW64应用
2021-5-9 22:01
0
雪    币: 8233
活跃值: (2736)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
谢谢分享,下载试用
2021-5-10 07:24
0
雪    币: 3474
活跃值: (2699)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
make一下。可能会有用到的时候呢 
2021-5-10 08:44
0
雪    币: 23081
活跃值: (3447)
能力值: (RANK:648 )
在线值:
发帖
回帖
粉丝
12
感谢分享!
2021-5-10 10:25
0
雪    币: 1042
活跃值: (560)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
卧槽,牛X
2021-5-10 14:15
0
雪    币: 1994
活跃值: (1531)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
14
rust真是个好东西,还能开发驱动
2021-5-12 12:00
0
雪    币: 15
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
15
不明觉厉,支持一下
2021-6-2 21:15
0
雪    币: 2427
活跃值: (6833)
能力值: ( LV7,RANK:102 )
在线值:
发帖
回帖
粉丝
16
这真是小母牛不下崽,牛逼坏了
2021-6-2 21:49
0
雪    币: 4134
活跃值: (5847)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
17
fjqisba 这真是小母牛不下崽,牛逼坏了
你说话真是精辟坏了
2021-8-5 10:23
0
游客
登录 | 注册 方可回帖
返回
//