2016-11-27 2 views
3

일부 조커 (BIOS/DOS/TSR ...)가 인터럽트 벡터 테이블에 임의의 데이터를 기록했습니다. 해체가 나에게 그렇게 말했기 때문에 나는 이것을 안다.무료 인터럽트 슬롯을 찾습니다.

일반적으로 인터럽트 벡터를 점유하기 전에 선택한 IVT 슬롯이 비어 있는지 확인합니다. 그러나 모든이 왼쪽 - 뒤에 데이터과 함께, 겸허 한 응용 프로그램은 그럼에도 불구하고 특정 인터럽트 벡터를 연결하는 것이 안전하다는 것을 어떻게 알 수 있습니까?

내 프로그래머 참조

나는 그것이 관심 생각하지 않는다

"안전하게 지정된 인터럽트 핸들러를 가리 키도록 인터럽트 벡터를 수정"로 DOS 기능 25H SetInterruptVector을 설명하지만 이 기존의 가짜 콘텐츠에 대해 너무 많이. 지금까지 의 경우 안전하게!


인터럽트 벡터가 무료라는 확실한 방법이 있습니까?

+1

"안전하게"한다는 것은 벡터가 업데이트되는 동안 인터럽트가 발생하지 않도록하는 것입니다. 나머지 질문에 대한 대답은 거의 확실합니다 : No. –

+0

멀티 플렉스 인터럽트 (2Fh) 또는 대체 멀티 플렉스 인터럽트 (AMIS, 2Dh)를 사용할 수 있습니다. 그러나 BIOS와 MS-DOS가 사용하는 것으로 문서화되어 있지 않은 임의의 인터럽트를 선택할 수도 있습니다. TSR을 실제로 실행하는 경우 사용자가 선택한 인터럽트를 사용하고 있는지 파악하기가 어렵지 않습니다. 그냥 벡터를 덮어 쓰고 무엇인가가 깨지는 지 확인하십시오. –

답변

5

아니요, 벡터가 무료인지를 확인하는 독창적 인 확실한 방법은 없습니다.

이것은 가능한 모든 인터럽트 값이 유효한 값일 수 있기 때문입니다.

일부 값이 유효 아직 매우 의심스러운 될 수 있습니다 :

  • 0ffffh :이 유효 할 수있다 0ffffh (마스킹 A20와 0ffefh 가리키는).
  • 0000h : 0000h은 벡터 0에서도 유효합니다. 값이 0 인 DWORD는 유효한 add [bx+si], al 쌍으로 디코딩됩니다.
  • 0b800h : 0000h 및 기타 유사한 ROM 주소는 확장 ROM이 코드를 전달하는 데 사용될 수 있으므로 유효 할 수 있습니다. 표준 비디오 메모리는 없을 것 같지만.
  • (E) BDA와 같이 예약 된 BIOS 영역의 주소는 데이터가 유효한 코드와 유효한 정보로 특수 제작 된 경우 이론적으로 유효 할 수 있습니다.

물론 위의 코드 중 일부는 매우 확장되어 있고 코드로 실행되는 데이터가 포함되어 있지만 벡터 포인터를 신뢰하면 안되는 주된 이유는 BIOS가 모든 벡터 슬롯을 적어도 더미 ISR .
의도하지 않은 악의적으로 제작 된 int 명령이 시스템에 걸리게하지 않습니다.


은 몇 가지 당신이 할 수 있습니다 :

  1. 는하지 과밀 인터럽트 번호 N을 선택
    체이닝.AH = d0-ff과 같이 입력 값 집합을 가져 오지 않았습니다. ISR을 N에 연결하고 값으로 처리하고 다른 입력을 이전 ISR에 위임하십시오.
  2. 특정 플랫폼을 목표로합니다.
    int EA과 같은 일부 인터럽트 벡터는 특정 시스템에서만 사용됩니다. 대부분의 시스템이 사라 졌으므로 인터럽트를 다시 사용할 수 있습니다.
    당신이 인터럽트 벡터를 훔쳐도 모든 것이 계속 작동하고 아무도 불평하지 않는다면, 그것은 당신의 인터럽트입니다. 구내를 두 번 확인하십시오.
  3. 사용은 Int 2F과 그 변형 Int 2D에서 Alternate Multiplex Interrupt Specification (AMIS) 공유/다중 인터럽트로 사용할 수 있습니다 2 층
    중단.
    그러나 AMIS는 많은 인기를 얻었습니다.

  4. 봅니다 빈 공간 당신, 그들은 가능성이 빈 슬롯입니다 이론에서 유효 불구하고, IVT의 1 null 항목을 검색하려고 할 수 있습니다 첫 번째 시도로 어쨌든
    를 찾을 수 있습니다.
    ISR이 벡터 번호를 쉽게 식별 할 수 없으므로 더미 ISR이 있음을 제안하는 것보다 더 많이 나타나는 포인터를 찾으려고 할 수도 있습니다.

나는 n으로 갈 것입니다. 1 개인적으로 불가능하다면 n을 구현할 것입니다. 3. 가능하지 않다면 n.4로 폴백을 사용합니다. 모든 "의심스러운"값을 잡기 2.


1 실용적이지 만, 약간의 이득을주고, 그래서 그냥 큰 것들에 대한 쏠 것입니다.

+0

0000 : 0000의 벡터는 실제로 유효하지 않습니다. 그것은 명령으로 해석되지 않습니다. 벡터에 이미 유효한 인터럽트 핸들러가 없으면 체인이 작동하지 않으므로 체인이 있는지 여부를 확인하지 않아도됩니다. –

+0

이전에 * AMIS *를 사용하여 큰 오버 헤드가 있음을 발견했습니다. * 체인 연결 *은 훨씬 간단합니다. 나는 이것을 탐구 할 것이다. 나는 특히 감정적 인 이유로 B1h 인터럽트를 사용하기를 원하기 때문에, 나는 필요한 것을 압수하는 더 위험한 무차별 방식으로 남아 있다고 생각한다. 또는 나는 감정적 인 것을 멈출 수 있었다! –

+2

일부 인터럽트 벡터는 코드가 아니라 데이터를 가리킨다는 것을 잊지 마십시오. 물론 그들은 int xx 명령어를 통해 호출 될 수 없지만 BIOS는 특정 데이터 영역을 가리킨다는 사실에 의존합니다. –