新聞中心

        EEPW首頁 > 電源與新能源 > Windows內核調試器原理淺析(二)

        Windows內核調試器原理淺析(二)

        ——
        作者: 時間:2007-04-18 來源: 收藏
        case DbgKdContinueApi:
                    if (NT_SUCCESS(ManipulateState.u.Continue.ContinueStatus) != FALSE) {
                        return ContinueSuccess;
                    } else {
                        return ContinueError;
                    }
                    break;

                case DbgKdContinueApi2:
                    if (NT_SUCCESS(ManipulateState.u.Continue2.ContinueStatus) != FALSE) {
                        KdpGetStateChange(&ManipulateState,ContextRecord);
                        return ContinueSuccess;
                    } else {
                        return ContinueError;
                    }
                    break;

                case DbgKdRebootApi:
                    KdpReboot();
                    break;

                case DbgKdReadMachineSpecificRegister:
                    KdpReadMachineSpecificRegister(&ManipulateState,&MessageData,ContextRecord);
                    break;

                case DbgKdWriteMachineSpecificRegister:
                    KdpWriteMachineSpecificRegister(&ManipulateState,&MessageData,ContextRecord);
                    break;

                case DbgKdSetSpecialCallApi:
                    KdSetSpecialCall(&ManipulateState,ContextRecord);
                    break;

                case DbgKdClearSpecialCallsApi:
                    KdClearSpecialCalls();
                    break;

                case DbgKdSetInternalBreakPointApi:
                    KdSetInternalBreakpoint(&ManipulateState);
                    break;

                case DbgKdGetInternalBreakPointApi:
                    KdGetInternalBreakpoint(&ManipulateState);
                    break;

                case DbgKdGetVersionApi:
                    KdpGetVersion(&ManipulateState);
                    break;

                case DbgKdCauseBugCheckApi:
                    KdpCauseBugCheck(&ManipulateState);
                    break;

                case DbgKdPageInApi:
                    KdpNotSupported(&ManipulateState);
                    break;

                case DbgKdWriteBreakPointExApi:
                    Status = KdpWriteBreakPointEx(&ManipulateState,
                                                  &MessageData,
                                                  ContextRecord);
                    if (Status) {
                        ManipulateState.ApiNumber = DbgKdContinueApi;
                        ManipulateState.u.Continue.ContinueStatus = Status;
                        return ContinueError;
                    }
                    break;

                case DbgKdRestoreBreakPointExApi:
                    KdpRestoreBreakPointEx(&ManipulateState,&MessageData,ContextRecord);
                    break;

                case DbgKdSwitchProcessor:
                    KdPortRestore ();
                    ContinueStatus = KeSwitchFrozenProcessor(ManipulateState.Processor);
                    KdPortSave ();
                    return ContinueStatus;

                case DbgKdSearchMemoryApi:
                    KdpSearchMemory(&ManipulateState, &MessageData, ContextRecord);
                    break;

            讀寫內存、搜索內存、設置/恢復斷點、繼續執行、重啟等等,WinDBG里的功能是不是都能實現了?呵呵。

            每次內核接管系統是通過調用在KiDispatchException里調用KiDebugRoutine(KdpTrace),但我們知道要讓系統執行到KiDispatchException必須是系統發生了異常。而內核與被調試系統之間只是通過串口聯系,串口只會發生中斷,并不會讓系統引發異常。那么是怎么讓系統產生一個異常呢?答案就在KeUpdateSystemTime里,每當發生時鐘中斷后在HalpClockInterrupt做了一些底層處理后就會跳轉到這個函數來更新系統時間(因為是跳轉而不是調用,所以在WinDBG斷下來后回溯堆棧是不會發現HalpClockInterrupt的地址的),是系統中調用最頻繁的幾個函數之一。在KeUpdateSystemTime里會判斷KdDebuggerEnable是否為TRUE,若為TRUE則調用KdPollBreakIn判斷是否有來自內核的包含中斷信息的包,若有則調用DbgBreakPointWithStatus,執行一個int 0x3指令,在異常處理流程進入了KdpTrace后將根據處理不同向內核調試器發包并無限循環等待內核調試的回應。現在能理解為什么在WinDBG里中斷系統后堆棧回溯可以依次發現KeUpdateSystemTime->RtlpBreakWithStatusInstruction,系統停在了int 0x3指令上(其實int 0x3已經執行過了,只不過Eip被減了1而已),實際已經進入KiDispatchException->KdpTrap,將控制權交給了內核調試器。


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 敖汉旗| 石林| 光泽县| 新平| 通海县| 方城县| 盐城市| 凯里市| 凤台县| 蒲城县| 广西| 安福县| 炉霍县| 新晃| 五常市| 定襄县| 黑龙江省| 东港市| 武强县| 临夏县| 万宁市| 射阳县| 阿拉善盟| 剑川县| 怀集县| 临西县| 岗巴县| 平和县| 牙克石市| 垫江县| 东港市| 平远县| 林芝县| 东辽县| 濮阳县| 株洲市| 镇雄县| 安多县| 苗栗市| 乌兰县| 琼中|