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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

4.软件断点

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

調試的本質:

  • 想辦法讓被調試程序觸發異常
  • 觸發異常后就會向DEBUG_OBJECT里發送調試事件
  • 調試器接管異常的過程
  • 一般調試器都會有軟件斷點,內存斷點,硬件斷點… 其實這些無非就是想讓被調試程序觸發異常再讓調試器來接管。

    在OD中隨便一個地址按下F2后程序執行到那就會被斷下來,這時調試器將會擁有被調試程序的控制權,這個過程我們稱為“中斷到調試器”。

    當我們在OD中按下F2其實就是將那個地址的第一個機器碼修改為0xCC對應的匯編就是 int 3 。

    被調試進程:

  • CPU檢測到 INT 3 指令
  • 查IDT表找到對應的中斷處理函數
  • CommonDispatchException
  • KiDispatchException
  • DbgkForwardException收集并發送調試事件
  • DbgkpSendApillessage (x, x) 1)參數1:消息結構 每種消息都有自己的消息結構共有7種類型 2)參數2:要不要把本進程內除了自己之外的其他線程掛起.有些消息需要把其他線程掛起,比如異常

    調試器進程

  • 循環判斷
  • 取出調試事件
  • 列出信息寄存器內存
  • 寄存器 內存
  • 等待調試者處理
  • int 3流程圖

    IDT中進入3號中斷


    我們現在只關注3環。


    如果有內核調試器你3環的調試器是沒有辦法調試了,我們現在是沒有內核調試器的

    DbgkpSendApillessage (x, x)

    一旦產生異常會先將被調試進程掛起,然后向調試對象的鏈表插入調試事件,后面就是調試器的事了…

    代碼

    typedef HANDLE(__stdcall *pMyOpenThread)(DWORD dwDesiredAccess, // access rightBOOL bInheritHandle, // handle inheritance optionDWORD dwThreadId // thread identifier);//被調試進程ID,進程句柄,OEP DWORD dwDebuggeePID = 0; HANDLE hDebuggeeProcess = NULL; //被調試線程句柄 HANDLE hDebuggeeThread;//系統斷點 BOOL bIsSystemInt3 = TRUE;//被INT 3覆蓋的數據 char OriginalCode = 0;//線程上下文 CONTEXT Context = { 0 };BOOL WaitForUserCommand() {BOOL bRet = FALSE;char cContext;printf("COMMAND> ");cContext = getchar();switch (cContext){case 't':bRet = TRUE;break;case 'p':bRet = TRUE;break;case 'g':bRet = TRUE;break;}return bRet; }BOOL Int3ExceptionProc(EXCEPTION_DEBUG_INFO* excp) {BOOL bRet = FALSE;//1將INT 3修復為原來的數據(如果是系統斷點不用修復)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斷下已經走了一個字節,Eip要-1)Context.Eip --;SetThreadContext(hDebuggeeThread, &Context);//5.顯示反匯編代碼//省略..//6.等待調試者命令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; }void SetInt3BreakPoint(LPVOID addr) {ReadProcessMemory(hDebuggeeProcess, addr, &OriginalCode, 1, NULL);BYTE int3[1] = { 0xcc };WriteProcessMemory(hDebuggeeProcess, addr, int3, 1, NULL); }#define ProcessName L"C:\\Users\\Administrator\\Desktop\\控制臺測試\\Debug\\Dbgview.exe" VOID CALL() {BOOL nIsConinue = TRUE;DEBUG_EVENT debugEvent = { 0 };DWORD dwContext = DBG_CONTINUE;//1.創建調試進程STARTUPINFO startupInfo = { 0 };PROCESS_INFORMATION pInfo = { 0 };GetStartupInfo(&startupInfo);WCHAR* _ProcessName = { L"C:\\Users\\Administrator\\Desktop\\控制臺測試\\Debug\\Dbgview.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;//調試循環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://進程創建的時候 在DEP處設置斷點就是將OEP處的一個字節改為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);} }

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: jizzzxxxx| 美女屁股无遮挡 | 操小妹影院 | 中文字幕免费在线观看 | 日本阿v视频 | 少妇25p| av第一区| 黑人巨大精品欧美一区免费视频 | 亚洲成人一区在线 | 大尺度在线观看 | 日韩永久 | 亚洲国产视频在线 | 91网在线 | 四虎视频在线 | 久久婷婷影视 | 欧美一区二区三区大屁股撅起来 | wwwxxx在线播放 | 最新高清无码专区 | 精品日本一区二区 | 亚洲自拍色图 | 中文字幕观看视频 | 久久国产色av免费观看 | 久久午夜影院 | 国产精品视频a | 男男毛片 | 国产成人在线免费 | 少妇高潮惨叫久久久久 | 亚洲不卡在线观看 | 亚洲一区二区三区高清 | 大地资源中文在线观看免费版 | 天天躁狠狠躁狠狠躁夜夜躁68 | 最新av免费观看 | 亚洲一区二区三区高清在线 | 日本亚洲欧美在线 | 波多野结衣中文字幕一区二区 | 日韩va亚洲va欧美va久久 | 最近中文字幕在线中文高清版 | 后宫秀女调教(高h,np) | 亚洲欧美一区二区精品久久久 | 久久久青| 正在播放经典国语对白 | 国产免费www | 国产精品成人免费一区久久羞羞 | 九九久久视频 | 欧美一级片网址 | 成人乱码一区二区三区av | 日批黄色| 激情亚洲网 | 免费av一区二区三区 | 制服一区 | 精品人妻人人做人人爽 | 牛牛视频在线 | 一区二区三区四区不卡 | 亚洲精品国产精品乱码不卡√香蕉 | 久久深夜 | 国产精品久久久久影院色老大 | 日本精品久久久久久久 | 国产黄频 | 久久麻豆精品 | 精品一区二区三区中文字幕 | 制服丝袜手机在线 | 永久免费看mv网站入口78 | 有码在线播放 | 亚洲精品久久久久久久蜜桃臀 | 国产一区二区网 | 黄色片网站在线播放 | 亚洲精品国产精品乱码不卡 | 麻豆精品一区二区 | 偷拍女澡堂一区二区三区 | 色欲av永久无码精品无码蜜桃 | 国产精品夜夜躁视频 | 成人123| 欧美久久免费 | 精品国产aⅴ一区二区三区东京热 | 亚洲中文字幕在线观看 | 国产精品丝袜黑色高跟鞋的设计特点 | 黄色精品视频在线观看 | 国产另类视频 | 亚洲视频观看 | 欧美高清视频一区二区三区 | 日本三级中国三级99人妇网站 | 国产成人精品视频ⅴa片软件竹菊 | 长篇高h肉爽文丝袜 | av一区二区不卡 | 在线观看网站黄 | 免费三级av | 国产精品欧美在线 | 国产又粗又黄视频 | 传媒视频在线观看 | 中文字幕av久久爽 | 亚洲成人久久久久 | 久草中文视频 | 爱爱三级视频 | 狠狠干夜夜爽 | 99riav1国产精品视频 | 日韩在线三级 | 青青99 | 欧美日韩一级视频 | 动漫3d精品一区二区三区乱码 |