自己利用业余时间写了很长时间了,核心功能使用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.lua
和udbg/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直播授课