[C++] 纯文本查看 复制代码 DWORD WINAPI ThreadProc(PVOID lpParameter)
{
PCHAR lpMsg = (PCHAR)lpParameter;
while(TRUE)
{
OutputDebugString(lpMsg);
Sleep(2000);
}
return 0;
}
void CMfcDlg::OnThread()
{
CreateThread(NULL, 0, ThreadProc, "11111", 0, NULL);
}
void CMfcDlg::OnThread2()
{
CreateThread(NULL, 0, ThreadProc, "22222", 0, NULL);
}
void CMfcDlg::OnThread3()
{
CreateThread(NULL, 0, ThreadProc, "33333", 0, NULL);
}
void CMfcDlg::OnThread4()
{
CreateThread(NULL, 0, ThreadProc, "44444", 0, NULL);
}
void CMfcDlg::OnThread5()
{
CreateThread(NULL, 0, ThreadProc, "55555", 0, NULL);
}
用的是上面的测试代码, 用了两种方法测试.
方法1:
载入目标程序后, 中断在OEP处, 然后对 ThreadProc 回调下硬件断点,
F9程序运行后, 依次按下每一个按钮. 看看每个thread是否会硬件中断下来.
(这里主要测验调试器是否支持多线程,以及刷新 DR context. 这个od1.x做不到)
方法2:
载入后直接F9运行, 运行后, 依次按下每一个按钮.再在ThreadProc 下硬件断点.
(这里主要测验程序运行后,调试器是否能刷新多线程 context. 这个od1.x做不到)
(注意区别, 上面的是暂停在OEP处时,下的硬断, 下面个是运行时下的硬断.这样测试才能全面测试硬件断点准确无误. )
最后看看每个thread是否会硬件中断下来.
其中测试了 yzdbg x64dbg ollydbg2.x 两种方法测试了都正常. 只有 ollydbg1.x 有问题.
方法1中说明在接收到 CREATE_THREAD_DEBUG_EVENT 事件后, od1.x并没有给dr寄存器重新设置硬件断点.
方法2中有都效果,能正常中断, 只有 od1.x 每个线程都F9一次后,程序就非正常结束了.
|