日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

6.硬件断点

發(fā)布時間:2025/3/20 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 6.硬件断点 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

調(diào)試寄存器

  • DR0~DR3:調(diào)試地址寄存器,用于設置硬件斷點
  • DR4~DR5:保留,未公開具體作用
  • DR6:調(diào)試寄存器組狀態(tài)寄存器
  • DR7:調(diào)試寄存器組控制寄存器

硬件斷點的原理是使用DR0~DR3設置地址,使用DR7設置狀態(tài),因此最多設置4個。

<1> L0/G0 ~ L3/G3: L0/G0對應DR0,L1/G1對應DR1,以此類推…,用于控制Dr0~Dr3是否有效,Lx是局部的僅影響當前線程,Gx全局的影響當前進程中所有線程。
每次異常后,Lx都被清零,Gx不清零。

<2> 斷點長度(LENx):x的下標為幾就對應那個控制寄存器,00(1字節(jié)) 01(2字節(jié)) 11(4字節(jié))

<3> 斷點類型(R/Wx):x的下標為幾就對應那個控制寄存器,00(執(zhí)行斷點) 01(寫入斷點) 11(訪問斷點)

被調(diào)試進程

  • CPU執(zhí)行時檢測到調(diào)試寄存器(Dr0~Dr3)
  • 查IDT表找到對應的斷處理函數(shù)nt!KiTrap01(1號門)
  • CommonDispatchException
  • KiDispatchException?
  • DbgkForwardException收集并發(fā)送調(diào)試事件
  • DbgkpSendApillessage (x, x) 1)第一個參數(shù):消息結(jié)構(gòu)每種消息都有自己的消息結(jié)構(gòu)共有7種類型 2)第二個參數(shù),要不要把本進程內(nèi)除了自己之外的其他線程掛起.有些消息需要把其他線程掛起,比如異常

    這個過程到第3步時,所有斷點都一樣執(zhí)行流程都一樣。

    處理硬件斷點:

  • 硬件調(diào)試斷點產(chǎn)生的異常是 STATUS_SINGLE_STEP(單步異常
  • B0~B3:哪個調(diào)試地址寄存器觸發(fā)的異常
  • 設置硬件斷點要設置到所屬線程的上下文。

    單步異常

    不單只有硬件斷點能觸發(fā)單步異常,EFLAGS寄存器也可以

    設置單步運行:

    TF位置1

    處理單步異常:

    單步產(chǎn)生的異常是 STATUS_SINGLE_STEP(單步異常)

    TF位置1的時候每走完一步就會觸發(fā)單步異常。

    單步步入:
    遇到CALL指令會跟進去

    單步步過:
    遇到CALL不會跟進去,實現(xiàn)原理是計算當指令長度,當前指令長度+當前eip的地方下斷(也就是call指令的下一行)。

    如果寫代碼修改返回地址,單步步入沒事,單步步過就會跑飛。

    下面代碼只有單步步入

    //被調(diào)試進程句柄 HANDLE hDebuggeeProcess = NULL; //被調(diào)試線程句柄 HANDLE hDebuggeeThread; //系統(tǒng)斷點 BOOL bIsSystemInt3 = TRUE; //被INT 3覆蓋的數(shù)據(jù) char OriginalCode = 0; //線程上下文 CONTEXT Context = { 0 };BOOL WaitForUserCommand() {BOOL bRet = FALSE;char cContext = 0;printf("COMMAND> ");scanf("%c",&cContext);switch (cContext){case 't':bRet = TRUE;//1.獲取線程上下文Context.ContextFlags = CONTEXT_FULL || CONTEXT_DEBUG_REGISTERS;GetThreadContext(hDebuggeeThread, &Context);//2.設置單步執(zhí)行Context.EFlags |= 0x100;//3.設置線程上下文SetThreadContext(hDebuggeeThread, &Context);break;case 'p':bRet = TRUE;break;case 'g':bRet = TRUE;break;}return bRet; }VOID setHardBreakPoint(PVOID addr) {//1.獲取線程上下文Context.ContextFlags = CONTEXT_ALL;SuspendThread(hDebuggeeThread);//掛起線程GetThreadContext(hDebuggeeThread,&Context);//2.設置斷點位置Context.Dr0 = (DWORD)addr;Context.Dr7 |= 1;//3.設置斷點長度Context.Dr7 &= 0xfff0ffff;//4.設置線程上下文BOOL a = SetThreadContext(hDebuggeeThread, &Context);ResumeThread(hDebuggeeThread);//恢復線程 }BOOL Int3ExceptionProc(EXCEPTION_DEBUG_INFO* excp) {BOOL bRet = FALSE;//1將INT 3修復為原來的數(shù)據(jù)(如果是系統(tǒng)斷點不用修復)if (bIsSystemInt3){bIsSystemInt3 = FALSE;return TRUE;}else{//還原WriteProcessMemory(hDebuggeeProcess, excp->ExceptionRecord.ExceptionAddress, &OriginalCode, 1, NULL);}//2.顯示斷點位置printf("int3 斷點 0x%p\n", excp->ExceptionRecord.ExceptionAddress);//3.獲取線程上下文Context.ContextFlags = CONTEXT_FULL || CONTEXT_DEBUG_REGISTERS;bool a = GetThreadContext(hDebuggeeThread, &Context);//4.修正EIP(0xcc斷下已經(jīng)走了一個字節(jié),Eip要-1)Context.Eip --;SetThreadContext(hDebuggeeThread, &Context);//5.顯示反匯編代碼//省略..//硬件斷點setHardBreakPoint((PVOID)((DWORD)excp->ExceptionRecord.ExceptionAddress+1));//6.等待調(diào)試者命令while (bRet == FALSE){bRet = WaitForUserCommand();}return bRet; }BOOL SingleStepExceptionProc(EXCEPTION_DEBUG_INFO* excp) {BOOL bRet = FALSE;//1.取線程上下文Context.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS;GetThreadContext(hDebuggeeThread, &Context);//2.判斷是否是硬件斷點導致的異常if (Context.Dr6 & 0xf)//B0-B3不為NULL{//2.1顯示斷點信息printf("硬件斷點:%X %X\n", Context.Dr7 & 0x0003000, Context.Dr0);//2.2將斷點去除Context.Dr0 = 0;Context.Dr7 = 0xfffffffe;}else{//2.1顯示斷點信息printf("單步->0x%p\n", Context.Eip);//2.2將單步去除Context.EFlags &= 0xfffffeff;}//3.設置線程上下文SetThreadContext(hDebuggeeThread, &Context);//等待用戶命令while (bRet == FALSE){bRet = WaitForUserCommand();}return bRet; }BOOL ExceptionHandler(DEBUG_EVENT* pDebugEvent) {BOOL bRet = TRUE;EXCEPTION_DEBUG_INFO* pExceptionInfo = NULL;pExceptionInfo = &pDebugEvent->u.Exception;//得到線程句柄 后面要用pMyOpenThread MyOpenThread = (pMyOpenThread)GetProcAddress(LoadLibrary(L"Kernel32.dll"),"OpenThread");hDebuggeeThread = MyOpenThread(THREAD_ALL_ACCESS,FALSE,pDebugEvent->dwThreadId);if (pExceptionInfo->ExceptionRecord.ExceptionCode == EXCEPTION_BREAKPOINT){bRet = Int3ExceptionProc(pExceptionInfo);return bRet;}if (pExceptionInfo->ExceptionRecord.ExceptionCode == EXCEPTION_SINGLE_STEP){bRet = SingleStepExceptionProc(pExceptionInfo);return bRet;}return bRet; }void SetInt3BreakPoint(LPVOID addr) {ReadProcessMemory(hDebuggeeProcess, addr, &OriginalCode, 1, NULL);BYTE int3[1] = { 0xcc };WriteProcessMemory(hDebuggeeProcess, addr, int3, 1, NULL); }void CALL() {BOOL nIsConinue = TRUE;DEBUG_EVENT debugEvent = { 0 };DWORD dwContext = DBG_CONTINUE;//1.創(chuàng)建調(diào)試進程STARTUPINFO startupInfo = { 0 };PROCESS_INFORMATION pInfo = { 0 };GetStartupInfo(&startupInfo);WCHAR* _ProcessName = { L"C:\\Users\\Administrator\\Desktop\\控制臺測試\\Debug\\0000.exe" };BOOL bRet = CreateProcess(_ProcessName, NULL, NULL, NULL, TRUE, DEBUG_PROCESS || DEBUG_ONLY_THIS_PROCESS, NULL, NULL, &startupInfo, &pInfo);if (bRet == FALSE){printf("CreateProcess error:%d\n", GetLastError());return;}hDebuggeeProcess = pInfo.hProcess;//調(diào)試循環(huán)while (nIsConinue){BOOL bRet = WaitForDebugEvent(&debugEvent, INFINITE);//取DEBUG_EVENTif (!bRet){printf("WaitForDebugEvent error:%d\n", GetLastError());return;}switch (debugEvent.dwDebugEventCode){case EXCEPTION_DEBUG_EVENT:bRet = ExceptionHandler(&debugEvent);if (!bRet)dwContext = DBG_EXCEPTION_NOT_HANDLED;break;case CREATE_THREAD_DEBUG_EVENT:break;case CREATE_PROCESS_DEBUG_EVENT://進程創(chuàng)建的時候 在DEP處設置斷點就是將OEP處的一個字節(jié)改為0xCC(INT 3)SetInt3BreakPoint((PCHAR)debugEvent.u.CreateProcessInfo.lpStartAddress);break;case EXIT_THREAD_DEBUG_EVENT:break;case EXIT_PROCESS_DEBUG_EVENT:break;case LOAD_DLL_DEBUG_EVENT:break;case UNLOAD_DLL_DEBUG_EVENT:break;}bRet = ContinueDebugEvent(debugEvent.dwProcessId, debugEvent.dwThreadId, DBG_CONTINUE);}}

    總結(jié)

    以上是生活随笔為你收集整理的6.硬件断点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲一区二区三区 | 林天顾悦瑶笔趣阁 | 亚洲夜夜操 | 欧美日韩综合一区 | 91草草草 | 精品成人久久 | 四虎影视成人永久免费观看亚洲欧美 | 99视频在线精品免费观看2 | 久久亚洲综合色 | 久久国产色 | 中文字幕在线视频观看 | 午夜一级免费 | 超碰凹凸 | 人妻一区二区三 | aa爱做片免费 | 国产区高清 | 一区二区三区高清 | 亚洲s码欧洲m码国产av | 中日韩黄色片 | 无码人妻h动漫 | 国产婷| 国产精品成熟老女人 | 少妇视频 | 色久在线 | 天堂在线视频 | 强伦人妻一区二区三区 | 欧美精品另类 | 三级欧美视频 | av集中营 | 特级西西444www| 欧美无吗| www.av网 | 亚洲一区二区三区在线看 | 国产片91| 日本大乳奶做爰 | 久久这里只有精品国产 | 色婷婷视频 | 老熟妇仑乱一区二区av | wwwwww色 | 午夜av导航 | 一区二区伦理 | 在线观看黄色av网站 | 污污视频网站在线免费观看 | 婷婷网址| 免费av网站在线 | 欧美成年人在线观看 | 爱综合网 | 每日更新av | 99久久精品免费看国产四区 | 欧美一区二区三区在线观看视频 | 国产成人啪一区二区 | 亚洲国产综合视频 | 少妇久久久久久久 | 成人国产综合 | 夜夜草av| 国产综合内射日韩久 | 国产激情成人 | 美女脱衣服一干二净 | 亚洲天堂成人网 | 中国一级片在线观看 | 日韩高清在线一区 | 欧美精品成人 | 日韩免费影院 | 69中国xxxxxxxxx69 国产又爽又色 | 欧美顶级毛片在线播放 | 久草视频在线资源站 | 久久综合加勒比 | 中国毛片在线观看 | 天天视频入口 | 制服丝袜第一页在线观看 | 成人精品视频在线播放 | 影音先锋啪啪 | 欧美成人黄色片 | 国产精品久久久久久久午夜 | 天天插天天射 | 日韩三级大片 | 自拍偷拍av | 九九热在线视频播放 | 激情五月婷婷网 | 久久最新免费视频 | 亚洲国产婷婷香蕉久久久久久99 | 茄子视频色| 久久妇女 | 久草福利资源 | 开心激情网五月天 | 精品国产一区二区三区久久狼黑人 | 80日本xxxxxxxxx96 亚洲国产精品视频在线 | 久久久久国 | 久久久久玖玖 | 日本一区二区精品 | 国产精品无码一区二区三区三 | 香蕉大久久 | 九九小视频 | 福利在线观看 | 国产精品久久久久久久久久久久久久 | 91久久久久久久 | 毛片在线视频观看 | 久色视频在线播放 | 日本一区二区不卡在线 |