트레이스 벡터 디코더
Trace vector decoderTrace Vector Decoder(TVD; 트레이스 벡터 디코더)는 기본 마이크로프로세서의 트레이스 기능을 사용하여 암호화된 명령어 opcode를 실행 전에 적시에 디코딩하고 나중에 다시 인코딩하는 컴퓨터 소프트웨어입니다.전체 복사 방지 전략의 일환으로 소프트웨어 크래킹을 방지하려고 할 때 리버스 엔지니어링을 방해하기 위해 사용할 수 있습니다.
마이크로프로세서 트레이스
특정 마이크로프로세서 패밀리(680x0, x86)는 프로그램 개발에 도움이 되는 명령을 추적하는 기능을 제공합니다.디버거는 이 기능을 사용하여 프로그램을 통해 단일 단계를 수행하여 프로그래머가 테스트 대상 프로그램의 실행을 감시할 수 있는 수단을 제공할 수 있습니다.
트레이스 예외용 커스텀 핸들러를 설치하는 것으로, 통상의 프로그램 플로우 명령의 실행간에 마이크로프로세서를 제어할 수 있다.일반적인 트레이스 벡터 디코더 예외 핸들러는 예외 외부에 위치한 다음 명령을 디코딩할 뿐만 아니라 이전에 디코딩된 명령을 다시 인코딩합니다.
실장
모토로라 680x0
Motorola 68000에는 명령별 추적 [1]기능이 있습니다.트레이스 상태가 유효하게 되어 있는 경우, 프로세서는 각(비예외) 명령이 실행된 후에 트레이스 예외를 자동적으로 강제합니다.다음 어셈블리 코드 스니펫은 68000 시스템에서 트레이스 예외 핸들러를 초기화하는 프로그램의 예입니다.
Install Handler: 이동 #$4E730000,-(SP) ; 트레이스 예외 핸들러를 스택에 푸시합니다. 이동 #$00000010,-(SP) 이동 #$0004DDB9,-(SP) 이동 #$BD96BDAE,-(SP) 이동 #$B386B586,-(SP) 이동 #$D046D246,-(SP) 이동 #$0246A71F,-(SP) 이동 #$00023C17,-(SP) 이동 #$2C6F,-(SP) 이동 SP,($24).w ; 트레이스 예외 핸들러 벡터 설정 오리 #$A71F,SR ; 트레이스 상태를 유효하게 합니다. NOP ; CPU는 이 NOP를 실행한 후에 트레이스 예외를 생성합니다. ;------------------------ ... ; 이 회선의 코드는 암호화됩니다. 다음으로 스택에 로드된 위의 트레이스 예외 핸들러의 디스어셈블리를 나타냅니다.이 핸들러의 목적은 추적된 암호화된 코드를 난독화하는 것입니다.복호화 프로세스는 상태 코드 레지스터(CCR)의 내용에 영향을 받습니다.예를 들어, 메인 프로그램의 산술 연산에 의해 결과적으로 0이 되면 CCR에 제로 플래그 비트가 설정됩니다.그러면 트레이스 예외 핸들러에서 (SP)의 값이 변경됩니다.
트레이스 핸들러: 이동 (2,SP),A6 ; 슈퍼바이저 스택으로부터의 반환 주소 로드 이동 (SP),D6 ; 메인 프로그램의 상태 코드 로드 AND.W #$A71F,D6 추가.W D6,D0 추가.W D6,D1 EOR.L D1,D6 EOR.L D2,D6 EOR.L D6,(A6) ; 8바이트 선행 디코딩(메인) EOR.L D6,(4,A6) RTE ; 예외로부터의 복귀 인텔 x86
x86 CPU는 각 명령 실행 후 인터럽트를 생성하는 추적 플래그를 제공합니다.다음 어셈블리 코드는 8086 시스템에서 구현되는 방법의 예입니다.
; 트레이스 핸들러를 설정하는 것부터 시작합니다. Install Handler: xor bx, bx ; clear bx (0으로 이동하지 않고 bx 움직이다 es, bx ; 현재 ES 시작은 0x00000 입니다. 움직이다 단어 ptr es:[1*4], 오프셋 트레이스 핸들러 ; IVT 엔트리1에 핸들러의 주소 오프셋을 기입합니다. 움직이다 단어 ptr es:[1*4 + 2], cs ; IVT 엔트리 1에 현재 코드 세그먼트를 씁니다. ; 트레이스 트랩을 켜다 푸시 ; FLAGS를 스택에 푸시합니다. 팝 도끼 ; 이전에 읽은 FLAGS를 AX에 팝합니다. 또는 아., 1 ; 비트 0을 1로 ORing으로 설정합니다. 밀다 도끼 ; 변경된 플래그를 스택에 푸시합니다. 팝 ; 이제 FLAGS에 트레이스 플래그를 설정했습니다. 하지 않다 ;------------------------ ... ; 이 회선의 코드는 암호화됩니다. 다음으로 관련된 트레이스 인터럽트 핸들러의 디스어셈블리를 나타냅니다.
트레이스 핸들러: 밀다 bp 움직이다 bp, sp ; 반송주소에 대한 접근권 획득 밀다 bx 밀다 ds ; DS:BX의 반송 주소 lds bx, 2[bp] ; 다음 명령의 opcode 포인터 움직이다 bx, [bx] ; 현재 명령의 opcode를 가져옵니다. ... ; opcode를 디코딩합니다. 팝 ds 팝 bx 팝 bp 인식하다 ; 인터럽트로부터의 복귀 예
카피록
Amiga,[2] Atari[3] ST 및 IBM[4] PC 플랫폼에 구현된 Rob Northen Copylock 시스템에는 TVD가 포함되어 있습니다.Copylock TVD는 일반적인 소프트웨어 암호화와 더불어 복사 보호된 디스켓에 액세스하여 유효성을 확인하는 코드를 난독화합니다.
데모센
TVD는 680x0 기반의 Razor [5]1911의 Commodore Amiga용으로 작성된 Voyage 데모에 포함되어 있습니다.
레퍼런스
- ^ "MC68000 16-Bit Microprocessor Advance Information" (PDF). Motorola Inc.
- ^ Sevalliu, Patrik. "Rainbow Islands". Computer Archeology.
- ^ Kerr, Wayne (May 2004). "Amiga cracking – A look at basic TVD's". Flashtro.
- ^ Furlough, Fabulous (6 August 2008). "Rob Northen's Copylock". My life behind the patch.
- ^ Various. "Vogage Demo". Pouet.