首页
社区
课程
招聘
x64dbg多线程硬件断点的BUG
2023-7-16 16:52 6097

x64dbg多线程硬件断点的BUG

2023-7-16 16:52
6097

大家应该遇到过x64dbg给一个变量地址下硬断,之后删除断点,运行发现还是会断下,而且会崩溃,看了一下虽然你删除了DR0-DR3的值,但是依然还是删除不掉。
调试了x64dbg的源码,发现在
TitanEngine.Debugger.DebugLoop.cpp ->
__declspec(dllexport) void TITCALL DebugLoop() ->
输出 DR0-DR3 是没值的
ContinueDebugEvent
输出 DR0-DR3 居然有值了

也就是说,你删除DR0-DR3的值,在ContinueDebugEvent之前是没值的,但是当调用了ContinueDebugEvent 之后,DR0-DR3居然有值了。而且我在setthreadcontext下了断点,根本没有设置DR0-DR3,想不通什么原理。

有没有哪位大哥修复过的,关键点在哪里?

当然有人说那个是多线程的问题,我自己写了一个小程序。
fot i=0;i<10;i++
::Createthread(...(CheckThread));

CheckThread()
{
while(1)
{ indexnum++; }
}
给 indexnum 这个地址下访问硬断,在多线程确实会有一些线程删除不掉DR0的值,不过单线程就没有问题了。

想不通。


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

最后于 2023-7-22 02:13 被cheating编辑 ,原因: 上传附件
上传的附件:
收藏
点赞2
打赏
分享
最新回复 (18)
雪    币: 26
活跃值: (1375)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
imliuxin 2023-7-17 09:29
2
0
Ida好像也遇到过,只能忍
雪    币: 914
活跃值: (2188)
能力值: ( LV5,RANK:68 )
在线值:
发帖
回帖
粉丝
万剑归宗 1 2023-7-17 09:51
3
0
IDA X64DBG WINDBG 全都有这个毛病
雪    币: 46
活跃值: (1615)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cheating 2023-7-17 10:44
4
0
万剑归宗 IDA X64DBG WINDBG 全都有这个毛病[em_1]
不过CE就没有这个毛病,有什么思路改掉吗?
雪    币: 46
活跃值: (1615)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cheating 2023-7-17 10:44
5
0
imliuxin Ida好像也遇到过,只能忍
不过CE就没有这个毛病,有什么思路改掉吗?
雪    币: 1524
活跃值: (3310)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
小希希 2023-7-17 11:07
6
0
hook  waitfordebugevent 是自己设置过的硬件断点,而且已经清除,对所有线程的这个断点事件都处理一次,不要反回给系统
雪    币: 46
活跃值: (1615)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cheating 2023-7-17 17:48
7
0
小希希 hook waitfordebugevent 是自己设置过的硬件断点,而且已经清除,对所有线程的这个断点事件都处理一次,不要反回给系统
不要返回给windows系统?
雪    币: 13495
活跃值: (4823)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tDasm 2023-7-19 08:10
8
0
特意测试了一下,没发现你说的问题。
很容易测试,在代码区设置一个硬件执行断点,然后看寄存器区域dr0的值是不是你设置的地址,再到断点管理窗口删除该断点,再看寄存器区dr0是不是为0?关闭调试器,再打开调试器调试该程序,看是不是还有该硬件断点?显然是没有的。
雪    币: 46
活跃值: (1615)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cheating 2023-7-21 00:02
9
0
tDasm 特意测试了一下,没发现你说的问题。 很容易测试,在代码区设置一个硬件执行断点,然后看寄存器区域dr0的值是不是你设置的地址,再到断点管理窗口删除该断点,再看寄存器区dr0是不是为0?关闭调试器,再打 ...
第一:开10条线程访问同一个变量。
第二:附加后对该变量下硬件访问断点
第三:断下来后,你点击运行3-5次
第四:删除硬件断点
第五:点击运行,你会发现有很多有一些线程DR0是有值的。

调试程序的时候,你关闭调试器干什么?
雪    币: 13495
活跃值: (4823)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tDasm 2023-7-21 08:10
10
0
cheating 第一:开10条线程访问同一个变量。 第二:附加后对该变量下硬件访问断点 第三:断下来后,你点击运行3-5次 第四:删除硬件断点 第五:点击运行,你会发现有很多有一些线程DR0是有值的。 ...
你这样的思维也是醉了。
不就是2种状态?
1、调试时不关闭,检查删除的硬件断点是否存在?
2、调试后关闭再调试,检查删除的硬件断点是否存在?
既然你已经遇到,你就把你的调试样本发出来让大家测试不就完了?说那么多空话干吗?
雪    币: 46
活跃值: (1615)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cheating 2023-7-21 11:33
11
0
tDasm 你这样的思维也是醉了。 不就是2种状态? 1、调试时不关闭,检查删除的硬件断点是否存在? 2、调试后关闭再调试,检查删除的硬件断点是否存在? 既然你已经遇到,你就把你的调试样本发出来让大家测试 ...

已上传附件

雪    币: 22002
活跃值: (3637)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
huangyalei 2023-7-21 13:23
12
0
cheating 已上传附件
真是服了你,让传样本就传个源码,你以为每台电脑上VS都是标配吗
雪    币: 46
活跃值: (1615)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cheating 2023-7-22 01:15
13
0
huangyalei 真是服了你,让传样本就传个源码,你以为每台电脑上VS都是标配吗

样本文件已上传,下断地址:0x004AF880
附加进程后,在【内存窗口】中对 0x004AF880 下硬件访问断点,点击运行3-5次,之后删除硬件断点,再次点击运行,会发现有一些线程的DR0没有办法删除。

最后于 2023-7-22 01:16 被cheating编辑 ,原因: 文字表示有误
雪    币: 13495
活跃值: (4823)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tDasm 2023-7-22 08:38
14
0
明确告诉你,X64DBG在硬件断点管理上是没有什么问题的,只是你对多线程的理解不够深刻,希望你自己仔佃去捉摸。当然x64dbg还可以更完美!
雪    币: 22002
活跃值: (3637)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
huangyalei 2023-7-22 09:25
15
0
我试了七八次,没能复现你的问题,你得检查一下是不是插件影响,或者不带插件调试
雪    币: 46
活跃值: (1615)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cheating 2023-7-22 13:14
16
0
tDasm 明确告诉你,X64DBG在硬件断点管理上是没有什么问题的,只是你对多线程的理解不够深刻,希望你自己仔佃去捉摸。当然x64dbg还可以更完美!
直接下断就好,CE都没有这问题。
雪    币: 46
活跃值: (1615)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cheating 2023-7-22 13:14
17
0
huangyalei 我试了七八次,没能复现你的问题,你得检查一下是不是插件影响,或者不带插件调试
我这没有插件,干干净净的,要下什么插件呢?我也下来看看
雪    币: 357
活跃值: (2598)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
KooJiSung 2023-7-22 13:53
18
0
__declspec(dllexport) void TITCALL DebugLoop() ->
输出 DR0-DR3 是没值的
ContinueDebugEvent
输出 DR0-DR3 居然有值了

既然是多线程,你应该再确定是否同一个线程,不完美就是问题
雪    币: 46
活跃值: (1615)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cheating 2023-7-22 14:17
19
0
KooJiSung __declspec(dllexport) void TITCALL DebugLoop() -> 输出 DR0-DR3 是没值的 ContinueDebugEvent 输出 DR0-DR ...
__declspec(dllexport) void TITCALL DebugLoop() ->
for (int i=0;....)
{
    dr0 = threadarray(i);//遍历所有线程
    dr0 均无值
}
ContinueDebugEvent
for (int i=0;....)
{
    dr0 = threadarray(i);//遍历所有线程
    dr0 有一些线程有值
}

不明白。
游客
登录 | 注册 方可回帖
返回