KR102466000B1 - 메모리 페이지 보호 속성을 이용한 범용 언패킹 방법 및 컴퓨팅 장치 - Google Patents

메모리 페이지 보호 속성을 이용한 범용 언패킹 방법 및 컴퓨팅 장치 Download PDF

Info

Publication number
KR102466000B1
KR102466000B1 KR1020220052959A KR20220052959A KR102466000B1 KR 102466000 B1 KR102466000 B1 KR 102466000B1 KR 1020220052959 A KR1020220052959 A KR 1020220052959A KR 20220052959 A KR20220052959 A KR 20220052959A KR 102466000 B1 KR102466000 B1 KR 102466000B1
Authority
KR
South Korea
Prior art keywords
address
instruction
oep
executable
compressed file
Prior art date
Application number
KR1020220052959A
Other languages
English (en)
Inventor
김두환
김영중
Original Assignee
(주)모니터랩
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by (주)모니터랩 filed Critical (주)모니터랩
Priority to KR1020220052959A priority Critical patent/KR102466000B1/ko
Application granted granted Critical
Publication of KR102466000B1 publication Critical patent/KR102466000B1/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3624Software debugging by performing operations on the source code, e.g. via a compiler
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3636Software debugging by tracing the execution of the program
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/366Software debugging using diagnostics
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/55Detecting local intrusion or implementing counter-measures
    • G06F21/56Computer malware detection or handling, e.g. anti-virus arrangements
    • G06F21/562Static detection
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/55Detecting local intrusion or implementing counter-measures
    • G06F21/56Computer malware detection or handling, e.g. anti-virus arrangements
    • G06F21/568Computer malware detection or handling, e.g. anti-virus arrangements eliminating virus, restoring damaged files

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • General Engineering & Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Health & Medical Sciences (AREA)
  • Quality & Reliability (AREA)
  • Virology (AREA)
  • General Health & Medical Sciences (AREA)
  • Debugging And Monitoring (AREA)

Abstract

본 발명은 범용 언패킹 방법 및 컴퓨팅 장치에 관한 것으로, 본 발명에 따른 방법은 (a) 패킹된 실행 압축 파일을 입력받는 단계, (b) 실행 압축 파일을 디버깅하기 위한 디버거 프로세스를 시작하는 단계, (c) 패킹된 실행 압축 파일에 포함된 압축된 원본 실행 코드가 실행 압축 파일의 언패커 프로세스에 의해 압축 해제되면서 저장될 메모리 섹션에 포함되는 복수의 메모리 페이지를 가드 페이지로서 설정하는 단계, (d) 실행 압축 파일에 대한 디버깅 중 가드 페이지 예외가 발생하면, 현재 실행 명령어가 가드 페이지 내에서 실행된 것인지 확인하는 단계, (e) 현재 실행 명령어가 상기 가드 페이지에서 실행된 것이면, 이전 실행 명령어가 분기 명령어인지 확인하는 단계, 및 (f) 현재 실행 명령어가 분기 명령어이면, 현재 실행 명령어의 주소가 OEP(Original Entry Point)인지 평가하는 단계를 포함한다.

Description

메모리 페이지 보호 속성을 이용한 범용 언패킹 방법 및 컴퓨팅 장치{Universal Unpacking Method and Computing Device Using Memory Page Guard Attribute}
본 발명은 메모리 페이지 보호 속성을 이용한 패킹된 실행 파일에 대한 범용 언패킹 방법 및 컴퓨팅 장치에 관한 것이다.
컴퓨터, 서버, 네트워크 등에서 시스템 파괴, 민감 정보 탈취 등의 심각한 위협을 주는 악성코드는 끊임없이 진화하고 있다. 악성코드의 악성 행위와 더불어 안티 디버깅 기술도 발전하여 악성코드 분석가들에게 악성코드 분석과 대응을 더욱 어렵게 만들고 있는 것이 현실이다. AV-TEST에 따르면 악성코드의 92% 이상이 실행 압축 및 암호화 되어있다고 한다. 패킹은 실행 압축이나 암호화를 사용하여 악성코드 분석가로부터 원본 실행 코드를 숨기는 난독화 방법이다. 패킹된 프로그램의 경우, 원본 실행 코드가 실행 압축 또는 암호화 되어있기 때문에 정적 분석을 통해 분석할 수 없게 된다. 패킹된 프로그램이 실행되면, 먼저 패킹 해제 루틴은 메모리에 있는 원본 실행 코드를 재구성한 후, 재구성된 코드의 시작점으로 제어 흐름을 옮긴다. 이 지점을 OEP(Original Entry Point, 원본 실행 코드의 시작점)라고 부르며, 악성코드 분석가는 OEP를 찾아서 실제 악성행위 코드를 분석할 수 있게 된다.
패킹된 프로그램의 OEP를 찾아서 원래 프로그램으로 복구하는 도구를 언패커(Unpacker)라고 한다. 초기에는 시그니처 기반으로 바이트 시퀀스의 패턴 매칭에 의존하여 OEP를 복구하는 언패커들이 대부분이었다. 이러한 시그니처 기반의 언패커는 패커 자체의 시그니처 패턴을 분석하여 개발되기 때문에, 같은 종류의 패커일지라도 버전과 옵션에 따라 그에 맞는 언패커를 제작해야 한다. 따라서, 언패커를 개발하기 위한 시간 및 인력이 추가로 따르는 비효율성과 CRC 체크 등 언패커를 우회하는 방법에 취약한 단점이 있다. 구체적으로 기존의 언패커 방식은 다음과 같은 한계가 있었다.
가. PolyUnpack 방식
- 패킹된 파일의 실행 흐름이 최종적으로 원래 실행파일의 명령어에 도달한다는 점을 기반으로 정적 분석과 동적 분석이 혼합된 방식이다. 패킹된 코드에 대해서 먼저 정적 분석을 통해 정적 분석 모델(코드와 데이터 분리)을 만들고, 실행파일을 연속적으로 일부분만 실행하면서 해당 코드가 정적 분석 모델에 포함되었는지를 검사하는 방식이다. 사전 정적 분석에 대한 모델을 생성하고, 명령어 단위로 분석하기 때문에 속도가 느리다.
나. OmniUnpack 방식
- WxorX 메모리 정책을 기반으로 런타임에 생성되는 코드를 모니터링하는 방식으로 OEP를 탐지한다. 즉, 언패킹 루틴에서 생성된 코드를 시간 순으로 추적한다. 명령어 단위로 포인터를 메모리에 기록하고 비교 추적하기 때문에 성능상 오버헤드가 존재하며, OEP가 정확히 어디인지 알 수 없는 한계가 있다.
다. Renovo 방식
- 가상머신을 이용하여 숨겨진 코드를 추출하는 방식으로 OEP를 탐지한다. 언패커가 프로세스 관점이 아닌 전체 시스템 관점에서 진행되는 방식으로 구현과 실사용이 어렵고, 정확한 OEP 탐지가 어렵다.
라. Entropy Analysis 방식
- 패킹된 파일의 엔트로피 변화량 분석을 통해 OEP를 탐지한다. 언패킹 루틴에서 엔트로피 값 변화를 측정하여 엔트로피 값이 상대적으로 낮은 지점의 분기(JMP, JCC, CALL, RET) 명령어를 찾고, 해당 지점을 OEP로 추정한다. 엔트로피의 의존성이 크기 때문에, 패커마다 다른 초기 엔트로피 값과 변화량, 조작된 엔트로피에 따라 거짓음성(false negative)과 거짓양성(false positive)의 판단 결과가 높기 때문에, OEP 탐지가 정확하지 않다.
한편 최근 악성코드들은 안티 디버깅 기술이 적용되어 있어 메모리 모니터링을 차단한다. 따라서 언패킹을 위해서는 메모리 모니터링 차단을 우회하는 디버거 은닉화가 필요하다. 즉, 언패커는 OEP 탐지 기술과 더불어 안티 디버깅 우회 기술도 필수적인 요소이다. 현재 상용 수준의 언패커(PEID, Universal PE Unpacker)에서는 OEP를 탐지하기 위한 알고리즘 기술만 포함하거나 디버그 플래그 해제와 프로세스 이름을 조작하는 수준의 우회 방법만 대응하는 수준이다.
본 발명이 해결하고자 하는 기술적 과제는 가드 페이지 속성을 이용한 패킹된 실행 파일에 대한 범용 언패킹 방법 및 컴퓨팅 장치를 제공하는 것이다.
본 발명에 따른 컴퓨팅 장치를 이용한 범용 언패킹 방법은, (a) 패킹된 실행 압축 파일을 입력받는 단계, (b) 상기 실행 압축 파일을 디버깅하기 위한 디버거 프로세스를 시작하는 단계, (c) 상기 패킹된 실행 압축 파일에 포함된 압축된 원본 실행 코드가 상기 실행 압축 파일의 언패커 프로세스에 의해 압축 해제되면서 저장될 메모리 섹션에 포함되는 복수의 메모리 페이지를 가드 페이지로서 설정하는 단계, (d) 상기 실행 압축 파일에 대한 디버깅 중 가드 페이지 예외가 발생하면, 현재 실행 명령어가 상기 가드 페이지 내에서 실행된 것인지 확인하는 단계, (e) 상기 현재 실행 명령어가 상기 가드 페이지에서 실행된 것이면, 이전 실행 명령어가 분기 명령어인지 확인하는 단계, 및 (f) 상기 현재 실행 명령어가 분기 명령어이면, 상기 현재 실행 명령어의 주소가 OEP(Original Entry Point)인지 평가하는 단계를 포함한다.
상기 방법은, 상기 현재 실행 명령어의 주소가 OEP가 아닌 것으로 평가되면, 상기 가드 페이지 예외가 발생한 메모리 페이지에 대한 가드 페이지 설정을 다시하고, 상기 (d) 단계 내지 (f) 단계를 수행하는 것을 반복한다.
상기 방법은, 상기 현재 실행 명령어의 주소가 OEP인 것으로 평가되면, 상기 OEP로 평가된 지점에서 메모리 덤프를 통해 상기 원본 실행 코드를 복원하는 단계를 더 포함할 수 있다.
상기 방법은, 디버깅 중인 상기 실행 압축 파일의 메모리 주소 범위 또는 메모리 섹션 인덱스 정보를 사용자에게 보여주고, 사용자로부터 상기 가드 페이지로서 설정할 메모리 섹션을 선택받을 수 있다.
상기 방법은, 상기 압축된 원본 실행 코드에 대해 구해진 초기 엔트로피 값과 상기 가드 페이지에 저장된 코드의 엔트로피 값의 차이가 미리 정해진 임계값 이상이면 상기 현재 실행 명령어의 주소를 OEP로 평가하는 조건, 상기 현재 실행 명령어의 주소와 상기 이전 실행 명령어의 주소의 차이가 미리 정해진 임계값 이상이면 상기 현재 실행 명령어의 주소를 OEP로 평가하는 조건, 및 상기 현재 실행 명령어의 주소가 위치한 메모리 섹션과 상기 이전 실행 명령어의 주소가 위치한 메모리 섹션이 다르면 상기 현재 실행 명령어의 주소를 OEP로 평가하는 조건 중 하나 이상의 조건을 만족하면 상기 현재 실행 명령어의 주소를 유효한 OEP로 판단할 수 있다.
상기 방법은, 상기 실행 압축 파일의 언패커 프로세스에 적용된 안티 디버깅 기법을 우회하기 위한 인라인 API 후킹을 수행하는 단계를 상기 (b) 단계와 상기 (c) 단계 사이에 수행할 수 있다.
본 발명의 일 실시예는 컴퓨터에 상기 방법을 실행시키기 위한 프로그램을 기록한 컴퓨터로 읽을 수 있는 기록매체를 포함할 수 있다.
본 발명의 일 실시예에 따른 컴퓨팅 장치는, 적어도 하나의 인스트럭션을 저장하는 메모리; 및 적어도 하나의 프로세서; 를 포함하고, 상기 적어도 하나의 프로세서는 상기 적어도 하나의 인스트럭션에 기초하여, (a) 패킹된 실행 압축 파일을 입력받는 단계, (b) 상기 실행 압축 파일을 디버깅하기 위한 디버거 프로세스를 시작하는 단계, (c) 상기 패킹된 실행 압축 파일에 포함된 압축된 원본 실행 코드가 상기 실행 압축 파일의 언패커 프로세스에 의해 압축 해제되면서 저장될 메모리 섹션에 포함되는 복수의 메모리 페이지를 가드 페이지로서 설정하는 단계, (d) 상기 실행 압축 파일에 대한 디버깅 중 가드 페이지 예외가 발생하면, 현재 실행 명령어가 상기 가드 페이지 내에서 실행된 것인지 확인하는 단계, (e) 상기 현재 실행 명령어가 상기 가드 페이지에서 실행된 것이면, 이전 실행 명령어가 분기 명령어인지 확인하는 단계, 및 (f) 상기 현재 실행 명령어가 분기 명령어이면, 상기 현재 실행 명령어의 주소가 OEP(Original Entry Point)인지 평가하는 단계를 실행한다.
본 발명에 의하면 API 후킹을 통해 안티 디버깅을 무력화시켜, 사전에 언패킹 방해 요소를 제거하여 효과적인 언패킹을 수행할 수 있다. 또한 명령어 단위로 쓰기/실행을 추적하는 방식이 아닌 가드 페이지 속성을 이용하여 페이지 단위로 메모리 실행만을 추적하여 OEP 탐지를 수행하므로 효율성을 높일 수 있다. 또한 3가지 휴리스틱 조건을 복합 사용하여 OEP 탐지를 수행함으로써 보다 정확한 OEP 검출이 가능한 장점이 있다.
도 1은 본 발명의 일 실시예에 따른 범용 언패킹 방법에 이용되는 컴퓨팅 장치의 구성을 개략적으로 나타낸 도면이다.
도 2는 본 발명의 일 실시예에 따른 범용 언패킹 방법의 흐름도이다.
도 3은 본 발명의 일 실시예에 따른 페이지 가드 설정을 설명하기 위해 제공되는 도면이다.
그러면 첨부한 도면을 참고로 하여 본 발명의 실시예에 대하여 본 발명이 속하는 기술 분야에서 통상의 지식을 가진 자가 용이하게 실시할 수 있도록 상세히 설명한다.
본 명세서에서 사용된 용어는 실시예들을 설명하기 위한 것이며 본 발명을 제한하고자 하는 것은 아니다. 본 명세서에서, 단수형은 문구에서 특별히 언급하지 않는 한 복수형도 포함한다. 명세서에서 사용되는 "포함한다(comprises)" 및/또는 "포함하는(comprising)"은 언급된 구성요소 외에 하나 이상의 다른 구성요소의 존재 또는 추가를 배제하지 않는다. 명세서 전체에 걸쳐 동일한 도면 부호는 동일한 구성 요소를 지칭하며, "및/또는"은 언급된 구성요소들의 각각 및 하나 이상의 모든 조합을 포함한다. 비록 "제1", "제2" 등이 다양한 구성요소들을 서술하기 위해서 사용되나, 이들 구성요소들은 이들 용어에 의해 제한되지 않음은 물론이다. 이들 용어들은 단지 하나의 구성요소를 다른 구성요소와 구별하기 위하여 사용하는 것이다. 따라서, 이하에서 언급되는 제1 구성요소는 본 발명의 기술적 사상 내에서 제2 구성요소일 수도 있음은 물론이다.
본 명세서에서 "컴퓨팅 장치"는 연산처리를 수행하여 사용자에게 결과를 제공할 수 있는 다양한 장치들이 모두 포함된다. 예를 들어, 컴퓨팅 장치는 데스크 탑 PC, 노트북(Note Book) 컴퓨터, 서버 컴퓨터 등일 수 있다. 그리고 컴퓨팅 장치는 윈도우즈 운영체제에서 동작할 수 있다.
도 1은 본 발명의 일 실시예에 따른 범용 언패킹 방법에 이용되는 컴퓨팅 장치의 구성을 개략적으로 나타낸 도면이다.
도 1을 참고하면, 컴퓨팅 장치(100)는 적어도 하나의 메모리(110) 및 적어도 하나의 프로세서(120)를 포함할 수 있다.
적어도 하나의 메모리(110)는 적어도 하나 이상의 인스트럭션(Instruction)을 저장할 수 있다. 또한 메모리(110)는 컴퓨팅 장치(100)에서 범용 언패킹 방법을 수행하는데 필요한 프로그램 및 데이터를 영구 또는 임시 저장할 수 있다. 아울러 컴퓨팅 장치(100)에서 범용 언패킹 방법을 실행하는 과정에서 생성되는 데이터를 영구 또는 임시 저장할 수 있다.
적어도 하나의 프로세서(120)는 메모리(110)에 저장된 인스트럭션에 대응하는 프로세스들을 실행할 수 있으며, 이에 의해 본 발명에 따른 범용 언패킹 방법을 실행할 수 있다.
도 2는 본 발명의 일 실시예에 따른 범용 언패킹 방법의 흐름도이다.
도 2를 참고하면, 먼저 컴퓨팅 장치(100)는 패킹된 실행 압축 파일을 입력 받을 수 있다(S200). 패킹된 실행 압축 파일은 패커(Packer)에 의해 압축된 원본 실행 코드(Packed Data)와, 압축된 원본 실행 코드를 압축해제하여 복구하는 패킹 해제 루틴(Unpacking routine)을 포함한다. 패킹된 실행 압축 파일에는 디버깅 상태를 탐지하는 안티 디버깅(anti-debugging) 기법이 적용되어 있을 수 있다.
컴퓨팅 장치(100)는 실행 압축 파일을 디버깅하기 위한 디버거 프로세스를 시작할 수 있다(S210). 디버거 프로세스는 메모리에 로드된 실행 압축 파일의 코드를 라인 단위 또는 미리 정해진 단위 또는 사용자로부터 선택된 지점까지 실행하면서 분석할 수 있다.
컴퓨팅 장치(100)는, 디버깅 중인 실행 압축 파일의 EP(Entry Point)에 진입 전에, 실행 압축 파일에 적용된 안티 디버깅 기법을 우회하여 무력화하기 위한 인라인 API 후킹(API Hooking)을 먼저 수행할 수 있다(S220). 단계(S220)를 먼저 수행함으로써, 실행 압축 파일의 EP의 진입 전에 유저 모드에 노출되는 커널함수를 호출하는 NTDLL API의 엔트리를 변조시켜서, 안티 디버깅 기법을 우회 또는 무력화 하기 위한 후킹 프로시저를 호출하도록 하여 디버거 프로세스가 은닉된 상태에서 언패커 프로세스를 실행되게 할 수 있다. 여기서 언패커 프로세스는 패킹 해제 루틴을 포함한다.
구체적으로 인라인 API 후킹(Inline API Hooking)은 함수 테이블의 포인터를 수정하지 않고 원하는 함수의 코드를 직접 패치하는 방법으로 함수의 흐름을 변조하기 때문에, 함수의 주소가 결정되는 언패커 프로세스의 시점에 영향을 받지 않고 후킹을 구현할 수 있다. 언패커 프로세스가 디버깅 상태를 탐지하기 위한 API를 호출하기 전에 유저 모드에 노출되는 커널함수를 호출하는 ntdll의 API의 엔트리를 변조시켜 후킹 프로시저를 호출하도록 할 수 있다. 즉 디버깅 중인 실행 압축 파일의 언패커 프로세스의 주소 공간에 있는 API의 코드를 변경함으로써, 언패커 프로세스가 디버깅 상태를 탐지하기 위해서 API를 호출 시, 안티 디버깅 기법을 우회하도록 변조된 API를 호출하게 할 수 있다.
안티 디버깅 기법을 우회하기 위해 아래와 같은 API 후킹을 실행할 수 있으며, 단계(S220)에서 API 후킹을 위해 NtOpenProcess API, NtQueryInformationProcess API, NtSetInformationThread API, NtCreateThread API 등을 아래와 같이 동작하도록 하는 코드를 패치시킬 수 있다.
가. Hook NtOpenProcess
기본적으로 프로세스는 소유한 프로세스의 메모리를 디버그하고 조정하는데 필요한 SeDebugPrivilege 권한이 없으며, 디버거가 디버깅 대상 프로세스를 불러올 때 SeDebugPrivilege 권한이 상속된다. 일부 패커들은 CSRSS.exe 프로세스를 이용해서 SeDebugPrivilege 권한을 확인하고 디버깅 상태를 탐지한다. 이 방법은 시스템 권한으로 액세스 가능한 CSRSS.exe를 보안 디스크립터(SECURITY_DESCRIPTOR)를 무시하는 SeDebugPrivilege 권한을 가진 프로세스에서 OpenProcess를 통해 CSRSS.exe의 권한을 확인하는 것으로 디버깅 상태를 탐지한다. 디버거는 언패커 프로세스에서 NtOpenProcess의 호출에 대해서 반환 부분에 요청하는 프로세스가 CSRSS.exe인 경우 0xc0000022(ACCESS DENIED)를 반환하도록 후킹하여 언패커 프로세스의 디버깅 상태를 숨길 수 있다.
나. Hook NtQueryInformationProcess
디버깅 중에 DebugPort가 활성화되며, 언패커 프로세스는 주기적으로 DebugPort를 체크하여 디버거를 탐지할 수 있다. DebugPort를 체크하기 위해서 NtQueryInformationProcess의 2번째 인자에 7을 입력하고 반환 값이 non-zero이면, 언패커 프로세스가 유저 모드의 디버깅 상태에 있음을 알 수 있다. 따라서 디버거는 언패커 프로세스에서 NtQueryInformationProcess를 호출 시 두 번째 인자가 7일 경우 0을 반환하도록 후킹하여 디버깅 상태를 숨길 수 있다.
다. Hook NtSetInformationThread
NtSetInformationThread는 ThreadHideFromDebugger(0x11)를 포함한 인자로 패커 프로세스에서 보호하는 스레드를 디버거에서 숨기는 역할을 한다. 해당 설정이 언패커 프로세스의 안티 디버깅에 포함되면 디버깅 중 보호되는 스레드에서 디버거에게 아무것도 전달하지 않게 되며, 컴퓨팅 장치에서는 프로그램을 종료하게 된다. 따라서 본 발명에 따른 실시예에서 디버거는 언패커 프로세스에서 NtSetInformationThread를 호출 시 ThreadHideFromDebugger(0x11)를 확인하고 함수를 즉시 반환하는 형태로 후킹하여 언패커 프로세스에서 보호 스레드의 숨김을 방지할 수 있다.
라. Hoot NtCreateThread
스레드를 생성하는 API인 NtCreateThread는 언패커 프로세스에서 새로운 스레드를 생성할 때 THREAD_CREATE_FLAGS_HIDE_FROM_DEBUGGER (0x00000004) 플래그를 이용하여 디버거에서 생성된 스레드의 제어권을 숨기는 역할을 한다. NtSetInformationThread의 ThreadHideFromDebugger와 마찬가지로 언패커 프로세스의 안티 디버깅에 포함되면 디버깅 중 보호되는 스레드에서 디버거에게 아무것도 전달하지 않게 되며, 컴퓨팅 장치에서는 프로그램을 종료하게 된다. 따라서 본 발명에 따른 실시예에서 디버거는 언패커 프로세스에서 NtCreateThread를 호출 시 모든 경우의 플래그를 THREAD_CREATE_FLAGS_ACCESS_CHECK_IN_TARGET (0x00000020)으로 바꾸어 호출하는 형태로 후킹하여 디버거가 언패커 프로세스에서 생성된 스레드의 제어권에 접근할 수 있다.
다음으로 컴퓨팅 장치(100)는, 디버깅 상태의 실행 압축 파일의 EP에 진입 전에, 압축된 원본 실행 코드가 언패커 프로세스에 의해 압축 해제되면서 저장될 메모리 섹션을 가드 페이지로서 설정할 수 있다(S230).
도 3은 본 발명의 일 실시예에 따른 페이지 가드 설정을 설명하기 위해 제공되는 도면이다.
도 3을 참고하면, 메모리 섹션(10)은 원본 실행 코드(Original Code)가 복원되는 메모리 영역이다. 메모리 섹션(20)에는 패킹된 실행 압축 파일의 패킹 해제 루틴(Unpacking routine)이 위치한다. 그리고 메모리 섹션(20)에는 압축된 원본 실행 코드(Packed Data)가 위치한다. 메모리 섹션(20)의 실행 시작 위치(EP)부터 패킹 해제 루틴(Unpacking routine)을 실행하여, 메모리 섹션(30)에 저장되어 있는 압축된 원본 실행 코드(Packed Data)에 대한 언패킹 즉 압축 해제를 하여 원본 실행 코드(Original Code)가 섹션(30)에 복원된다.
단계(S230)에서는 섹션(30)에 포함되는 복수의 메모리 페이지를 가드 페이지로서 설정한다.
참고로 메모리 페이지에 대해서 가드 페이지 설정을 하면 운영체제의 커널 시스템에서 해당 메모리 페이지 액세스에 대한 원샷 알람(one shot alarm)을 제공한다. PAGE_GUARD 한정자가 설정된 메모리 페이지, 즉 가드 페이지 내의 주소에 언패커 프로세스가 액세스하려고 하면 커널 시스템에서 0X80000001(STATUS_GUARDPAGE_VIOLATION) 예외(이하 '가드 페이지 예외'라 함)를 발생시킨다. 커널 시스템은 가드 페이지 예외를 발생시킨 후, PAGE_GUARD 한정자를 지우고 메모리 페이지의 가드 페이지 상태를 제거한다. 따라서 가드 페이지 예외가 발생한 메모리 페이지에 액세스하려는 다음 시도에 대해서는 가드 페이지 예외가 발생하지 않는다. 가드 페이지 예외를 발생시키려면 해당 메모리 페이지에 다시 가드 페이지 설정을 해야 한다.
컴퓨팅 장치(100)는 단계(S230)에서 디버깅 중인 언패커 대상인 실행 압축 파일의 메모리 주소 범위 또는 메모리 섹션 인덱스 정보를 사용자에게 보여주고, 사용자로부터 가드 페이지로서 설정할 메모리 섹션을 선택받을 수 있다. 예를 들어 메모리 주소 범위(가령, 0xaaaaaa ~ 0xbbbbbb)로 입력받거나, 섹션 인덱스(첫번째 섹션 혹은 두번째 섹션 등)를 입력받기 위한 인터페이스 화면을 표시하여 사용자로부터 선택받을 수 있다.
이후 컴퓨팅 장치(100)는, 디버깅 중인 실행 압축 파일의 EP에 진입하여 언패커 프로세스를 실행하면서, 가드 페이지 예외가 발생하면(S240-Y), 가드 페이지 예외가 발생했을 때 현재 실행 명령어가 가드 페이지에서 실행된 것인지 확인한다(S250). OEP(Original Entry Point)는 항상 원본 실행 코드가 압축해제되어 복구되는 메모리 섹션에 존재하므로, 가드 페이지 예외가 발생한 현재 실행 명령어가 가드 페이지 내에 있는 명령어인지 확인한다. 현재 실행 명령어가 가드 페이지 내에 있으면 OEP 후보가 될 수 있다.
다음으로 컴퓨팅 장치(100)는 현재 실행 명령어가 가드 페이지에서 실행된 것이면(S250-Y), 이전 실행 명령어가 분기 명령어(JMP, CALL)인지 확인한다(S260). 실행 압축 파일의 패킹 해제 루틴은 메모리에 있는 압축된 원본 실행 코드를 재구성한 후 재구성된 코드의 시작점으로 제어 흐름을 옮기기 위해 분기 명령어(JMP, CALL 등)를 사용한다. 즉, OEP는 현재 실행 명령어 바로 직전에 실행된 이전 실행 명령어가 분기되는 목적지 주소이다. 이를 확인하기 위해서 이전 실행 명령어가 분기 명령어인지 확인한다.
다음으로 컴퓨팅 장치(100)는 이전 실행 명령어가 분기 명령어이면(S260-Y), 현재 실행 명령어의 주소가 OEP인지 평가한다(S270).
단계(S270)에서 현재 실행 명령어의 주소에 대한 OEP 평가는 아래와 같은 휴리스틱 평가 조건이 이용될 수 있다. 실시예에 따라 달라질 수 있으나 복수의 휴리스틱 평가 조건을 모두 만족하는 경우에 해당 주소를 유효한 OEP 후보로 평가하도록 구현하거나, 또는 미리 정해진 개수 이상을 만족하는 경우 유효한 OEP 후보로 평가하도록 구현하거나, 또는 그 중 하나만 만족하더라도 유효한 OEP 후보로 평가하도록 구현하는 것도 가능하다.
가. 엔트로피 조건
패킹 해제 루틴이 시작되는 시점에서 압축된 원본 실행 코드에 대해 구해진 초기 엔트로피 값(initial_entropy)과 가드 페이지 예외가 발생했을 때 가드 페이지에 저장된 코드의 엔트로피 값(current_entropy)의 차이(difference)가 미리 정해진 임계값 이상일 경우 현재 실행 명령어의 주소를 OEP로 평가할 수 있다.
양 엔트로피 값의 차이는 정규화를 위해서 아래 수학식 1에 의해 구하고, 이를 미리 정해진 임계값과 비교할 수 있다.
[수학식 1]
Figure 112022045880553-pat00001
엔트로피 값은 아래 수학식 2에 나타낸 것과 같은 섀넌 엔트로피(Shannon entropy) 방정식을 통해서 구할 수 있다. 섀넌 엔트로피 방정식을 통해서 바이너리 코드의 엔트로피 값을 구하는 것은 잘 알려져 있으므로 자세한 설명은 생략한다.
[수학식 2]
Figure 112022045880553-pat00002
나. Long Jump 조건
일반적으로 실행 압축 파일은 패킹 해제 루틴이 끝난 후 OEP로 Long 점프를 하여 복구된 원본 코드를 실행한다. 따라서 현재 실행 명령어의 주소(current_eip)와 이전 실행 명령어의 주소(previous_eip)의 차이(difference)를 아래 수학식 3에 의해 계산하고, 그 차이가 미리 정해진 임계값 이상이면 현재 실행 명령어의 주소를 OEP로 평가할 수 있다.
[수학식 3]
Figure 112022045880553-pat00003
다. Jump other section 조건
모든 패킹 해제 루틴은 공통적으로 압축해제된 원본 실행 코드를 메모리에 쓴 후 실행을 위해 OEP로 리다이렉트한다. 일반적으로 패킹 해제 루틴 코드를 담고 있는 메모리 섹션과 새로운 압축해제된 원본 실행 코드를 쓰는 메모리 섹션이 다르다는 점에 기초하여 현재 실행 명령어의 주소가 위치한 메모리 섹션과 이전 실행 명령어의 주소가 위치한 메모리 섹션이 다르면, 현재 실행 명령어의 주소를 OEP로 평가할 수 있다.
이후 현재 실행 명령어의 주소가 OEP인 것으로 평가되면(S270-Y), 컴퓨팅 장치(100)는 OEP로 평가된 지점에서 메모리 덤프를 통해 원본 실행 코드를 복원할 수 있다(S290). 단계(S290)에서 원본 실행 코드의 IAT(Import Address Table) 복구가 수행될 수 있으며, 메모리 덤프된 파일에 복구된 IAT를 적용하여 원본 실행 코드를 수행할 수 있다.
컴퓨팅 장치(100)는 단계(S290)에서 복원된 원본 실행 코드에 대한 유효성 검사를 수행하고, 유효하지 않은 원본 실행 코드는 삭제할 수 있다.
한편 현재 실행 명령어가 가드 페이지에서 실행된 것이 아니거나(S250-N), 이전 실행 명령어가 분기 명령어가 아니거나(S260-N), 현재 실행 명령어의 주소가 OEP가 아닌 것으로 평가되면(S270-N), 컴퓨팅 장치(100)는 가드 페이지 예외가 발생한 메모리 페이지에 대한 가드 페이지 설정을 다시하고(S280), 언패커 프로세스에 대한 디버깅을 계속 진행하면서 단계(S240) 내지 단계(S270)를 수행하는 것을 반복할 수 있다.
이상에서 설명된 실시예들은 하드웨어 구성요소, 소프트웨어 구성요소, 및/또는 하드웨어 구성요소 및 소프트웨어 구성요소의 조합으로 구현될 수 있다. 예를 들어, 실시예들에서 설명된 장치, 방법 및 구성요소는, 예를 들어, 프로세서, 콘트롤러, ALU(arithmetic logic unit), 디지털 신호 프로세서(digital signal processor), 마이크로컴퓨터, FPGA(field programmable gate array), PLU(programmable logic unit), 마이크로프로세서, 또는 인스트럭션(instruction)을 실행하고 응답할 수 있는 다른 어떠한 장치와 같이, 하나 이상의 범용 컴퓨팅 장치 또는 특수 목적 컴퓨팅 장치를 이용하여 구현될 수 있다. 처리 장치는 운영 체제(OS) 및 상기 운영 체제 상에서 수행되는 하나 이상의 소프트웨어 애플리케이션을 수행할 수 있다. 또한, 처리 장치는 소프트웨어의 실행에 응답하여, 데이터를 접근, 저장, 조작, 처리 및 생성할 수도 있다. 이해의 편의를 위하여, 처리 장치는 하나가 사용되는 것으로 설명된 경우도 있지만, 해당 기술분야에서 통상의 지식을 가진 자는, 처리 장치가 복수 개의 처리 요소(processing element) 및/또는 복수 유형의 처리 요소를 포함할 수 있음을 알 수 있다. 예를 들어, 처리 장치는 복수 개의 프로세서 또는 하나의 프로세서 및 하나의 콘트롤러를 포함할 수 있다. 또한, 병렬 프로세서(parallel processor)와 같은, 다른 처리 구성(processing configuration)도 가능하다.
소프트웨어는 컴퓨터 프로그램(computer program), 코드(code), 인스트럭션(instruction), 또는 이들 중 하나 이상의 조합을 포함할 수 있으며, 원하는 대로 동작하도록 처리 장치를 구성하거나 독립적으로 또는 결합적으로(collectively) 처리 장치를 명령할 수 있다. 소프트웨어 및/또는 데이터는, 처리 장치에 의하여 해석되거나 처리 장치에 명령 또는 데이터를 제공하기 위하여, 어떤 유형의 기계, 구성요소(component), 물리적 장치, 가상 장치(virtual equipment), 컴퓨터 저장 매체 또는 장치에 영구적으로, 또는 일시적으로 구체화(embody)될 수 있다. 소프트웨어는 네트워크로 연결된 컴퓨터 시스템 상에 분산되어서, 분산된 방법으로 저장되거나 실행될 수도 있다. 소프트웨어 및 데이터는 하나 이상의 컴퓨터 판독 가능 기록 매체에 저장될 수 있다.
실시예에 따른 방법은 다양한 컴퓨터 수단을 통하여 수행될 수 있는 프로그램 명령 형태로 구현되어 컴퓨터 판독 가능 매체에 기록될 수 있다. 상기 컴퓨터 판독 가능 매체는 프로그램 명령, 데이터 파일, 데이터 구조 등을 단독으로 또는 조합하여 포함할 수 있다. 상기 매체에 기록되는 프로그램 명령은 실시예를 위하여 특별히 설계되고 구성된 것들이거나 컴퓨터 소프트웨어 당업자에게 공지되어 사용 가능한 것일 수도 있다. 컴퓨터 판독 가능 기록 매체의 예에는 하드 디스크, 플로피 디스크 및 자기 테이프와 같은 자기 매체(magnetic media), CD-ROM, DVD와 같은 광기록 매체(optical media), 플롭티컬 디스크(floptical disk)와 같은 자기-광 매체(magneto-optical media), 및 롬(ROM), 램(RAM), 플래시 메모리 등과 같은 프로그램 명령을 저장하고 수행하도록 특별히 구성된 하드웨어 장치가 포함된다. 프로그램 명령의 예에는 컴파일러에 의해 만들어지는 것과 같은 기계어 코드뿐만 아니라 인터프리터 등을 사용해서 컴퓨터에 의해서 실행될 수 있는 고급 언어 코드를 포함한다. 상기된 하드웨어 장치는 실시예의 동작을 수행하기 위해 하나 이상의 소프트웨어 모듈로서 작동하도록 구성될 수 있으며, 그 역도 마찬가지이다.
이상과 같이 실시예들이 비록 한정된 도면에 의해 설명되었으나, 해당 기술분야에서 통상의 지식을 가진 자라면 상기를 기초로 다양한 기술적 수정 및 변형을 적용할 수 있다. 예를 들어, 설명된 기술들이 설명된 방법과 다른 순서로 수행되거나, 및/또는 설명된 시스템, 구조, 장치, 회로 등의 구성요소들이 설명된 방법과 다른 형태로 결합 또는 조합되거나, 다른 구성요소 또는 균등물에 의하여 대치되거나 치환되더라도 적절한 결과가 달성될 수 있다.

Claims (13)

  1. 컴퓨팅 장치를 이용한 범용 언패킹 방법에서,
    (a) 패킹된 실행 압축 파일을 입력받는 단계,
    (b) 상기 실행 압축 파일을 디버깅하기 위한 디버거 프로세스를 시작하는 단계,
    (c) 상기 패킹된 실행 압축 파일에 포함된 압축된 원본 실행 코드가 상기 실행 압축 파일의 언패커 프로세스에 의해 압축 해제되면서 저장될 메모리 섹션에 포함되는 복수의 메모리 페이지를 가드 페이지로서 설정하는 단계,
    (d) 상기 실행 압축 파일에 대한 디버깅 중 가드 페이지 예외가 발생하면, 현재 실행 명령어가 상기 가드 페이지 내에서 실행된 것인지 확인하는 단계,
    (e) 상기 현재 실행 명령어가 상기 가드 페이지에서 실행된 것이면, 이전 실행 명령어가 분기 명령어인지 확인하는 단계, 및
    (f) 상기 현재 실행 명령어가 분기 명령어이면, 상기 현재 실행 명령어의 주소가 OEP(Original Entry Point)인지 평가하는 단계를 포함하고,
    상기 현재 실행 명령어의 주소가 OEP가 아닌 것으로 평가되면, 상기 가드 페이지 예외가 발생한 메모리 페이지에 대한 가드 페이지 설정을 다시하고, 상기 (d) 단계 내지 (f) 단계를 수행하는 것을 반복하며,
    상기 압축된 원본 실행 코드에 대해 구해진 초기 엔트로피 값과 상기 가드 페이지에 저장된 코드의 엔트로피 값의 차이가 미리 정해진 임계값 이상이면 상기 현재 실행 명령어의 주소를 OEP로 평가하는 조건,
    상기 현재 실행 명령어의 주소와 상기 이전 실행 명령어의 주소의 차이가 미리 정해진 임계값 이상이면 상기 현재 실행 명령어의 주소를 OEP로 평가하는 조건, 및
    상기 현재 실행 명령어의 주소가 위치한 메모리 섹션과 상기 이전 실행 명령어의 주소가 위치한 메모리 섹션이 다르면 상기 현재 실행 명령어의 주소를 OEP로 평가하는 조건
    중 하나 이상의 조건을 만족하면 상기 현재 실행 명령어의 주소를 유효한 OEP로 판단하는 방법.
  2. 삭제
  3. 제 1 항에서,
    상기 현재 실행 명령어의 주소가 OEP인 것으로 평가되면, 상기 OEP로 평가된 지점에서 메모리 덤프를 통해 상기 원본 실행 코드를 복원하는 단계
    를 더 포함하는 방법.
  4. 제 3 항에서,
    디버깅 중인 상기 실행 압축 파일의 메모리 주소 범위 또는 메모리 섹션 인덱스 정보를 사용자에게 보여주고, 사용자로부터 상기 가드 페이지로서 설정할 메모리 섹션을 선택받는 방법.
  5. 삭제
  6. 제 1 항에서,
    상기 실행 압축 파일의 언패커 프로세스에 적용된 안티 디버깅 기법을 우회하기 위한 인라인 API 후킹을 수행하는 단계를 상기 (b) 단계와 상기 (c) 단계 사이에 수행하는 방법.
  7. 컴퓨터에 제1항, 제3항, 제4항 및 제6항 중 어느 한 항에 기재된 방법을 실행시키기 위한 프로그램을 기록한 컴퓨터로 읽을 수 있는 기록매체.
  8. 컴퓨팅 장치로서,
    적어도 하나의 인스트럭션을 저장하는 메모리; 및
    적어도 하나의 프로세서; 를 포함하고,
    상기 적어도 하나의 프로세서는 상기 적어도 하나의 인스트럭션에 기초하여,
    (a) 패킹된 실행 압축 파일을 입력받는 단계,
    (b) 상기 실행 압축 파일을 디버깅하기 위한 디버거 프로세스를 시작하는 단계,
    (c) 상기 패킹된 실행 압축 파일에 포함된 압축된 원본 실행 코드가 상기 실행 압축 파일의 언패커 프로세스에 의해 압축 해제되면서 저장될 메모리 섹션에 포함되는 복수의 메모리 페이지를 가드 페이지로서 설정하는 단계,
    (d) 상기 실행 압축 파일에 대한 디버깅 중 가드 페이지 예외가 발생하면, 현재 실행 명령어가 상기 가드 페이지 내에서 실행된 것인지 확인하는 단계,
    (e) 상기 현재 실행 명령어가 상기 가드 페이지에서 실행된 것이면, 이전 실행 명령어가 분기 명령어인지 확인하는 단계, 및
    (f) 상기 현재 실행 명령어가 분기 명령어이면, 상기 현재 실행 명령어의 주소가 OEP(Original Entry Point)인지 평가하는 단계를 실행하고,
    상기 현재 실행 명령어의 주소가 OEP가 아닌 것으로 평가되면, 상기 가드 페이지 예외가 발생한 메모리 페이지에 대한 가드 페이지 설정을 다시하고, 상기 (d) 단계 내지 (f) 단계를 수행하는 것을 반복하고,
    상기 압축된 원본 실행 코드에 대해 구해진 초기 엔트로피 값과 상기 가드 페이지에 저장된 코드의 엔트로피 값의 차이가 미리 정해진 임계값 이상이면 상기 현재 실행 명령어의 주소를 OEP로 평가하는 조건,
    상기 현재 실행 명령어의 주소와 상기 이전 실행 명령어의 주소의 차이가 미리 정해진 임계값 이상이면 상기 현재 실행 명령어의 주소를 OEP로 평가하는 조건, 및
    상기 현재 실행 명령어의 주소가 위치한 메모리 섹션과 상기 이전 실행 명령어의 주소가 위치한 메모리 섹션이 다르면 상기 현재 실행 명령어의 주소를 OEP로 평가하는 조건
    중 하나 이상의 조건을 만족하면 상기 현재 실행 명령어의 주소를 유효한 OEP로 판단하는 컴퓨팅 장치.
  9. 삭제
  10. 제 8 항에서,
    상기 적어도 하나의 프로세서는,
    상기 현재 실행 명령어의 주소가 OEP인 것으로 평가되면, 상기 OEP로 평가된 지점에서 메모리 덤프를 통해 상기 원본 실행 코드를 복원하는 단계
    를 더 수행하는 컴퓨팅 장치.
  11. 제 10 항에서,
    디버깅 중인 상기 실행 압축 파일의 메모리 주소 범위 또는 메모리 섹션 인덱스 정보를 사용자에게 보여주고, 사용자로부터 상기 가드 페이지로서 설정할 메모리 섹션을 선택받는 컴퓨팅 장치.
  12. 삭제
  13. 제 8 항에서,
    상기 적어도 하나의 프로세서는,
    상기 실행 압축 파일의 언패커 프로세스에 적용된 안티 디버깅 기법을 우회하기 위한 인라인 API 후킹을 수행하는 단계를 상기 (b) 단계와 상기 (c) 단계 사이에 수행하는 컴퓨팅 장치.
KR1020220052959A 2022-04-28 2022-04-28 메모리 페이지 보호 속성을 이용한 범용 언패킹 방법 및 컴퓨팅 장치 KR102466000B1 (ko)

Priority Applications (1)

Application Number Priority Date Filing Date Title
KR1020220052959A KR102466000B1 (ko) 2022-04-28 2022-04-28 메모리 페이지 보호 속성을 이용한 범용 언패킹 방법 및 컴퓨팅 장치

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
KR1020220052959A KR102466000B1 (ko) 2022-04-28 2022-04-28 메모리 페이지 보호 속성을 이용한 범용 언패킹 방법 및 컴퓨팅 장치

Publications (1)

Publication Number Publication Date
KR102466000B1 true KR102466000B1 (ko) 2022-11-10

Family

ID=84045528

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020220052959A KR102466000B1 (ko) 2022-04-28 2022-04-28 메모리 페이지 보호 속성을 이용한 범용 언패킹 방법 및 컴퓨팅 장치

Country Status (1)

Country Link
KR (1) KR102466000B1 (ko)

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
Han Yang 외 3명, "Research and Implementation of OEP Search Based on API-monitoring", IEEE 2012 Int. Conf. on Computer Science and Service System, (2012.8.11.)* *
T.Apostolopoulos 외 3명, "Resurrecting anti-virtualization and anti-debugging: Unhooking your hooks", Future Generation Computer System, Vol.116, (2021.3.)* *

Similar Documents

Publication Publication Date Title
Singh et al. On the detection of kernel-level rootkits using hardware performance counters
US20200311271A1 (en) Method of malware detection and system thereof
US11586736B2 (en) Systems and methods for detecting malicious processes
JP4518564B2 (ja) 不正コード実行の防止方法、不正コード実行の防止用プログラム、及び不正コード実行の防止用プログラムの記録媒体
US7146305B2 (en) Analytical virtual machine
US7657419B2 (en) Analytical virtual machine
Roundy et al. Hybrid analysis and control of malware
CN102043915B (zh) 一种非可执行文件中包含恶意代码的检测方法及其装置
WO2012152479A1 (en) Malware detection
JP2019502197A (ja) ランタイム生成コードにおける悪意のあるコードの検出のためのシステムおよび方法
Cheng et al. {Obfuscation-Resilient} Executable Payload Extraction From Packed Malware
Kaur et al. A complete dynamic malware analysis
Willems et al. Reverse code engineering—state of the art and countermeasures
US11921850B2 (en) Iterative memory analysis for malware detection
US11836252B2 (en) Machine learning through iterative memory analysis for malware detection
EP4332805A1 (en) Emulation-based malware detection
KR102466000B1 (ko) 메모리 페이지 보호 속성을 이용한 범용 언패킹 방법 및 컴퓨팅 장치
Nadim et al. Kernel-level rootkit detection, prevention and behavior profiling: a taxonomy and survey
JP7524482B2 (ja) 悪性コード静的分析のための実行ファイルのアンパッキングシステム及び方法
US20220261481A1 (en) Software packer-agnostic unpacking of packed executables
Joy et al. A host based kernel level rootkit detection mechanism using clustering technique
KR20210057239A (ko) 안티 디버깅 무력화 장치 및 그 방법
KR102350146B1 (ko) 안티 디버깅 방법 및 이러한 방법을 수행하는 장치
KR102225838B1 (ko) 안드로이드 앱 보호를 위한 안티 에뮬레이션 방법 및 장치
US9607152B1 (en) Detect encrypted program based on CPU statistics

Legal Events

Date Code Title Description
E701 Decision to grant or registration of patent right
GRNT Written decision to grant