找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 5342|回复: 1

WIN7X64自定义硬断

[复制链接]

9

主题

43

回帖

2

精华

铂金会员

积分
2525
发表于 2016-5-23 17:30:06 | 显示全部楼层 |阅读模式
本帖最后由 落笔飞花 于 2016-5-23 17:32 编辑

我只是 截了 我代码中的 关键片段~至于 详细的 你们自己想
控制是否 恢复DR的是 DR7和dbgactive这两个  或者patch相关字节~
VOID T_KiRestoreDebugRegisterState(){

        PEPROCESS Process=NULL;
        PETHREAD Thread=NULL;
        PPROCESS_List PlIST = NULL;;
        PTHREAD_dr_List TList = NULL;
        ULONG64 UDR = NULL;
        PLARGE_INTEGER PDR = &UDR;
        
        Thread = PsGetCurrentThread();
        if (Thread!=NULL)
        {
                Process = IoThreadToProcess(Thread);



                if (Process != NULL){

                        PlIST = Dr_FindProcessList(Process);
                        if (PlIST != NULL)
                        {

                                TList = Dr_FindThreadContextByThreadList(PlIST, Thread);
                                if (TList != NULL)
                                {
                                        PDR->LowPart = TList->Dr0;
                                        PDR->HighPart = 0x00000000;
                                        __writedr(0, UDR);
                                         
                                        PDR->LowPart = TList->Dr1;
                                        PDR->HighPart = 0x00000000;
                                        __writedr(1, UDR);
                                         
                                        PDR->LowPart = TList->Dr2;
                                        PDR->HighPart = 0x00000000;
                                        __writedr(2, UDR);

                                        PDR->LowPart = TList->Dr3;
                                        PDR->HighPart = 0x00000000;
                                        __writedr(3, UDR);

                                        PDR->LowPart = TList->Dr6;
                                        PDR->HighPart = 0x00000000;
                                        __writedr(6, UDR);

                                        PDR->LowPart = TList->Dr7;
                                        PDR->HighPart = 0x00000000;
                                        __writedr(7, UDR);
                                }


                        }

                                }


        }




        
        return 0;
}



if (contex->Dr7 != NULL)
                                {
                                        *(UCHAR*)(Thread + 0x3) = 0x40;

                                }

                                mycontex.Dr0 = contex->Dr0;
                                mycontex.Dr1 = contex->Dr1;
                                mycontex.Dr2 = contex->Dr2;
                                mycontex.Dr3 = contex->Dr3;
                                mycontex.Dr6 = contex->Dr6;
                                mycontex.Dr7 = contex->Dr7;
                                mycontex.EFlags = contex->EFlags;
                                contex->Dr0 = ((PLARGE_INTEGER)(&pframe->Dr0))->LowPart;
                                contex->Dr1 = ((PLARGE_INTEGER)(&pframe->Dr1))->LowPart;
                                contex->Dr2 = ((PLARGE_INTEGER)(&pframe->Dr2))->LowPart;
                                contex->Dr3 = ((PLARGE_INTEGER)(&pframe->Dr3))->LowPart;
                                contex->Dr6 = ((PLARGE_INTEGER)(&pframe->Dr6))->LowPart;
                        //        contex->Dr7 = ((PLARGE_INTEGER)(&pframe->Dr7))->LowPart;
                        //        contex->EFlags = pframe->EFlags;



实现 内核切用户层恢复DR

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2016-5-23 18:03:48 | 显示全部楼层
不明觉厉。感觉你用过用MONITOR_TRAP_FLAG。
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表