운영 체제 코어 디버거의 원리. Windows 운영 체제의 커널 모드 디버깅 커널의 디버깅은 무엇입니까?

커널 디버거를 시작하는 방법은 무엇입니까?

석사 대답 :

소프트웨어 개발 과정에서 매우 중요한 구성 요소가 있습니다. 이것은 디버깅입니다. 응용 프로그램과 관련하여 사용자 모드에서 작동하고 종종 IDE에서 임베드 된 것을 의미합니다. 예를 들어 드라이버를 벗어날 수 있으려면 커널 디버거를 시작해야합니다.

cmd 명령 프로세서를 실행해야합니다. 작업 표시 줄에서 시작 메뉴를 엽니 다. 나타나는 창에서 "실행 ..."을 클릭하십시오. "시작 프로그램"창이 나타납니다. 텍스트 상자에 cmd를 입력 한 다음 "확인"버튼을 클릭하십시오.

이제 boot.ini 파일의 백업을 만듭니다. 먼저 명령을 사용하여 현재 Windows의 현재 사본의 설치 경로를 찾으십시오. echo % systemroot %

그런 다음 장치리스트를 입력하여 설치된 운영 체제와 함께 설치된 운영 체제와 그 후에 콜론을 두십시오. CD 명령을 사용하여 루트 디렉토리로 이동하십시오. 이제 attrib 명령을 사용하여 boot.ini 파일에서 "읽기 전용"및 "읽기 전용"및 "시스템"을 제거하십시오. 복사 명령 백업을 작성한 다음 속성을 장소로 설정하십시오.

현재 다운로드 옵션 목록을 제거하려면 bootcfg / query 명령을 사용하십시오. 목록을보고 커널 모드에서 디버깅 할 가능성이있는 새로운 설정을 기반으로 해당 항목을 정의하십시오. 부트 레코드 식별자를 기억해야합니다.

bootcfg / copy 명령을 사용하여 부팅 레코드를 만듭니다. 복사 할 녹음 식별자를 지정하려면 / id 매개 변수를 사용하십시오. / d 매개 변수를 사용하여 표시 할 녹음 이름을 설정하십시오. 이제 bootcfg / query 명령을 사용하여 다운로드 옵션 목록으로 돌아가서 추가 된 항목 식별자를 확인해야합니다.

이제 이전에 생성 된 부트 레코드로 커널 디버거를 시작하도록 옵션을 활성화해야합니다. 대상 시스템에서 디버깅하면 / 디버그 옵션을 추가해야합니다.

COM 포트를 통해 대상 컴퓨터를 호스트 시스템으로 연결하여 원격 디버깅을 구현하려면 / 포트 및 / 보드 옵션을 사용하여 포트 번호와 환율을 지정하십시오.

FireWire 케이블 (IEEE 1394 인터페이스)을 원격으로 디버깅하는 경우 적절한 모드를 활성화하려면 / dbg1394 옵션을 사용하고 채널 번호 옵션 / CH를 지정하십시오.

변경 사항이 변경되었는지 확인하려면 / query 매개 변수와 함께 bootcfg 명령을 사용하여 부팅을 확인하십시오. exit 명령을 지정하면 명령 프로세서 창을 닫습니다.

필요한 경우 운영 체제 부팅 설정을 변경하십시오. 시작 메뉴를 통해 제어판을 열고 이미있는 "시스템"요소를 엽니 다. 열리는 "시스템 등록 정보"창에서 고급 탭을 선택하십시오. 이 탭에서 "다운로드 및 복구"라는 이름의 섹션을 선택하고 "매개 변수"버튼을 클릭하십시오. 나타나는 "로드 및 복구"창에서 "운영 체제 표시 목록"옵션을 활성화해야합니다. "OK"버튼을 사용하여 두 대화 상자를 닫습니다.

다시 시작할 컴퓨터를 수행하십시오. 디버거로로드를 선택하십시오. 시스템에 로그인하고 대상 시스템에서 작업하거나 원격 디버깅을 시작하십시오. 수단을 윈드 빌과 KD로 활용하십시오.

이 일련의 기사는 두 가지 이유로 나타났습니다. 첫째, 나는 프로젝트와 일하는 것을 좋아합니다 HacksySextRemevulnerAbledRiver. ...에 둘째, 나는 가지고있다 대중 소원 이 주제를 비추려면.

이 시리즈를 쓰는 것으로 사용되는 전체 코드는 내 저장소에 있습니다.

이 기사의주기에서는 Windows의 커널 레벨의 악용을 작성하는 것을 고려합니다. 우리는 잘 알려진 취약점을 처리 할 것이며 리버스 엔지니어링에서는 필요가 없습니다 (적어도 드라이버는 필요 없음).

모든 기사를 숙지 한 후에는 가장 일반적인 붐 클래스 및 작동 방법을 알고 있으며 X86 아키텍처에서 X64 아키텍처로 이용할 수 있으며 최신 보호 방법을 읽을 수도 있습니다. 윈도우 10.

스키마 디버깅 커널

사용자 수준에서 디버깅과 달리 별도의 프로세스의 실행이 일시 중단되면 전체 시스템이 커널 레벨에서 활성화 되며이 방법을 사용할 수 없습니다. 따라서 커널이 디버깅 된 시스템과 통신 할 수있는 별도의 디버깅 시스템이 필요하며 커널의 메모리 및 구조를보고 시스템의 색상을 캡처 할 수 있습니다.

연구를위한 추가 자료 :

커널 취약점 작동

이 프로세스는 사용자 레벨 J에서 작동보다 훨씬 재미 있습니다.

주요 목표는 커널의 맥락에서 권한있는 실행을 달성하는 것입니다. 그리고 그런 다음 모든 것이 우리의 상상력에 달려 있으며 국내 맥주와 함께 애완 동물에서 이르기까지 국가가 후원하는 악의 도입으로 끝나는 것입니다.
일반적으로 우리의 작업은 시스템 특권을 가진 쉘을 가져 오는 것입니다.

이주기의 기사의 스레드

  • 1 부 : 작업 환경 설정
    • 디버거로 작동하는 세 가지 가상 컴퓨터 및 시스템 구성.
    • WINDBG 디버거 구성.
  • 2 부 : 유용한 하중
    • 가장 흔한 유익 하중에 대한 연구. 후속 부분에서 특정한 취약성이 고려 될 것이며 필요한 경우이 기사를 참조하십시오.
  • 다른 부분.
    • 취약성을 고려합니다.

핵 수준의 수준의 개발의 수명주기

  • 취약점 찾기...에 이주기는이주기에서는 이미 막대가있는 위치를 이미 알고 있으므로이주기에서는 고려되지 않습니다.
  • 실행의 흐름에 대한 차단...에 일부 취약점은 코드 실행을 제공합니다. 일부는 추가 요구 사항이 있습니다.
  • 특권 확장...에 주요 목표는 시스템 권한이있는 쉘을 얻는 것입니다.
  • 실행 흐름을 복원합니다...에 커널 레벨에서의 비용이없는 예외는 시스템의 붕괴로 이어집니다. DOS 공격에 대한 착취를 쓸 수 없으면이 사실을 고려해야합니다.

대상 시스템의 유형

우리는 다음 시스템의 취약점으로 작업 할 것입니다 (특정 버전은 근본적이지 않습니다).

  • Win7 x86 VM.
  • Win7 x64 VM.
  • Win10 x64 VM.

x86 아키텍처로 시작하고 Win7 x64 시스템에 대한 익스플로잇을 포트 할 것입니다. 일부 악용은 새로운 보호가 있기 때문에 Win10과 함께 기계에서 작동하지 않습니다. 이 경우 우리는 이용 작업의 논리를 변경하거나 완전히 다른 접근법을 사용할 것입니다.

사용 된 소프트웨어 :

  • 하이퍼 바이저 (질량 옵션).
  • Windows 7 x86 VM.
  • Windows 7 x64 VM.
  • Windows 10 x64 VM.

디버깅을위한 시스템 설정

상호 작용할 시스템 디버깅은 취약한 드라이버를 다운로드하기위한 것입니다. 이 기계에서 커널의 대부분의 예외 가이 종류의 현상에 기여하기 때문에 붕괴가 종종 발생합니다. 이러한 시스템에 충분한 RAM을 강조 표시해야합니다.

디버깅 할 각 시스템에서 다음을 수행해야합니다.

  • VirtualKD 디렉토리 안에는 대상 \\ vminstall.exe 파일을 실행하십시오. 새 부트 레코드가 추가되고 디버깅 기능이 사용 가능하며 디버거 역할을하는 시스템에 설치된 VirtualKD 서버에 자동 연결됩니다.

Windows 10 VM의 경우 테스트 서명 모드를 활성화해야하므로 커널에 서명되지 않은 드라이버를 다운로드 할 수 있습니다.

바탕 화면에서 BCDIDITIT / SET 테스트 및 재부팅을 실행 한 후 "테스트 모드"가 나타납니다.

간단한 설명 HEVD 모듈

DriverEntry 절차는 각 드라이버의 시작입니다.

NTStatus DriverEntry (punicode_string RegistryPath에서 PDriver_Object DriverObject에서) (
uint32 i \u003d 0;
pdevice_object deviceObject \u003d null;
ntstatus status \u003d status_unsuccessful;
UNICODE_STRING DEVICENAME, DOSDEVICENAME \u003d (0);

UNREFERENCED_PARAMETER (REGISTRYPATH);
paged_code ();

RTLINITINICESTRING (& DEVICENAME, L "\\\\ DEVICE \\\\ HACKSYSEXTREMEVULNERabledRiver");
RTLINITUNICODESTRING (& DOSDEVICENAME, L "\\\\ DOSDEVICES \\\\ HACKSYSEXTREMEVULNERabledRiver");

// 장치를 만듭니다
상태 \u003d iocreatedevice (DriverObject,
0,
& 장치 이름
file_device_unknown,
file_device_secure_open,
그릇된
& 디바이스 튜브);

  • 이 절차는 통신 중에 사용할 드라이버의 이름을 포함하는 IoCreatedEvice 함수를 호출하는 것으로 구성됩니다.
  • DriverObject 객체는 기능에 원하는 구조와 포인터를 추가합니다.
  • 우리의 경우, DriverObject-\u003e 주요 기능 절차와 관련된 기능 포인터는 IOCTL 처리 (I / O 제어, 입 / 출력 제어)에 중요합니다.
  • HEVD 에서이 기능은 IRPDEVICEIOCTLHandler라고합니다. 이는 각 IOCTL마다 다수의 브랜치가있는 훌륭한 조건식 표현식입니다. 각 취약점에는 고유 한 IOCTL이 있습니다.

예 : hacksys_evd_ioctl_stack_overflow는 스택의 오버플로와 관련된 막대를 활성화하는 데 사용되는 ioctl입니다.

이것은 첫 번째 부분이 끝납니다. 다음 기사에서 우리는 페이로드에 대해 이야기 할 것입니다. 현재, 세 번째 부분에서 사용할 토큰 도난에 유익한 하중 만 사용할 수 있습니다.

추신 나는 많은 미묘함과 당신이 만날 수있는 문제가 있음을 이해합니다. 이 사이클은 악용 개발에 중점을두기 때문에 모든 관련 문제를 직접 해결해야합니다. 그러나, 귀하가 의견을 묻는 모든 질문.

  • 저자 :

    Barinov S., Shevchenko o.g.

  • 년:
  • 자원:

    Informatics and Computer 기술 / 자료 VI 국제 과학 및 기술 회의, 대학원생 및 젊은 과학자 - 2010 년 11 월 23 ~ 25 일, Donetsk, Donntu. - 2010. - 448 p.

주석

사용자 모드의 디버깅의 비교 분석 및 커널 모드가 Microsoft Windows 운영 체제에 적용되며, 분석 및 후자의 디버깅을 구성하는 문제를 해결합니다. 획득 된 결과에 따라 비상 사태 및 대화 형 디버깅 발생시 커널 정권 디버거의 건설에 대한 주요 요건. 기존 솔루션의 분석이 요구 사항을 준수하기 위해 수행되었습니다. 특히 Microsoft Windows 디버거 디버거에 특별한주의가 지불됩니다.

주요 부분

디버깅은 소프트웨어의 오류의 원인을 결정하고 제거하는 프로세스입니다. 일부 프로젝트에서 디버깅은 전체 개발 시간의 50 %를 차지합니다. 디버깅은 지속적으로 개선되는 전문 도구를 사용할 때 크게 단순화 될 수 있습니다. 이러한 주요 도구는 소프트웨어의 구현을 제어하고 그 이동을 조사하고 인터페이스하는 디버거입니다. 커널 디버깅 도구는 운전자 개발자가 주로 사용됩니다.

응용 프로그램 소프트웨어 개발 툴킷은 다양한 기능을 제공합니다. 통합 개발 환경에는 타사 유틸리티를 사용할 필요없이 디버깅 가능성이 포함되어 있습니다. 우리가 전신 소프트웨어와 특히 운전자를 개발하고있는 경우, 특히 개발 프로세스는 매우 어렵고 자동화되지 않습니다. 디버깅을 포함하여 모든 개발 단계는 분리되어 있습니다. 각각의 각각을 수행하기 위해서는 특별한 조건이 필요합니다. 프로그램 코드의 글쓰기는 전면 컴퓨터 시스템에서 수행, 디버깅 시스템에서 디버깅 시스템에서 수행, 테스트, 상황에 따라 테스트합니다. 동일한 커널 정권 디버거는 개발 중에 더 복잡하고 이에 따라 덜 친절합니다.

일반적으로 우리는 핵심 디버깅의 부족에 대해 이야기 할 수 있습니다. 이 수단을 사용할 수 있지만, 종종 대안에 대해 이야기 할 필요가 없습니다. 예를 들어 Microsoft Windows 디버거 디버거에는 너무 높은 항목 임계 값이 있습니다. 많은 프로그래머가 그를 만날 때 첫 번째 부정적인 경험에 대해 이야기하며 대부분의 가능성은 대부분이 태어났습니다.

결과적으로 응용 프로그램에서 오류가 발생하면 응용 프로그램이 임의의 메모리 위치에 데이터를 녹화하면 응용 프로그램이 자체 메모리 만 손상되고 다른 작업의 작동에 영향을 미치지 않습니다. 응용 프로그램 및 운영 체제. 핵심 모드 코드는 필연적으로 공통적 인 실패로 이어질 수있는 운영 체제의 중요한 데이터 구조를 손상시킬 수 있습니다. 비효율적이지 않게 서면 운전자는 전체 운영 체제의 심각한 분해를 일으킬 수 있습니다.

    현대 디버거는 다음과 같은 기본 기능을 제공합니다.
  • 소스 코드 수준에서 디버깅;
  • 실행 관리;
  • 메모리보기 및 변경;
  • 프로세서 레지스터의 내용을보고 변경하십시오.
  • 통화 스택을 봅니다.

해체 코드로 작업을 용이하게하기 위해 소위가 사용됩니다. 문자 디버깅. 링커의 작업 중에 실행 파일의 이미지 외에도 프로그램을 실행할 때 필요하지 않은 정보를 포함하는 데이터 파일을 생성 할 수도 있지만 디버깅 할 때 매우 유용합니다. 기능의 이름, 글로벌 이름 변수, 구조에 대한 설명. 디버깅 문자는 모든 실행 파일 운영 체제 파일에 사용할 수 있습니다.

실행 제어 하에서 프로그램 코드에서 지정된 명령을 달성하기 위해 프로그램 코드의 실행을 방해하고 갱신하는 기능을 의미합니다. 단계별 모드에서 프로그램 코드가 실행되는 경우 각 프로그래밍 언어 렉 테 또는 서브 루틴을 종료 할 때 인터럽트가 발생합니다. 무료 실행을 사용하면 실행 중단이 중지 점이 설치된 코드의 고급 섹션에서 실행됩니다.

코어 모드 코드를 방해 할 때 다음 딜레마가 발생합니다. 프로그래머와 상호 작용하는 디버거는 사용자 인터페이스를 사용합니다. 그. 최소한 디버거의 보이는 부분은 사용자 모드에서 수행되며 자연스럽게 응용 프로그램 프로그래밍 인터페이스 (Windows API)를 사용하므로 커널 모드 모듈에 차례로 설정됩니다. 따라서, 코어 모드 코드의 서스펜션은 상호 차단을 이끌 수있다 : 시스템은 사용자 요청에 응답하지 않을 것이다.

커널의 메모리에 액세스하려면 디버거의 구성 요소도 커널 모드에서 수행되어야합니다. 이는 보호 프로세서 모드에서 메모리 조직의 분명한 결과 인 한 번에 두 가지 문제가 발생하는 것으로 이어집니다.

첫 번째 문제는 가상 메모리 주소의 방송에 관한 것입니다. 드라이버는 사용자가 메모리에 대한 액세스를 추가하여 사용자 정권 응용 프로그램과 끊임없이 상호 작용합니다. Windows 운영 체제는 스트림 컨텍스트의 개념에 의해 가이드, 가상 주소를 실제로 안내합니다. 스트림 컨텍스트는 스트림 상태를 반영하고 특히 레지스터 세트 및 다른 정보를 포함하는 구조입니다. 컨트롤이 다른 스트림으로 전송되면 하나의 스트림에 대한 정보가 저장되고 다른 스트림에 대한 정보가 복원되는 컨텍스트 스위치가 발생합니다. 스트림 컨텍스트를 다른 프로세스의 스트림으로 전환하면 가상 주소를 물리적으로 브로드 캐스트하는 데 사용되는 페이지 디렉토리도 전환됩니다.

특성은 시스템을 불러 일으킬 때 Windows 운영 체제가 컨텍스트를 전환하지 않는다는 것입니다. 이로 인해 커널 모드 코드는 사용자 모드의 가상 주소를 사용할 수 있습니다.

그렇지 않으면 상황이 방해되거나 시스템 스레드를 수행 할 때입니다. 인터럽트는 언제든지 발생할 수 있으므로 스트림의 어떤 컨텍스트가 사용되는지 예측하는 것은 불가능합니다. 전신 스트림은 모든 프로세스에 속하지 않으며 사용자 모드의 가상 주소를 방송 할 수 없습니다. 여기에서 이러한 상황에서는 사용자 정권의 메모리를 참조하는 것이 불가능합니다.

두 번째 문제는 움직일 수있는 메모리에 호소하는 것입니다. 메모리의 대부분의 정보는 이동 된이고 언제든지 실제 메모리에서 페이지 파일의 하드 디스크로 이동할 수 있습니다. 실제 메모리에 결석하는 페이지를 참조하면 정상적인 상황에서 프로세서는 메모리 관리자의 메모리의 중단을 생성하고 결과적으로 페이지 파일에서 페이지를 읽고로드됩니다. 물리적 메모리.

디버거의 프로그램 코드가 높은 수준의 인터럽트 쿼리 (인터럽트 요청 레벨, IRQL)를 사용해야하는 경우 설명 된 동작이 위반됩니다. iRQL 메모리 관리자와 일치하거나 일치하는 IRQL을 사용하면 레이디가 누락 된 페이지를로드 할 수 없습니다. 운영 체제는 인터럽트 페이지 오류를 차단합니다. 이렇게하면 운영 체제의 붕괴가 발생합니다.

디버깅은 대화식 및 비상 사태를 위해 허용됩니다. 대화 형 로컬 디버깅을 사용하면 디버거가 디버그 오브젝트와 동일한 시스템에서 수행됩니다. 대화식 원격 디버깅을 사용하면 디버거와 디버그 객체가 다른 시스템에서 수행됩니다. 커널 코드를 디버깅 할 때 네트워크가 아직 작동하지 않으므로 다운로드의 첫 번째 단계부터 시스템을 모니터링해야하므로 COM, FireWire, USB와 같은 간단한 직렬 인터페이스가 시스템을 전달하는 데 사용됩니다. 최근 추상화 수준에서 소프트웨어 가상화 개발의 추세로 인해 가상 컴퓨터가 점점 끌 수 없습니다. Guestide OS Debugged 역시 Debugger의 사용자 인터페이스가 포함되어 있습니다.

따라서 응급 디버깅을 위해 테스트 컴퓨터에 디버깅 도구를 설치할 필요가 없습니다. Windows 운영 체제 배포에는 비상 디버깅 구현 메커니즘이 포함됩니다. 재부팅하기 전에 운영 체제는 개발자가 분석하고 원인을 찾을 수있는 상태에 대한 정보를 저장할 수 있습니다. 파일에 저장된이 정보를 메모리 덤프라고합니다.

기본 코어 모드 디버깅 수단은 Windows 패키지 용 무료 디버깅 도구의 프레임 워크 내에서 Windows 운영 체제 제조업체에서 제공합니다. 도구에는 Windbg 및 KD의 그래픽 및 콘솔 장치가 각각 (이하 Windows 디버거)를 포함합니다. 이러한 디버거의 작업은 운영 체제 개발자가 제공 한 메커니즘을 기반으로하며 커널에 누워 있습니다.

Windows 디버거의 메인 모드는 명령 인터프리터 모드입니다. 모듈 형 구조로 인해 제공된 개발자와 함께 Windows Debugger 명령은 확장 프로그램이라는 타사 모듈을 지원합니다. 사실, 대부분의 임베디드 명령은 확장 형식으로 장식되어 있습니다.

Windows 디버거는 모든 기능을 사용할 때 원격 대화 형 및 응급 디버깅에 중점을 둡니다. 동시에, 본격적인 지역 대화 형 디버깅이 지원되지 않습니다. 디버거를 사용하면 일부 커널 구조를 볼 수 있습니다.

Mark Russinianovich가 만든 Livekd라는 Windows 디버거를위한 확장 모듈이 있으며, 일부 감각으로 지역 대화 형 디버깅을 구현합니다. Go에서 LiveKD는 작업 시스템 메모리 덤프를 만들고 디버깅을 위해 사용합니다.

"Windows 용 디버깅 도구"도구는 정기적으로 업데이트되고 모든 현대 Windows 운영 체제를 지원합니다.

DriverStudio 소프트웨어 패키지의 Compuware가 제작 한 Softice Kernel Debugger는 전통적으로 "Windows 디버깅 도구"패키지의 대안을 수행했습니다. Softice의 특징은 지원되는 하드웨어에서 로컬 대화 형 디버깅을 구현했습니다. 디버거는 거의 운영 체제의 작동을 거의 완전히 제어 할 수 있습니다.

2006 년 4 월 3 일부터 DriverStudio 가족 제품의 판매는 "시장의 일반적인 현황뿐만 아니라 많은 기술 및 비즈니스 문제로 인해 중단되었습니다." 운영 체제의 마지막 버전은 Windows XP 서비스 팩 2입니다. 규칙으로서 서비스 업데이트는 운영 체제 응용 프로그램 인터페이스를 변경하지 않지만 시스템 호출 번호 및 기타 서류 미비의 정보 수는 변화. Softice 디버거는 내부 데이터 구조의 엄격하게 규정 된 주소에 의존했습니다. 결과적으로 서비스 팩 3 호환성의 유지 보수가 손상되었습니다. 분명히 Windows 운영 체제의보다 나중에 더 나중에 버전이 지원되지 않습니다.

Syser 커널 디버거는 Softice 디버거를 대체하여 소규모 중국 회사 Sysersoft로 작성했습니다. 최초의 최종 버전은 2007 년에 출시되었습니다. Softice와 마찬가지로 Syser Kernel Debugger는 운영 체제에서 대화식 디버깅을 수행 할 수 있습니다. 지원되는 Windows의 최신 버전의 32 비트 버전 만 있습니다.

현재 Windows 디버거는 커널 모듈 개발자 중 주요 도구입니다. 또한 Windows 운영 체제 핵심 개발 팀을 사용합니다.

디버거 - 컴파일러 이후의 두 번째 프로그램은 프로그램을 만드는 데 필요합니다. 그러나 컴퓨터 프로그램을 작성하고 디버거를 사용하는 많은 사람들 중 많은 사람들이 그 작업의 원칙과 메커니즘을 알지 못합니다.


디버거가되기 어렵습니다 ...

프로그래머가 디버거 저녁 식사와 NOSNO를 사용한다는 사실에 비추어 특히 깊은 디버그 모드로 들어가면 디버거가 프로그램이 아닌 경우, 철분이 아니라면, 그는 반드시 과열되고 파산되었을 것입니다. ...에 너무 많은 일이므로 디버거가 얼마나 사라지는지, 컴파일러도 가지고 있지 않습니다.

물론, 이제는 모든 다른 프로그래밍 언어 중 많은 사람들이 그 다음 각자의 디버거를 자신의 것에 대한 디버거입니다. 그리고 자연적으로 이러한 언어의 여러 범주에 대해 디버거의 작업에 차이가 있습니다. 예를 들어 해석 할 수있는 루비의 프로그램 디버거는 바이트 코드로 컴파일 된 Java 언어와 디버거와 다르게 작동합니다. Java의 경우 디버거 Visual C ++에서 차이가 있습니다.

Windows 플랫폼의 디버깅에 대해 이야기 할 것입니다. 그녀를 위해 디버이거의 작품의 원칙을 실현하면서 POSIX 시스템에서 디버거를 다루는 것이 가능하며 운영 체제의 수준에서 작동하지 않는 디버거와 함께 있지만 가상 컴퓨터 또는 모든 통역사의 수준에서 ...에


Windows 용 디버거 : 두 가지 유형

Windows에서는 근본적으로 두 가지 유형의 디버거가 있습니다. 나는 델파이 (프로그래밍되지 않은 것)에 프로그래밍 될 때 모든 것이 모든 것에 직면했다. 이들은 디버거 사용자 정의 응용 프로그램입니다. 그들은 꽤 많은 부분이며, 개별적으로 (특히, 종종 방식, 종종) 통합 응용 프로그램 개발 환경의 일부로 존재합니다. 분리 된 소프트웨어 제품으로 분포 된 디버거 중에는 전통적으로 OllyDBG를 할당하고 한 번 "컴퓨터 웨스리"에서 그것에 대해 썼습니다.

두 번째 유형의 디버거는 운영 체제의 핵심 디버거입니다. 그들은 만나고 자주 자주 사용되며 장치로 디버거 사용자 응용 프로그램과 크게 다릅니다. 가장 유명하며 동시에 최고의 코어 디버거는 Softice입니다. 아마도 당신은 그를 들었을뿐만 아니라 심지어 사용했습니다.

두 가지 유형의 디버거 각각의 작업은 자체 특성을 가지고 있기 때문에, 나는 각자에 대해 당신에게 말할 것입니다.


디버거 사용자 응용 프로그램

검정색과 더러운 작업이 운영 체제를 사용하기 때문에 사용자 정의 응용 프로그램의 디버거가 간단합니다. Windows에는 사용자 수준 응용 프로그램을 디버깅하도록 설계된 특수 소프트웨어 인터페이스가 있습니다. 이들은 Windows 디버깅 API라고합니다. Windows 용 대중 통합 개발 환경에 임베드 된 모든 디버거가 사용하는 API 디버깅입니다.

디버깅 시작을 위해 디버거는 디버깅 된 프로세스를 특별히 시작해야합니다. 따라서이 프로세스가 디버깅하에 있음을 알 수 있도록 시스템이 알고 있습니다. 그 후, 디버그주기가 시작됩니다. 프로그램은 디버그 이벤트 또는 디버그 이벤트라고하는 특정 이벤트의 시작 전에 실행됩니다. 이 경우 디버그 사이클은 디버거가 매달려 방지하기 위해 별도의 스트림에서 시작됩니다.

그러나 이것은 단지 시작 일뿐입니다. 디버깅 이벤트가 발생했을 때 디버거 작업에서 가장 흥미로운 점이 시작되기 때문입니다. 결국, 사실, 디버거의 일은 무엇입니까? 프로그래머가 특정 기능에 대한 정확도로 오류를 현지화하는 데 도움이되는 특정 변수입니다. 이 하드 케이스에서 디버거는 운영 체제를 도울 수 있습니다.

따라서 디버깅 이벤트가 발생한 후에는 어떻게 든 프로그램의 텍스트와 관련이 있는지 알아야합니다. 이는 프로그램 자체에서 특별한 디버그 정보가 활성화 된 경우에만 가능합니다. 디버깅 문자 탭입니다. 여기에는 주소와 기능의 기능, 데이터 유형, 코드 행 수의 규정 준수에 대한 정보가 들어 있습니다. 그 덕분에 각 Windows 프로그래머가 익숙한 디버깅입니다. 기호 테이블에는 다른 형식이 있으므로 다른 제조업체의 디버거를 사용하여 단일 개발자의 컴파일러에서 컴파일하게 된 프로그램을 디버깅 할 수있는 것은 아닙니다. 그러나 가장 일반적인 형식을 여전히 지정할 수 있습니다. 이는 PDB (Program Database)이며 자연스럽게 Microsoft Corporation을 설계했습니다.

따라서 디버그 테이블에 PDB 형식이있는 경우 Microsoft Corporation - 기호 디버깅 프로세서의 특수 도구를 사용할 수 있습니다. 일단 그가 시스템의 핵심을 입력하고 ImageHlp.dll이라고했지만 오래 전에 별도의 라이브러리에서 강조 표시되었습니다. 심볼 프로세서를 사용하면 가장 가까운 열린 기능 또는 전역 변수뿐만 아니라 문자열의 수와이 라인이있는 소스 텍스트 파일의 이름을 찾을 수 있습니다. 반전 작업은 예를 들어 주소 주소를 이름으로 검색합니다.

물론 디버거가 사용자 정의 응용 프로그램에 종사하는 모든 작업이 아닙니다. 예를 들어, 멀티 스레드 응용 프로그램을 디버깅 할 때 흐름의 상호 작용과 관련된 많은 매우 미묘한 순간이 나타납니다. 이러한 서비스와 같은 비교적 단순한 것들을 디버깅 할 때조차도 뉘앙스가 있습니다.

그러나 뉘앙스에서 우리는 끝에서 멈추지 않을 것입니다 - 기사의 끝에서 그들에 대해 어디에 읽을지 말씀 드릴 것입니다. 이제 커널 디버거를 살펴 보겠습니다.


핵 디버거

핵심 디버거 - 프로그램은 사용자 응용 프로그램의 디버거보다 훨씬 더 복잡해지고, 왜 분명히 밝혀졌습니다. 운영 체제의 형태로 도우미가 없습니다. 이 경우 궁극적으로 그녀가 궁극적으로 디버그하기 때문에 클라이언트입니다.

대부분의 커널 디버거에는 제로 모뎀 케이블로 연결된 작업에 연결된 두 대의 컴퓨터가 필요합니다. 제로 모뎀은 COM 또는 LTP 포트를 통해 두 컴퓨터를 직접 케이블 연결하는 방법입니다. 디버거의 일부가 첫 번째 (부채 시스템이 설치된 경우), 하드웨어에 대한 액세스가 제한되어 있으므로 데이터의 전체 출력이 두 번째 컴퓨터에 제한되어 있기 때문에 두 번째 컴퓨터가 필요합니다.

Intel x86 아키텍처의 현대 프로세서에서는 특별한 디버그 레지스터 (그리고 오래된 368 번째로, 그들의 최신 프로세서의 최신 모델에서는 DR0-DR7라고도합니다)가 있습니다. 이러한 레지스터는 디버거가 I / O 포트뿐만 아니라 메모리를 읽고 녹음하기위한 검사 점을 설정할 수 있습니다. 일반적으로 모든 것이 이렇게 보입니다. 디버그 레지스터가 책임지는 인터럽트가 중단 점에 의해 구현되고 다른 유사한 정보를 제공하는 데 필요한 디버그 레지스터가 책임지고있는 것은 자세히 기록 할 가치가 있다고 생각하지 않습니다. Windows 용 커널의 특정 기존 Bookbugs에 대해 알리는 것이 좋습니다.

글쎄, 먼저, 이것은 운영 체제의 커널에 내장 된 디버거입니다. Windows 2000부터 시작하는 모든 OS NT 통치자에 있습니다. 이는 ntoskrnl.exe 파일의 일부이며 Boot.ini의 운영 체제에 대한 "/ debug"옵션을 설정하여 활성화 할 수 있습니다. 이 디버거는 Zero-Modem 연결이 필요하고 동일한 OS가있는 두 번째 컴퓨터가 필요합니다.

Microsoft - Windbg의 다른 커널 디버거가 있습니다. 엄밀히 말하면, 이것은 커널 디버거가 아니라 사용자 수준의 응용 프로그램을 디버깅하는 데 사용할 수있는 하이브리드 디버거입니다. 그는 코어에 내장 된 디버거와 달리 그래픽 쉘을 가지고 있으므로 사용하는 것이 더 쉽습니다. 이 디버거는 디버그 작업을 해결할 때 유용 할 수있는 특수 확장을 지원합니다. 그러나 두 컴퓨터가 커널을 디버깅해야합니다.

그러나 단일 컴퓨터에서 디버깅 할 수있는 커널 디버거가 있습니다. 이것은 softice입니다. 동시에 Softice는 디버깅 및 응용 프로그램을 지원할 수 있습니다. 예를 들어 시스템 타이머에 연결된 실시간 시스템을 디버깅하는 경우 예를 들어 사용자 프로그램 용이 디버거를 사용하는 것이 정당화됩니다. 일반 디버거를 사용하여 디버깅을 해결하면 프로그램이 올바르게 작동하더라도 결과가 잘못 될 수 있으며 Softice가 프로그램과 타이머를 중지합니다. 이것은 멀티 스레드 응용 프로그램을 디버깅 할 때 유용합니다. 모든 시간에 Softice는 시스템의 모든 흐름에 대한 정보를 출력하는 매우 잘 발달 된 수단, 다중 스레드 애플리케이션의 스트림 동기화, "AH ...이 디버거의 유일한 마이너스 응용 프로그램 프로그래머의 복잡성이 있습니다. 그러나 핵심 디버거에서 가장 쉽고 효과적입니다.


가장 귀여워

물론 Windows 응용 프로그램 용 디버거에 대한 대화는 10 년 전과 관련이 아닙니다. 전 세계는 인터넷에 관심이 있었으며, Softice의 주요 사용자는 Niva 불법 복제에 지칠 수없는 노동자가되었습니다. 그럼에도 불구하고 그렇게 나쁘지는 않습니다. Softice "OM, 의심의 여지없이 컴퓨터에 대한 지식 측면에서 사람을 개발하지만, 물론 디버거와 함께 통신하고 살아있는 사람들과 의사 소통하지 않으면 일부 부작용이 가능합니다. 글쎄, 그것에 대해, 나는 그것에 대해, 나는 그것에 대해 생각한다. 모두가 추측하고 있습니다.

디버거는 가장 특이한 유형의 소프트웨어 중 하나이지만 개발 측면에서 사용자 수준 디버거조차도 매우 복잡합니다. 그럼에도 불구하고, 자신의 디버거를 개발하기 위해 욕망과 시간이 있으면 운영 체제 및 프로그래밍 분야의 지식이 크게 증가 할 것이므로 고도로 유료 작업의 가능성이 증가합니다.

그래서, 자신의 디버거를 만들려면 먼저이 주제에 대한 자료에 익숙해야합니다. 제 의견으로는 처음에 가장 좋은 수당은 존 Robbins "디버깅 Windows 응용 프로그램"의 책이 될 것입니다. 그녀는 이미 옛날, 2001 년 판 이었지만, 그것에 명시된 정보는 관련이 있으며, 어떤면에서도 근본적인 성격이있는 경우에도 공통점이 있기 때문입니다. 이 책에서는 Windows 용 디버거를 작성하는 예가 있습니다. 또한 C ++에서 프로그래밍하고 예외 처리를 더 잘 알아 내려고하는 것이 좋습니다. 사실,이 책은 기사에 명시된 디버거에 대해 배웠습니다. 이 책을 찾으면 (결국, 그것은 이미 꽤 오래되었다), 편리하게 할 수있는 몇 가지 주소가 있습니다. 첫 번째는 다음과 같습니다. www.xakep.ru/post/19158/default.asp입니다. 잡지 "해커"의이 기사는 내가 한 것보다 커널 디버거에 대한 자세한 내용을 알려줍니다. 또한 가장 단순한 디버거의 코드가 들어 있습니다. 그리고 kalashnikoff.ru/assembler/issues/016.htm에서 DOS 디버거를 작성하는 방법을 배울 수 있습니다. 그러나 물론 MSDN을 읽고 동시에 오픈 소스 텍스트가있는 디버거를 동시에 찾는 것이 가장 좋습니다. 물론, 당신이 디버거를 쓰러왔다면,이 열심히 당신에게 당신에게 성공했다면!

커널을 결정하려면 0 모뎀 케이블 또는 모뎀 연결을 사용하여 컴퓨터에 연결해야합니다. 디버그 컴퓨터가 "호스트"라고하며 이름 "대상"이라는 이름은 문제가 발생합니다.

두 컴퓨터는 동일한 버전의 Windows를 실행하고 대상 컴퓨터의 문자 파일을 호스트 컴퓨터에 설치해야합니다. 기호 파일은 지원 \\ Debug 디렉토리에있는 Windows 설치 CD에서 제공됩니다.

디버깅을 사용하려면 대상 컴퓨터에서 boot.ini 파일을 변경해야합니다.

1. boot.ini 파일 속성을 변경하십시오.

attrib c : \\ boot.ini - R - S.

2. 이 파일을 편집하고 Windows 시작 문자열에서 / debug 매개 변수를 추가하십시오 (Windows 부팅시 커널 디버거 운영 메모리를 다운로드하기위한 시스템을 제공하기 위해). 추가 매개 변수는 시스템을보고하는 COM 포트 (기본 COM2) 및 / BaudRate - 데이터 전송 속도 (19200 년의 기본 속도를 지정하지만 9600를 사용하는 것이 좋습니다)를 지정하는 시스템을보고합니다. 예 :


multi (0) 디스크 (0) rdisk (0) 파티션 (0) \\ WINDOWS \u003d "WINDOWS NT"/ DEBUG / DEBUGPORT \u003d COM2 / BAUDRATE \u003d 9600

3. 파일을 저장하십시오.

4. 이전 boot.ini 파일 속성을 설치하십시오.

attrib c : \\ boot.ini + R + S.

이 예에서 대상 컴퓨터는 9600 비트 / s의 속도로 COM2 포트를 통해 연결을 허용했습니다.

호스트 컴퓨터는 디버깅에 필요한 매개 변수를 사용하여 구성해야합니다. 또한 기호 파일을 설치해야합니다. 설치하려면 설치 CD의 \\ Support \\ Debug 디렉토리로 이동하여 다음 명령을 입력하십시오.

expndsym. : <целевой диск и каталог>

예 :

expndsym F : D : \\ 기호

설치 시간이 좀 걸릴 수 있습니다. 업데이트 패키지가 대상 컴퓨터에 설치되어 있으면 이러한 패키지 문자 파일도 호스트 컴퓨터에 설치해야합니다. 업데이트 패키지를위한 기호 파일은 Microsoft의 사이트에서 다운로드 할 수 있습니다.

다음 단계는 디버깅에 필요한 환경 변수를 구성하는 것입니다. 예를 들어 기호 파일의 위치 등을 나타내는 변수 등 다음은 이러한 변수에 대한 설명입니다.

전신 변수에 대한 설명

이러한 변수의 정의는 각 다운로드와 함께 해당 명령을 입력하지 않으려면 명령 파일에 배치 할 수 있습니다.

에코 끄기
설정 _nt_debug_port \u003d COM2.
설정 _nt_debug_baud_rate \u003d 9600
설정 _nt_symbol_path \u003d D : \\ 기호 \\ i386.
설정 _nt_log_file_open \u003d d : \\ debug \\ logs \\ debug.log

이제 지원 \\ 디버그 디렉토리에있는 핵심 디버그 소프트웨어를 복사해야합니다.<процессор> 설치 CD (지원 \\ Debug \\ I386)에서. 전체 디렉토리를 복사하는 가장 쉬운 방법은 크기가 작습니다 (약 2.5MB). i386 플랫폼의 경우, 디버거가 사용되며, 이는 i386kd.exe 파일로 제공됩니다. 디버거는 i386kd 명령을 사용하여 시작됩니다. 명령을 입력하려면 키 조합을 클릭하십시오 KD\u003e 명령 줄 초대가 나타날 때까지 기다리십시오.

공유