KR20200017121A - 원타임 코드를 이용한 코드 보호 방법 및 시스템 - Google Patents

원타임 코드를 이용한 코드 보호 방법 및 시스템 Download PDF

Info

Publication number
KR20200017121A
KR20200017121A KR1020180092343A KR20180092343A KR20200017121A KR 20200017121 A KR20200017121 A KR 20200017121A KR 1020180092343 A KR1020180092343 A KR 1020180092343A KR 20180092343 A KR20180092343 A KR 20180092343A KR 20200017121 A KR20200017121 A KR 20200017121A
Authority
KR
South Korea
Prior art keywords
code
code group
computer program
group
segment
Prior art date
Application number
KR1020180092343A
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 KR1020180092343A priority Critical patent/KR20200017121A/ko
Publication of KR20200017121A publication Critical patent/KR20200017121A/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/121Restricting unauthorised execution of programs
    • G06F21/125Restricting unauthorised execution of programs by manipulating the program code, e.g. source code, compiled code, interpreted code, machine code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/14Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/60Protecting data
    • G06F21/602Providing cryptographic facilities or services

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Technology Law (AREA)
  • Multimedia (AREA)
  • Health & Medical Sciences (AREA)
  • Bioethics (AREA)
  • General Health & Medical Sciences (AREA)
  • Storage Device Security (AREA)

Abstract

원타임 코드를 이용한 코드 보호 방법 및 시스템을 개시한다. 본 발명의 실시예들에 따른 코드 보호 방법은, 실행 후 제거되는 원타임 코드를 이용하여 컴퓨터 프로그램을 실행함으로써, 공격자들이 동적분석을 통해 인스트럭션들을 역 추적하여 코드를 분석하는 것을 어렵게 만들 수 있다.

Description

원타임 코드를 이용한 코드 보호 방법 및 시스템{METHOD AND SYSTEM FOR PROTECTING CODE USING ONETIME CODE}
아래의 설명은 원타임 코드를 이용한 코드 보호 방법, 코드 보호 방법을 수행하는 컴퓨터 장치, 그리고 컴퓨터 장치와 결합되어 코드 보호 방법을 컴퓨터 장치에 실행시키기 위해 컴퓨터 판독 가능한 기록매체에 저장된 컴퓨터 프로그램과 그 기록매체에 관한 것이다.
클라이언트 단말로 배포된 어플리케이션들은 역공학(리버싱)을 통해서 그 동작 방식을 파악할 수 있으며, 이러한 역공학을 통해 어플리케이션의 기능의 도용이 가능해진다. 또한, 어플리케이션의 원래의 기능을 수정하여 어플리케이션이 의도된 동작과 다르게 동작하도록 하여 어플리케이션을 통해 제공되는 서비스와 해당 서비스를 제공하는 시스템의 신뢰성에 좋지 않은 영향을 줄 수 있게 된다.
코드 난독화는 프로그래밍 언어로 작성된 코드를 읽기 어렵게 만들기 위해, 프로그램 코드의 일부 또는 전체를 변경하는 방법 중 하나로 코드의 가독성을 낮춰 역공학에 대한 대비책을 제공한다. 예를 들어, 한국등록특허 제10-1328012호는 애플리케이션 코드 난독화 장치 및 그 방법에 관한 것으로, 애플리케이션에 사용되는 코드 중 중요 코드 및 중요 코드를 호출하기 위한 호출 코드를 네이티브 코드 형태로 변환하는 기술을 개시하고 있다.
그러나 이러한 종래기술은 난독화된 코드를 실행하기 위해 추가적인 실행 시간이 필요하게 되며, 원래의 동작을 수행하기 위해서 특정 시점에서는 메모리상에 원래의 코드가 로딩되어야 하기 때문에 메모리 덤프 등을 통해 쉽게 우회(bypass)할 수 있다는 문제점이 있다.
실행 후 제거되는 원타임 코드를 이용하여 컴퓨터 프로그램을 실행함으로써, 공격자들이 동적분석을 통해 인스트럭션들을 역 추적하여 코드를 분석하는 것을 어렵게 만들 수 있는 코드 보호 방법, 코드 보호 방법을 수행하는 컴퓨터 장치, 그리고 컴퓨터 장치와 결합되어 코드 보호 방법을 컴퓨터 장치에 실행시키기 위해 컴퓨터 판독 가능한 기록매체에 저장된 컴퓨터 프로그램과 그 기록매체를 제공한다.
코드의 실행 위치를 추첨을 통해 결정함으로써, 특정 파일에 타겟팅되지 않는 본체가 없는 코드를 제공할 수 있으며, 실행을 위한 트리거 시점이 랜덤인 코드를 제공함으로써, 해당 코드에 대한 정보가 동적분석 등을 통해 노출되는 것을 방지할 수 있는 코드 보호 방법, 코드 보호 방법을 수행하는 컴퓨터 장치, 그리고 컴퓨터 장치와 결합되어 코드 보호 방법을 컴퓨터 장치에 실행시키기 위해 컴퓨터 판독 가능한 기록매체에 저장된 컴퓨터 프로그램과 그 기록매체를 제공한다.
서버에서 전달되는 코드를 실행할 때, 혹은 로컬의 코드를 실행할 때, 적법한 코드만이 추가되었음을 보증할 수 있으며, 또한 코드가 제대로 실행되었는지 여부 및 코드의 무결성을 검증할 수 있는 코드 보호 방법, 코드 보호 방법을 수행하는 컴퓨터 장치, 그리고 컴퓨터 장치와 결합되어 코드 보호 방법을 컴퓨터 장치에 실행시키기 위해 컴퓨터 판독 가능한 기록매체에 저장된 컴퓨터 프로그램과 그 기록매체를 제공한다.
컴퓨터 프로그램의 실행에 응답하여 상기 컴퓨터 프로그램의 코드를 실행하는 가상 머신을 생성하는 단계; 상기 가상 머신의 제어에 따라 메모리상에 실행가능한 세그먼트를 로드하는 단계; 상기 컴퓨터 프로그램이 포함하는 암호화된 코드 그룹을 복원하는 단계; 상기 실행가능한 세그먼트에서 랜덤하게 선택된 위치에 상기 복원된 코드 그룹을 로드하는 단계; 상기 랜덤하게 선택된 위치에 로드된 코드 그룹을 실행하는 단계; 및 상기 실행가능한 세그먼트에서 상기 실행된 코드 그룹을 제거하는 단계를 포함하는, 코드 보호 방법을 제공한다.
일측에 따르면, 상기 실행가능한 세그먼트를 로드하는 단계는, 상기 컴퓨터 프로그램의 인스트럭션이 로드되는 세그먼트와는 별도의 세그먼트를 상기 컴퓨터 프로그램의 실행 시 상기 가상 머신의 제어에 따라 동적으로 로드할 수 있다.
다른 측면에 따르면, 상기 복원된 코드 그룹을 로드하는 단계는, 상기 실행가능한 세그먼트를 n(상기 n은 2 이상의 자연수) 등분하여 n 개의 영역으로 분할하고, 상기 분할된 n 개의 영역들 중에서 랜덤하게 선택되는 하나의 영역에 상기 복원된 코드 그룹을 로드할 수 있다.
또 다른 측면에 따르면, 상기 복원하는 단계는, 상기 가상 머신이 포함하는 복원 모듈을 통해 상기 암호화된 코드 그룹을 복원할 수 있다.
또 다른 측면에 따르면, 상기 코드 보호 방법은 상기 컴퓨터 프로그램이 포함하는 암호화된 다음 코드 그룹에 대해, 상기 암호화된 코드 그룹을 복원하는 단계, 상기 복원된 코드 그룹을 로드하는 단계, 상기 코드 그룹을 실행하는 단계 및 상기 실행된 코드 그룹을 제거하는 단계를 반복 수행하는 단계를 더 포함할 수 있다.
또 다른 측면에 따르면, 상기 코드 그룹을 실행하는 단계는, 상기 코드 그룹 외부의 라이브러리 또는 함수에 대한 호출에 따라 요구되는 상기 코드 그룹 외부의 오프셋을 상기 가상 머신이 포함하는 리로케이션 모듈을 통해 처리할 수 있다.
또 다른 측면에 따르면, 상기 코드 그룹은 오리지널 코드 그룹이 포함하는 인스트럭션들 중 적어도 일부를 함수의 형태로 변환한 코드를 포함할 수 있다.
컴퓨터 장치와 결합되어 상기 코드 보호 방법을 상기 컴퓨터 장치에 실행시키기 위해 컴퓨터 판독 가능한 기록매체에 저장된 컴퓨터 프로그램을 제공한다.
상기 코드 보호 방법을 컴퓨터에 실행시키기 위한 프로그램이 기록되어 있는 것을 특징으로 하는 컴퓨터에서 판독 가능한 기록매체를 제공한다.
컴퓨터 장치에 있어서, 상기 컴퓨터 장치에서 판독 가능한 명령을 실행하도록 구현되는 적어도 하나의 프로세서를 포함하고, 상기 적어도 하나의 프로세서에 의해, 컴퓨터 프로그램의 실행에 응답하여 상기 컴퓨터 프로그램의 코드를 실행하는 가상 머신을 생성하고, 상기 가상 머신의 제어에 따라 메모리상에 실행가능한 세그먼트를 로드하고, 상기 컴퓨터 프로그램이 포함하는 암호화된 코드 그룹을 복원하고, 상기 실행가능한 세그먼트에서 랜덤하게 선택된 위치에 상기 복원된 코드 그룹을 로드하고, 상기 랜덤하게 선택된 위치에 로드된 코드 그룹을 실행하고, 상기 실행가능한 세그먼트에서 상기 실행된 코드 그룹을 제거하는, 컴퓨터 장치를 제공한다.
실행 후 제거되는 원타임 코드를 이용하여 컴퓨터 프로그램을 실행함으로써, 공격자들이 동적분석을 통해 인스트럭션들을 역 추적하여 코드를 분석하는 것을 어렵게 만들 수 있다.
코드의 실행 위치를 추첨을 통해 결정함으로써, 특정 파일에 타겟팅되지 않는 본체가 없는 코드를 제공할 수 있으며, 실행을 위한 트리거 시점이 랜덤인 코드를 제공함으로써, 해당 코드에 대한 정보가 동적분석 등을 통해 노출되는 것을 방지할 수 있다.
서버에서 전달되는 코드를 실행할 때, 혹은 로컬의 코드를 실행할 때, 적법한 코드만이 추가되었음을 보증할 수 있으며, 또한 코드가 제대로 실행되었는지 여부 및 코드의 무결성을 검증할 수 있다.
도 1 및 도 2는 본 발명의 일실시예에 있어서, 원타임 코드를 이용한 코드 보호 과정의 예를 도시한 도면들이다.
도 3은 본 발명의 일실시예에 있어서, 원타임 코드를 이용한 코드 보호 방법의 예를 도시한 흐름도이다.
도 4는 본 발명의 일실시예에 있어서, 코드 스프레잉의 개념을 설명하기 위한 도면이다.
도 5는 본 발명의 일실시예에 있어서, 코드의 실행 위치 추첨의 예를 도시한 도면이다.
도 6은 본 발명의 일실시예에 있어서, 코드 실행 위치의 추첨을 이용한 코드 보호 방법의 예를 도시한 흐름도이다.
도 7은 본 발명의 일실시예에 있어서, 코드 체인 검증을 위한 해쉬 계산 과정의 예를 도시한 도면이다.
도 8은 본 발명의 일실시예에 따른 원장의 예를 도시한 도면이다.
도 9는 본 발명의 일실시예에 있어서, 새로운 코드 그룹의 추가에 따라 원장을 갱신하는 예를 도시한 도면이다.
도 10은 본 발명의 일실시예에 있어서, 코드 체인 검증을 이용한 코드 보호 과정의 예를 도시한 도면이다.
도 11은 본 발명의 일실시예에 있어서, 코드 그룹에 대한 원장을 생성하는 컴퓨터 장치의 코드 보호 방법의 예를 도시한 흐름도이다.
도 12는 본 발명의 일실시예에 있어서, 코드 체인과 원장이 포함된 컴퓨터 프로그램을 실행하는 컴퓨터 장치의 코드 보호 방법의 예를 도시한 흐름도이다.
도 13은 본 발명의 일실시예에 있어서, 오리지널 코드 그룹이 포함하는 코드들을 명세 언어로 변환한 예를 나타내고 있다.
도 14는 본 발명의 일실시예에 따른 컴퓨터 장치의 예를 도시한 블록도이다.
이하, 실시예를 첨부한 도면을 참조하여 상세히 설명한다.
본 발명의 실시예들에 따른 시스템은 이후 설명될 적어도 하나의 컴퓨터 장치에 의해 구현될 수 있으며, 본 발명의 실시예들에 따른 방법은 이후 설명될 적어도 하나의 컴퓨터 장치에 의해 수행될 수 있다. 이때, 컴퓨터 장치에는 본 발명의 일실시예에 따른 컴퓨터 프로그램이 설치 및 구동될 수 있고, 컴퓨터 장치는 구동된 컴퓨터 프로그램의 제어에 따라 본 발명의 실시예들에 따른 방법을 수행할 수 있다. 상술한 컴퓨터 프로그램은 컴퓨터 장치와 결합되어 본 발명의 실시예들에 따른 방법을 컴퓨터 장치에 실행시키기 위해 컴퓨터 판독 가능한 기록매체에 저장될 수 있다.
도 1 및 도 2는 본 발명의 일실시예에 있어서, 원타임 코드를 이용한 코드 보호 과정의 예를 도시한 도면들이다.
도 1은 어플리케이션과 같은 컴퓨터 프로그램의 코드를 실행하는 가상 머신(Virtual Machine, VM)(110)과, 가상 머신(110)이 로드되면서 실행가능한 세그먼트(executable segment)로서 코드 세그먼트(code segment)(120)를 할당한 예를 나타내고 있다. 여기서 세그먼트는 프로그램이나 데이터를 세그먼트 또는 섹션이라는 가변 크기로 관리하는 메모리 관리 방식에서 메모리상에 할당되는 가변 크기의 영역을 의미할 수 있으며, 코드 세그먼트(120)는 실행될 프로그램의 명령어인 인스트럭션을 포함할 수 있다. 이때, 로드된 가상 머신(110)은 코드 보호를 위해 암호화된 인스트럭션(instruction)들의 그룹(130)이 포함하는 암호화된 인스트럭션들을 순차적으로 실행할 수 있다. 예를 들어, 도 1에서 가상 머신(110)은 암호화된 인스트럭션 1(131)을 가상 머신(110)이 포함하는 복호화부(112)를 이용하여 복원한 후, 복원된 인스트럭션 1(140)을 코드 세그먼트(120)의 랜덤하게 선택된 제1 위치에 위치시킨 후 실행할 수 있다. 또한, 가상 머신(110)은 복원된 인스트럭션 1(140)을 실행한 후, 코드 세그먼트(120)에서 실행이 완료된 복원된 인스트럭션 1(140)을 제거한 후, 다음 인스트럭션의 실행을 시작할 수 있다.
도 2는 가상 머신(110)이 암호화된 인스트럭션 2(132)를 복호화부(112)를 통해 복원한 후, 복원된 인스트럭션 2(210)를 코드 세그먼트(120)의 랜덤하게 선택된 제2 위치에 위치시킨 후 실행하는 예를 나타내고 있다. 이때, 도 2는 도 1에서 제1 위치에 위치되었던 복원된 인스트럭션 1(140)이 이미 삭제된 모습을 나타내고 있다.
이와 유사하게, 가상 머신(110)은 그룹(130)이 포함하는 암호화된 인스트럭션들을 순차적으로 복원하고 코드 세그먼트(120)상의 랜덤한 위치에 위치시켜 실행할 수 있으며, 실행이 완료된 인스트럭션들을 코드 세그먼트(120)상에서 제거할 수 있다. 예를 들어, 도 2에서 복원된 인스트럭션 2(210)의 실행이 완료되는 경우, 가상 머신(120)은 코드 세그먼트(120)상에서 복원된 인스트럭션 2(210)를 제거할 수 있으며, 암호화된 인스트럭션 3(133), 암호화된 인스트럭션 4(134), 암호화된 인스트럭션 5(135)와 같이 순차적으로 코드들을 실행해나갈 수 있다.
이처럼 각각의 인스트럭션들은 가상 머신(110)이 할당한 세그먼트인 코드 세그먼트(120)에서 실행된 뒤 제거되기 때문에 동적분석을 통해 인스트럭션들을 역 추적하여 코드를 분석을 어렵게 할 수 있다. 예를 들어, 암호화된 인스트럭션 3(133)를 처리하는 과정에서 동적분석이 시작되었다고 하더라도, 복원된 인스트럭션 2(210)와 복원된 인스트럭션 1(140)은 이미 코드 세그먼트(120)상에서 제거된 이후이기 때문에, 동적분석을 진행하는 공격자에게 복원된 인스트럭션 2(210)와 복원된 인스트럭션 1(140)의 내용이 노출되지 않는다.
한편, 도 1 및 도 2의 실시예에서는 인스트럭션의 단위로, 복원, 로드, 실행, 제거의 과정들이 진행되는 예를 설명하였으나, 복수의 인스트럭션들의 묶음의 단위, 함수의 단위 등과 같이 복원, 로드, 실행 제거의 과정들은 그룹핑된 코드의 단위로 확장되어 진행될 수도 있다. 이러한 단위의 코드를 '원타임 코드'라 명명할 수 있으며, 이 경우에도 공격자는 동적분석이 실행된 시점 이전에 실행되어 제거된 원타임 코드에 대한 정보를 얻을 수 없게 되어, 해당 컴퓨터 프로그램에 대한 동적분석을 어렵게 만들 수 있다.
이때, 리로케이터(111)는 이러한 원타임 코드를 위치에 독립적인 코드로 만들기 위해 활용될 수 있다. 이때, 원타임 코드 내에서 라이브러리나 원타임 코드 외부의 함수를 호출하는 것과 같이 원타임 코드 외부의 오프셋이 요구되는 경우에는 리로케이션(relocation)이 요구되며, 이러한 리로케이션은 리로케이터(111)와 같은 리로케이션 모듈에 의해 원타임 코드를 실행하는 과정에서 처리될 수 있다. 예를 들어, 리로케이터(111)는 원타임 코드에서 요구되는 외부 코드에 대한 주소 값을 원타임 코드에 인자의 형태로서 전달함으로써, 원타임 코드가 독립적으로 실행될 수 있게 된다. 이를 위해, 개별 코드들은 위치 독립적인 코드로 생성될 수 있으며, 하나의 코드에서 외부의 함수는 리로케이션된 주소 값을 통해 호출될 수 있다. 아래 표 1은 위치 독립적인 코드의 예와 위치 독립적이지 않은 코드의 예를 각각 나타내고 있다.
위치 독립적이지 않은 코드 위치 독립적인 코드
Normal function(){
}
Dependent function(){

Normal function()
Fopen()

}
InDependent function(addr1, addr2){

addr1()
addr2()

}
표 1은 위치 독립적인지 않은 코드의 경우, 외부 코드(Normal function(), Fopen())가 동적으로 호출되어야 하는 반면, 위치 독립적인 코드의 경우, 호출해야 할 외부 코드(addr1(), addr2())에 대한 주소 값을 인자(addr1, addr2)로서 전달받아 독립적으로 처리될 수 있음을 나타내고 있다.코드들의 주소 값은 가상 머신(110)이 포함하는 리로케이터(111)에 의해 특정 파일(일례로, 안드로이드 운영체제의 경우, 확장자 ".got"의 파일)상에 미리 기록될 수 있으며, 리로케이터(111)는 현재 실행되어야 할 원타임 코드와 관련된 주소 값을 해당 특정 파일에서 읽어와 인자로서 해당 원타임 코드로 전달할 수 있다.
도 3은 본 발명의 일실시예에 있어서, 원타임 코드를 이용한 코드 보호 방법의 예를 도시한 흐름도이다. 본 실시예에 따른 코드 보호 방법은 컴퓨터 프로그램을 실행시키는 컴퓨터 장치에 의해 수행될 수 있다. 예를 들어, 컴퓨터 장치가 포함하는 적어도 하나의 프로세스는 컴퓨터 장치가 포함하는 메모리가 포함하는 운영체제의 코드나 적어도 하나의 프로그램의 코드에 따른 제어 명령(instruction)을 실행하도록 구현될 수 있다. 여기서, 적어도 하나의 프로세서는 컴퓨터 장치에 저장된 코드가 제공하는 제어 명령에 따라 컴퓨터 장치가 도 3의 방법이 포함하는 단계들(310 내지 360)을 수행하도록 컴퓨터 장치를 제어할 수 있다.
단계(310)에서 컴퓨터 장치는 보호하고자 하는 컴퓨터 프로그램의 실행에 응답하여 컴퓨터 프로그램의 코드를 실행하는 가상 머신을 생성할 수 있다. 일반적으로 가상 머신은 운영 체제나 응용 프로그램을 설치 및 실행하기 위한 기능을 포함할 수 있으며, 서로 다른 기능들을 갖는 여러 종류의 가상 머신들이 존재한다. 본 실시예에 따른 가상 머신은 본 실시예에 따른 코드 보호 방법에 따라 이후 단계들(320 내지 360)을 수행하도록 컴퓨터 장치를 제어하기 위한 기능을 포함할 수 있다.
단계(320)에서 컴퓨터 장치는 가상 머신의 제어에 따라 메모리상에 실행가능한 세그먼트를 로드할 수 있다. 이미 설명한 바와 같이, 세그먼트는 프로그램이나 데이터를 세그먼트 또는 섹션이라는 가변 크기로 관리하는 메모리 관리 방식에서 메모리상에 할당되는 가변 크기의 영역을 의미할 수 있으며, 컴퓨터 장치는 가상 머신은 메모리상에 실행가능한 세그먼트가 할당되도록 컴퓨터 장치를 제어할 수 있다. 일반적으로 코드의 실행은 텍스트 세그먼트를 통해 이루어질 수 있으나, 본 실시예에 따른 가상 머신은 코드가 실행될 별도의 실행가능한 세그먼트를 동적으로 로드할 수 있다.
단계(330)에서 컴퓨터 장치는 가상 머신의 제어에 따라 컴퓨터 프로그램이 포함하는 암호화된 인스트럭션을 복원할 수 있다. 본 발명의 실시예들은 메모리 덤프와 같은 컴퓨터 프로그램에 대한 동적분석을 방지하기 위한 기술로, 만약 보호되어야 할 인스트럭션들이 암호화되어 있지 않다면, 파일상에서 이미 인스트럭션들의 내용이 노출되기 때문에 동적분석의 방지 자체가 아무런 의미가 없게 된다. 따라서, 본 실시예에서는 파일상에서 인스트럭션들이 노출되는 것을 방지하기 위해, 보호되어야 할 인스트럭션들이 암호화(난독화 포함)되어 있는 상태라 가정한다. 앞서 설명한 바와 같이, 암호화된 인스트럭션을 복원하기 위해, 가상 머신은 도 2를 통해 설명한 복호화부(112)와 같은 복원 모듈을 포함할 수 있으며, 이러한 복원 모듈을 통해 컴퓨터 장치가 암호화된 인스트런션을 복원하도록 제어할 수 있다.
단계(340)에서 컴퓨터 장치는 가상 머신의 제어에 따라 복원된 인스트럭션을 실행가능한 세그먼트에서 랜덤하게 선택된 위치에 로드할 수 있다. 예를 들어, 가상 머신은 실행가능한 세그먼트를 n(n은 2 이상의 자연수, 일례로 50 또는 100) 등분으로 분할할 수 있으며, n 개의 영역들 중에서 랜덤하게 선택되는 하나의 영역에 복원된 인스트럭션이 로딩되도록 컴퓨터 장치를 제어할 수 있다.
단계(350)에서 컴퓨터 장치는 가상 머신의 제어에 따라 랜덤하게 선택된 위치에 로드된 인스트럭션을 실행할 수 있다. 이미 설명한 바와 같이, 코드의 실행은 가상 머신의 가장 일반적인 기능일 수 있다.
단계(360)에서 컴퓨터 장치는 가상 머신의 제어에 따라 실행된 인스트럭션을 실행가능한 세그먼트에서 제거할 수 있다. 앞서 설명한 바와 같이, 실행가능한 세그먼트에서 인스트럭션이 제거됨에 따라 공격자가 메모리 덤프와 같은 동적분석을 시도하더라도 이미 제거된 인스트럭션에 대한 정보를 얻을 수 없게 된다.
한편, 도 3의 단계(330) 내지 단계(360)에서는 하나의 암호화된 인스트럭션을 처리하는 과정을 설명하고 있으나, 이후 컴퓨터 장치는 컴퓨터 프로그램이 포함하는 다음 암호화된 인스트럭션에 대해 단계(330) 내지 단계(360)를 반복 수행할 수 있다.
이처럼, 하나의 암호화된 인스트럭션을 실행하는 과정이 해당 인스트럭션을 실행가능한 세그먼트에서 제거하는 동작을 포함하고 있기 때문에, 특정 암호화된 인스트럭션을 처리하는 과정에서 동적분석이 진행된다 하더라도, 공격자는 현재 처리중인 인스트럭션 이전의 인스트럭션에 대한 정보를 얻을 수 없게 된다.
또한, 도 3의 실시예 역시 인스트럭션의 단위로, 복원, 로드, 실행, 제거의 과정들이 진행되는 예를 설명하였으나, 앞서 설명한 바와 같이 원타임 코드는 복수의 인스트럭션들의 단위, 함수의 단위 등과 같이 복원, 로드, 실행 제거의 과정들이 진행되는 그룹핑된 코드(코드 그룹)의 단위로 확장될 수도 있다.
또한, 가상 머신은 앞서 설명한 바와 같이 원타임 코드를 위치에 독립적인 코드로 만들기 위해 리로케이션을 처리할 수 있다.
다른 실시예로, 동적분석의 방지를 위해, 코드의 실행 위치를 변화시킬 수도 있다. 기존에는 코드의 실행을 위해 코드가 실행되는 특정 위치를 요구하였다. 예를 들어, 기존에는 특정 so 파일을 위한 텍스트(.text) 섹션의 특정 오프셋(offset)에 해당 코드가 들어가야만 하고, 해당 so 파일이 실행됨에 따라 해당 코드도 함께 실행되는 한계가 존재하였다. 이 경우, 탐지 모듈을 위한 코드가 'a.so' 파일에 위치하는 경우, a.so 파일이 탐지 모듈의 우회를 위한 타겟이 될 수 있다. 이러한 한계를 극복하기 위해 본 실시예에서는 추첨을 통해 코드의 실행 위치를 결정하도록 함으로써, 컴퓨터 프로그램의 런타임시마다 해당 코드가 랜덤한 위치에서 실행되도록 할 수 있는 코드 보호 방법을 설명한다.
도 4는 본 발명의 일실시예에 있어서, 코드 스프레잉의 개념을 설명하기 위한 도면이다. 도 4는 기존 안드로이드 응용 프로그램 패키지(Android application package)인 제1 APK(410)에서 보안 모듈이 'security.so' 파일(411)의 형태로 포함된 예를 나타내고 있다. 이때, 보안 모듈이 하나의 파일의 형태로 구현되는 경우, 해당 파일은 공격자들에게 타겟이 될 수 있으며, 분석의 대상이 될 수 있다.
또한, 도 4는 본 실시예에 따른 안드로이드 응용 프로그램 패키지(Android application package)인 제2 APK(420)에 포함된 다수의 파일들(native1.so, native2.so, native3.so, native4.so 및 native5.so)에 보안 모듈이 복수의 조각들(421 내지 429)로서 스프레잉된 예를 나타내고 있다. 이러한 코드 스프레잉은 보안 모듈을 하나의 파일의 형태가 아닌 파일 패키지가 포함하는 다수의 파일들에 스프레잉(spraying)하는 형태로 제공함으로써, 실체가 없으면서 랜덤한 위치(시점)에 트리거링될 수 있는 보안 모듈을 제공할 수 있게 한다. 이 경우, 공격자들은 공격의 타겟을 파악할 수 없게 된다. 이러한 코드 스프레잉은 보안 모듈뿐만 아니라, 보호하고자 하는 다양한 코드들에 대해 적용될 수 있다.
도 5는 본 발명의 일실시예에 있어서, 코드의 실행 위치 추첨의 예를 도시한 도면이다. 도 5는 'a.so' 파일(510), 'b.so' 파일(520) 및 'c.so' 파일(530)의 세 개의 파일에 델리게이터(delegator) 1(511), 델리게이터 2(512), 델리게이터 3(521), 델리게이터 4(522), 델리게이터 5(523), 델리게이터 6(531) 및 델리게이터 7(532)의 7 개의 델리게이터들을 스프레잉(spraying)한 예를 나타내고 있다. 이때, 델리게이터들 각각은 로드부와 실행부를 포함할 수 있다. 로드부는 실행 위치를 변화시키고자 하는 암호화된 코드를 복원하기 위한 모듈일 수 있다. 또한, 실행부는 복원된 코드를 실행하기 위한 모듈일 수 있다.
이러한 델리게이터들은 단일 연결 리스트(Singly Linked List, SLL)의 데이터 구조를 통해 서로 연결되어 코드 체인을 형성할 수 있으며, 실행 위치를 변화시키고자 하는 코드에 대한 추첨을 통해 델리게이터들 중에서 선정되는 하나의 델리게이터가 해당 코드를 독점하여 실행시킬 수 있다. 예를 들어, 델리게이터 2(512)가 해당 코드를 독점하여 실행시키는 경우, 해당 코드는 'a.so' 파일(510)과 연관하여 실행 위치가 결정될 수 있다. 반면, 델리게이터 6(531)가 해당 코드를 독점하여 실행시키는 경우, 해당 코드는 'c.so' 파일(530)과 연관하여 실행 위치가 결정될 수 있다. 이때, 코드에 대한 추첨은 컴퓨터 프로그램의 런타임시마다 수행될 수 있으며, 다수의 델리게이터들 중 랜덤하게 선택되는 델리게이터가 해당 코드를 독점하여 실행시킬 수 있다. 다시 말해, 해당 코드의 실행 위치가 컴퓨터 프로그램의 런타임시마다 랜덤하게 변경될 수 있으며, 반복적인 실행을 통한 분석인 동적분석에 상당히 어려움을 줄 수 있다.
컴퓨터 프로그램에서 사용하는 복수의 모듈들(일례로, 안드로이드 운영체제의 어플리케이션의 경우, so 파일들)간의 연결은 앞서 설명한 단일 연결 리스트를 통해 이루어질 수 있다. 예를 들어, 메모리 맵 파일(memory mapped file, MMF)에는 각 모듈들(일례로, so 파일들)의 세그먼트 주소가 포함될 수 있으며, 하나의 델리게이터의 주소가 해당 델리게이터가 포함된 모듈의 데이터 세그먼트 주소의 끝 부분에 기록될 수 있다. 예를 들어, 메모리 맵 파일에서 'a.so' 파일(510)의 데이터 세그먼트 주소의 끝 부분(일반적으로 null로 패딩되어 있는 부분)에는 'a.so' 파일(510)에 포함된 델리게이터의 수인 '2'와 함께, 델리게이터 1(511)의 주소와 델리게이터 2(512)의 주소가 각각 기록(null 대신)될 수 있다. 이와 유사하게 메모리 맵 파일에서 'b.so' 파일(520)의 데이터 세그먼트 주소의 끝 부분에는 'b.so' 파일(520)에 포함된 델리게이터의 수인 '3'과 함께, 델리게이터 3(521)의 주소, 델리게이터 4(522)의 주소 및 델리게이터 5(523)의 주소가 각각 기록될 수 있다. 이때, 이러한 주소들을 통해 델리게이터들간에 단일 연결 리스트가 생성되어 복수의 모듈들을 통과하는 코드 체인이 형성될 수 있다.
이때, 코드 체인에 포함된 델리게이터들에 대한 추첨은 일례로, 서로 다른 복수의 값들을 포함하는 데이터 구조로부터 랜덤하게 추출되는 값들을 순차적으로 코드 체인에 포함된 델리게이터들에게 할당하고, 가장 큰 값이 할당된 델리게이터를 선택하는 방식으로 이루어질 수 있다. 코드 체인이 포함하는 델리게이터들 중 하나를 랜덤하게 선택할 수 있는 방식이라면 추첨 방식은 제한되지 않는다.
한편, 서로 다른 복수의 코드들이 컴퓨터 프로그램의 런타임시마다 서로 다른 위치를 가질 수도 있다. 예를 들어, 실행 위치를 동적으로, 그리고 랜덤하게 결정하고자 하는 코드 A와 코드 B, 그리고 코드 C가 존재한다고 가정한다. 이때, 델리게이터들에 할당된 값들이 가장 큰 순서로 세 개의 델리게이터들을 추첨하고, 추첨된 세 개의 델리게이터들이 코드 A와 코드 B, 그리고 코드 C를 실행하도록 할 수 있다. 도 5의 예에서, 순차적으로 델리게이터 5(523), 델리게이터 7(532) 및 델리게이터 1(511)이 선택되었다고 가정할 때, 델리게이터 5(523)가 코드 A를 호출하여 복원 및 실행하고, 델리게이터 7(532)가 코드 B를 호출하여 복원 및 실행하며, 델리게이터 1(511)이 코드 C를 호출하여 복원 및 실행하는 실시예가 고려될 수 있다. 다시 말해, 코드 A는 'c.so' 파일(530)과 연관하여 실행 위치가 결정될 수 있고, 코드 B는 'b.so' 파일(520)과 연관하여 실행 위치가 결정될 수 있으며, 코드 C는 'a.so' 파일(520)과 연관하여 실행 위치가 결정될 수 있다. 컴퓨터 프로그램의 런타임시마다 델리게이터들에 대한 추첨이 다시 진행되기 때문에 코드들에 대해 결정되는 실행 위치 역시 컴퓨터 프로그램의 런타임시마다 달라질 수 있다.
예를 들어, 안드로이드 응용 프로그램 패키지(Android application package, APK)에서 어플리케이션의 보호를 위한 보호 모듈은 별도의 so 파일의 형태로 APK에 포함된다. 이 경우, 보호 모듈에 대한 우회를 위해 특정 so 파일이 타겟이 될 수 있다. 반면, 본 실시예에 따른 코드 보호 방법에서는 앞서 설명한 바와 같이, 보호 모듈을 위한 코드가 어플리케이션의 런타임시마다 복수의 so 파일들 중에서 선택되는 so 파일과 연관된 실행 위치에서 실행될 수 있기 때문에 동적분석을 보다 어렵게 만들 수 있다.
도 6은 본 발명의 일실시예에 있어서, 코드 실행 위치의 추첨을 이용한 코드 보호 방법의 예를 도시한 흐름도이다. 본 실시예에 따른 코드 보호 방법은 컴퓨터 프로그램을 실행시키는 컴퓨터 장치에 의해 수행될 수 있다. 예를 들어, 컴퓨터 장치가 포함하는 적어도 하나의 프로세스는 컴퓨터 장치가 포함하는 메모리가 포함하는 운영체제의 코드나 적어도 하나의 프로그램의 코드에 따른 제어 명령(instruction)을 실행하도록 구현될 수 있다. 여기서, 적어도 하나의 프로세서는 컴퓨터 장치에 저장된 코드가 제공하는 제어 명령에 따라 컴퓨터 장치가 도 6의 방법이 포함하는 단계들(610 내지 640)을 수행하도록 컴퓨터 장치를 제어할 수 있다.
단계(610)에서 컴퓨터 장치는 컴퓨터 프로그램이 포함하는 복수의 모듈들에 분산되어 있는 복수의 델리게이터들을 식별하여 코드 체인을 생성할 수 있다. 예를 들어, 컴퓨터 장치는 컴퓨터 프로그램의 제어에 따라 컴퓨터 프로그램이 포함하는 복수의 파일들에 분산되어 있는 복수의 델리게이터들을 식별한 후 단일 연결 리스트의 구조로 서로 연결하여 코드 체인을 생성할 수 있다. 이미 설명한 바와 같이, 메모리 맵 파일에는 각 모듈들(일례로, so 파일들)의 세그먼트 주소가 포함될 수 있으며, 하나의 델리게이터의 주소가 해당 델리게이터가 포함된 모듈의 데이터 세그먼트 주소의 끝 부분에 기록될 수 있다. 컴퓨터 장치는 이러한 델리게이터의 주소를 통해 복수의 델리게이터들을 식별할 수 있으며, 복수의 파일들과 같은 복수의 모듈들에 분산되어 있는 복수의 델리게이터들을 연결할 수 있다.
단계(620)에서 컴퓨터 장치는 컴퓨터 프로그램의 제어에 따라 생성된 코드 체인의 복수의 델리게이터들에 대한 랜덤한 추첨을 통해 컴퓨터 프로그램이 포함하는 암호화된 제1 코드를 독점할 델리게이터를 선정할 수 있다. 예를 들어, 컴퓨터 장치는 이미 설명한 바와 같이, 서로 다른 복수의 값들을 포함하는 데이터 구조로부터 랜덤하게 추출되는 값들을 순차적으로 코드 체인에 포함된 델리게이터들에게 할당하고, 가장 큰 값이 할당된 델리게이터를 암호화된 제1 코드를 독점할 델리게이터로서 선정할 수 있다.
단계(630)에서 컴퓨터 장치는 선정된 델리게이터를 통해 암호화된 제1 코드를 복원할 수 있다. 파일에 포함된 제1 코드의 노출을 방지하기 위해, 제1 코드는 암호화된 상태로 컴퓨터 프로그램에 포함되어 있을 수 있다. 따라서, 제1 코드를 메모리상에 위치시켜 실행시키기 위해, 컴퓨터 장치는 우선 암호화된 제1 코드를 복원할 수 있으며, 이때 복수의 델리게이터 각각은 암호화된 제1 코드를 복원할 수 있는 로드부를 포함할 수 있다.
단계(640)에서 컴퓨터 장치는 선정된 델리게이터를 통해 복원된 제1 코드를 실행함으로써, 선정된 델리게이터의 실행 시점에 제1 코드의 실행을 랜덤하게 트리거링할 수 있다. 일례로, 도 5의 실시예에서 델리게이터 2(512)가 선정된 경우, 'a.so' 파일(510)이 실행되어 델리게이터 2(512)에 대응하는 코드가 실행되는 시점에 단계(630) 및 단계(640)이 실행되어 제1 코드가 실행될 수 있다. 만약, 델리게이터 7(532)이 선정된 경우, 'c.so' 파일(530)이 실행되어 델리게이터 7(432)에 대응하는 코드가 실행되는 시점에 단계(630) 및 단계(640)이 실행되어 제1 코드가 실행될 수 있다.
이처럼 본 실시예에 따른 코드 보호 방법은 특정 파일에 타겟팅되지 않는 본체가 없는 코드를 제공할 수 있으며, 실행을 위한 트리거 시점이 랜덤인 코드를 제공함으로써, 해당 코드에 대한 정보가 동적분석 등을 통해 노출되는 것을 방지할 수 있다.
한편 도 4에서 설명한 바와 같이, 하나의 모듈이 스프레잉되는 경우도 고려될 수 있다.
또 다른 실시예로, 코드 체인 검증을 이용한 코드 보호 방법을 설명한다. 본 실시예에 따른 코드 체인 검증은 서버에서 전달되는 코드를 실행할 때, 혹은 로컬의 코드를 실행할 때, 적법한 코드만이 추가되었음을 보증할 수 있으며, 또한 코드가 제대로 실행되었는지 여부 및 코드의 무결성을 검증하기 위해 활용될 수 있다. 추가적으로 본 실시예에 따른 코드 체인 검증은 다수의 개발자들에 의해 어플리케이션이 개발된 경우, 다른 개발자에 의해 작성된 코드 바이트 값을 알 수 없도록 하는 부가적 기능을 제공할 수 있다.
도 7은 본 발명의 일실시예에 있어서, 코드 체인 검증을 위한 해쉬 계산 과정의 예를 도시한 도면이다. 도 7은 코드 그룹 1(710)을 개시하고 있으며, 코드 그룹 1(710)이 네 개의 함수들(711 내지 714)을 포함하고 있는 예를 나타내고 있다. 이때, 코드 그룹 1(710)의 함수 해쉬(function hash)는 도 7에 도시된 'h4'와 같이 계산될 수 있다. 코드 그룹 1(710)의 함수 해쉬를 계산하고자 하는 장치는 코드 그룹 1(710)의 첫 번째 함수 'Func1(p1)'(711)에서 파라미터 'p1'을 추출하고, 추출된 'p1'을 해쉬 함수의 파라미터로 이용하여 해쉬값 'h1'을 계산할 수 있다. 이후, 장치는 코드 그룹 1(710)의 두 번째 함수 'Func2(p1, p3)'(712)에서 파라미터 'p1' 및 파라미터 'p3'를 추출하고, 추출된 'p1' 및 'p3'를 해쉬 함수의 파라미터로 이용하여 해쉬값 'Hash(p1, p3)'을 생성한 후, 생성된 해쉬값 'Hash(p1, p3)'과 앞서 계산된 해쉬값 'h1'을 다시 해쉬 함수의 파라미터로 이용하여 해쉬값 'h2'를 계산할 수 있다. 이와 유사하게 장치는 코드 그룹 1(710)의 세 번째 함수 'Func3(p1)'(713)에서 파라미터 'p1'을 추출하고, 추출된 'p1'을 해쉬 함수의 파라미터로 이용하여 해쉬값 'Hash(p1)'을 생성한 후, 생성된 해쉬값 'Hash(p1)'와 앞서 계산된 해쉬값 'h2'를 다시 해쉬 함수의 파라미터로 이용하여 해쉬값 'h3'을 계산할 수 있다. 또한, 장치는 코드 그룹 1(710)의 네 번째 함수 'Func4(p1, p2)'(714)에서 파라미터 'p1' 및 파라미터 'p2'를 추출하고, 추출된 'p1' 및 'p2'를 해쉬 함수의 파라미터로 이용하여 해쉬값 'Hash(p1, p2)'를 생성한 후, 생성된 해쉬값 'Hash(p1, p2)'와 앞서 계산된 해쉬값 'h3'을 다시 해쉬 함수의 파라미터로 이용하여 해쉬값 'h4'를 계산할 수 있다. 코드 그룹 1(710)이 포함하는 모든 함수들에 대해 이러한 해쉬값의 계산이 완료되면, 최종적으로 계산된 해쉬값인 'h4'가 코드 그룹 1(710)의 함수 해쉬가 될 수 있다.
이때, 앞서 설명한 바와 같이, 함수 해쉬의 계산은 대상이 되는 코드 그룹의 함수들에 대해서만 수행될 수도 있으나, 함수의 형태가 아닌 인스트럭션을 함수의 형태로 변경하여 코드 그룹이 포함하는 모든 인스트럭션들 각각에 대해서 수행될 수도 있다. 예를 들어, 'int a = 10;'과 같은 인스트럭션은 함수의 형태가 아니지만, 장치는 'int a = 0;'을 'createInt(10)'과 같은 함수의 형태로 구성하여 함수 해쉬의 계산에 참여시킬 수도 있다. 이 경우, 함수의 형태로 구성이 가능한 코드 그룹의 모든 인스트럭션들이 코드 그룹의 함수 해쉬의 계산에 참여하게 된다. 또한, 코드 그룹에 대한 함수 해쉬가 생성되면, 해당 코드 그룹에 대한 원장(ledger) 또한 생성될 수 있다.
도 8은 본 발명의 일실시예에 따른 원장의 예를 도시한 도면이다. 도 7에 도시된 바와 같이, 원장(810)은 키(Key, 720)와 키(820)를 이용하여 암호화된 함수 해쉬(730)를 포함할 수 있다. 도 7의 실시예를 고려하면, 키(820)는 코드 그룹 1(710) 전체에 대한 해쉬로서 생성될 수 있고, 암호화된 함수 해쉬는 'h4'를 키(820)을 이용하여 암호화한 결과를 포함할 수 있다.
코드 그룹 1(710)이 포함된 컴퓨터 프로그램을 설치 및 구동하는 컴퓨터 장치를 고려한다. 이때, 컴퓨터 장치는 컴퓨터 프로그램의 제어에 따라 코드 그룹 1(710)의 제1 해쉬를 계산할 수 있으며, 계산된 해쉬와 원장(810)에 포함된 코드 그룹 1(710)의 제2 해쉬를 비교할 수 있다. 만약, 제1 해쉬와 제2 해쉬가 서로 다른 경우, 코드 그룹 1(710) 또는 원장(810) 중 적어도 하나가 변경되었음을 인식할 수 있다. 또한, 컴퓨터 장치는 제1 해쉬와 제2 해쉬가 동일한 경우, 제1 해쉬 또는 제2 해쉬를 키(820)로 이용하여 원장(810)에 포함된 암호화된 함수 해쉬(830)의 복원을 시도할 수 있다. 만약, 키(820)를 통해 암호화된 함수 해쉬(830)를 복원할 수 없다면, 이 역시 코드 그룹 1(710) 및/또는 원장(810)에 변경이 있었음을 의미하게 된다. 또한, 컴퓨터 장치는 컴퓨터 프로그램의 제어에 따라 코드 그룹 1(710)의 함수 해쉬를 계산할 수 있다. 이때, 암호화된 함수 해쉬(830)가 복원되어 'h4'가 얻어진다 하더라도, 컴퓨터 장치가 코드 그룹 1(710)에 대해 계산한 함수 해쉬가 'h4'와 다른 경우, 코드 그룹 1(710) 및/또는 원장(810)이 변경되었음을 알 수 있게 된다. 특히, 'h4'와 같은 함수 해쉬는 코드 그룹이 포함하는 모든 함수(또는 함수의 형태로 변형 가능한 모든 인스트럭션)에 대해 중첩하여 해쉬값을 계산하기 때문에 공격자는 코드 그룹이 포함하는 모든 함수(또는 함수의 형태로 변형 가능한 모든 인스트럭션) 각각에 따라 중첩되는 모든 해쉬값을 변경할 수 있어야만 코드 그룹의 적어도 일부 함수(또는 인스트럭션)을 변경할 수 있게 된다. 따라서, 앞서 설명한 바와 같이, 본 실시예에 따른 함수 해쉬와 원장의 활용은 코드 그룹에 적법한 코드만이 추가되어 있음을 보증할 수 있으며, 또한 코드가 제대로 실행되었는지 여부와 코드의 무결성을 검증하는데 활용할 수 있게 된다.
도 9는 본 발명의 일실시예에 있어서, 새로운 코드 그룹의 추가에 따라 원장을 갱신하는 예를 도시한 도면이다. 도 9는 코드 그룹 a에 대한 제1 원장(910)이 코드 그룹 a의 해쉬를 키(911)로서 포함하고, 코드 그룹 a의 함수 해쉬를 키(911)로 암호화한 값(912)을 포함하여 구성됨을 개시하고 있다. 또한, 도 9는 코드 그룹 b가 추가됨에 따라 제1 원장(910)이 제2 원장(920)과 같이 갱신되는 예를 나타내고 있다. 이때, 제2 원장(920)은 코드 그룹 b의 해쉬를 키(921)로서 포함하고, 코드 그룹 b의 함수 해쉬와 제1 원장(910)을 키(921)로 암호화한 값(922)을 포함하여 구성됨을 개시하고 있다. 다시 말해, 코드 그룹 a와 코드 그룹 b의 모든 함수(또는 함수의 형태로 변형 가능한 모든 인스트럭션)이 제대로 실행(개발자가 목적한 바와 같이 실행)될 수 있는 상태여야만 코드 그룹 a와 코드 그룹 b가 원장(920)이 포함하는 정보를 만족시킬 수 있음을 알 수 있다.
이때, 원장을 생성하는 장치는 컴퓨터 프로그램을 실행하고자 하는 컴퓨터 장치와는 별도의 장치일 수 있으며, 코드 그룹에 대한 원장을 코드 그룹에 대한 검증값으로서 생성하여 제공함으로써, 코드 그룹과 원장을 가진 컴퓨터 장치가 코드 그룹에 대한 적법성, 무결성 등을 검증할 수 있도록 도울 수 있다.
도 10은 본 발명의 일실시예에 있어서, 코드 체인 검증을 이용한 코드 보호 과정의 예를 도시한 도면이다. 도 10은 컴퓨터 프로그램이 포함하는 'aaa.so' 파일(1010)과 'bbb.so' 파일(1020)의 예를 나타내고 있으며, 'aaa.so' 파일(1010)과 'bbb.so' 파일(1020)에 분산되어 있는 코드 그룹 1(1030), 코드 그룹 2(1040), 코드 그룹 3(1050) 및 코드 그룹 4(1060)을 개시하고 있다. 이때, 코드 그룹 1(1030)은 코드 조각(code piece) 1(1031)과 코드 조각 2(1032)를, 코드 그룹 2(1040)는 코드 조각 3(1041) 및 코드 조각 4(1042)를, 코드 그룹 3(1050)은 코드 조각 5(1051) 및 코드 조각 6(1052)을, 그리고 코드 그룹 4(1060)는 코드 조각 7(1061) 및 코드 조각 8(1062)을 각각 포함하고 있는 예를 나타내고 있다. 이때, 파일의 수나 코드 그룹의 수 및/또는 코드 조각의 수는 필요에 따라 다양하게 설정될 수 있음을 통상의 기술자가 쉽게 이해할 수 있을 것이다.
컴퓨터 장치에서 컴퓨터 프로그램이 실행될 때, 컴퓨터 프로그램은 코드 그룹 1(1030), 코드 그룹 2(1040), 코드 그룹 3(1050) 및 코드 그룹 4(1060)를 단일 연결 리스트의 데이터 구조로 서로 연결하여 코드 체인을 형성하도록 컴퓨터 장치를 제어할 수 있다. 예를 들어, 각각의 코드 그룹들(1030, 1040, 1050 및 1060)은 코드 체인을 구성하기 위한 코드를 포함할 수 있다. 도 10에 도시된 바와 같이 하나의 파일(일례로, aaa.so(910))은 복수의 코드 그룹들(1030 및 1040)을 포함할 수 있으며, 그 중 마스터 코드 그룹이 존재할 수 있다. 일례로, 도 10에서 코드 그룹 1(1030)이 마스터 코드 그룹이라 가정한다. 마스터 코드 그룹을 위한 로직에는 마스터 코드 그룹이 연결할 다음 체인의 so 파일(일례로, bbb.so(920))의 이름이 포함되어 있을 수 있으며, 마스터 코드 그룹은 이러한 이름을 기반으로 단일 연결 리스트를 구성할 수 있다. 예를 들어, 마스터 코드 그룹의 객체 인스턴스는 4byte(32bit system기준) address 값을, 데이터 섹션의 얼라인(align)을 위해서 널(null)로 패딩(padding)된 영역에 라이트(write)할 수 있다. 보다 구체적인 예로, 마스터 코드 그룹은 리드 온리(read only) 영역에 있는 코드 조각들(일례로, 마스터 코드 그룹으로서의 코드 그룹 1(1030)의 경우, 코드 조각 1(1031), 코드 조각 2(1032), 코드 조각 3(1041) 및 코드 조각 4(1042))을 읽어서 코드 조각의 객체 인스턴스들을 생성하고, 내부적으로 코드 조각들의 객체 리스트를 유지할 수 있다. 또한, 마스터 코드 그룹은 읽은 코드 조각들을 암호화하여 데이터 섹션의 맨 끝(널로 패딩된 영역)에 기록할 수 있다. 추후, 마스터 코드 그룹은 다른 파일의 마스터 코드 그룹의 주소를 읽어서 자신의 체인에 포함시킬 수 있다. 예를 들어, aaa.so(910)의 마스터 코드 그룹으로서의 코드 그룹 1(1030)은 bbb.so(920)의 마스터 코드 그룹으로서의 코드 그룹 3(950)의 주소 그룹을 bbb.so(920)의 데이터 섹션에서 읽어와 체인에 포함시킴으로써, aaa.so(910)와 bbb.so(920)의 서로 다른 모듈간에도 체인이 연결될 수 있다.
앞서 설명한 코드 스프레잉과 관련하여, 코드 조각들이 도 5를 통해 설명한 델리게이터들에 대응할 수 있다. 예를 들어, 도 10에서 코드 조각 3(1041)이 랜덤하게 선택되는 경우, 코드 조각 3(1041)이 델리게이터로서 해당 위치(시점)에서 코드를 실행(암호화된 코드의 복호화 및 실행)시킬 수 있다. 이때, 매 런타임 시마다 랜덤하게 선택(추첨)되는 코드 조각이 실행될 수 있다.
또한, 컴퓨터 프로그램은 코드 조각들 중 임의의 두 개의 코드 조작들을 실행부와 검증부로서 동작하도록 랜덤하게 선정하도록 컴퓨터 장치를 제어할 수 있다. 도 10에서는 코드 조각 3(1041)이 실행부로서 선정되고, 코드 조각 6(1052)이 검증부로서 선정된 예를 나타내고 있다.
실행부는 컴퓨터 프로그램이 포함하는 원장에 포함된 코드 그룹의 해쉬를 통해 원장이 포함하는 암호화된 값(코드 그룹의 함수 해쉬를 코드 그룹의 해쉬로 암호화한 값)으로 복원할 수 있는지 여부를 검증할 수 있다. 만약, 원장이 포함하는 암호화된 값이 코드 그룹의 해쉬를 통해 복원되지 않는다면, 컴퓨터 장치는 코드 그룹 및/또는 원장이 변경되었음을 파악할 수 있게 된다.
검증부는 컴퓨터 프로그램의 런타임시에 코드 그룹의 제1 함수 해쉬를 계산하여 원장에서 복원되는 제2 함수 해쉬와 비교함으로써, 코드 그룹 및/또는 원장의 변경 여부를 결정할 수 있다. 예를 들어, 검증부는 제1 함수 해쉬와 제2 함수 해쉬가 서로 다른 경우, 코드 그룹 및/또는 원장이 변경된 것으로 결정할 수 있다.
이러한 실행부와 검증부의 선정 및 실행부와 검증부의 동작은 컴퓨터 프로그램의 런타임시마다 반복적으로 수행될 수 있다. 이 경우, 코드 체인 검증을 실시하는 코드 조각들이 컴퓨터 프로그램의 런타임시마다 변경되기 때문에 공격자의 동적분석을 보다 어렵게 만들 수 있다.
도 11은 본 발명의 일실시예에 있어서, 코드 그룹에 대한 원장을 생성하는 컴퓨터 장치의 코드 보호 방법의 예를 도시한 흐름도이다. 본 실시예에 따른 코드 보호 방법은 컴퓨터 프로그램이 포함하는 코드 그룹에 대한 원장을 생성하는 컴퓨터 장치에 의해 수행될 수 있다. 일례로, 본 실시예에 따른 컴퓨터 장치는 특정 코드 그룹을 입력받아 입력된 코드 그룹에 대한 원장을 생성하여 제공하는 서버를 구현하기 위한 물리적 장치일 수 있다. 이때, 컴퓨터 장치가 포함하는 적어도 하나의 프로세스는 컴퓨터 장치가 포함하는 메모리가 포함하는 운영체제의 코드나 적어도 하나의 프로그램의 코드에 따른 제어 명령(instruction)을 실행하도록 구현될 수 있다. 여기서, 적어도 하나의 프로세서는 컴퓨터 장치에 저장된 코드가 제공하는 제어 명령에 따라 컴퓨터 장치가 도 11의 방법이 포함하는 단계들(1110 내지 1130)을 수행하도록 컴퓨터 장치를 제어할 수 있다.
단계(1110)에서 컴퓨터 장치는 코드 그룹을 입력받을 수 있다. 일례로, 컴퓨터 장치는 네트워크를 통해 연결된 컴퓨터 프로그램의 개발자 단말로부터 코드 그룹을 수신할 수 있다.
단계(1120)에서 컴퓨터 장치는 코드 그룹에 포함된 m(m은 2 이상의 자연수)개의 함수들의 함수 해쉬들을 순차적으로 계산하되, n(n은 m 이하의 자연수) 번째 함수의 함수 해쉬를 n 번째 함수의 파라미터 및 n-1 번째 함수의 함수 해쉬를 이용하여 계산할 수 있다. 예를 들어, n이 2인 경우, 두 번째 함수의 함수 해쉬는 두 번째 함수의 파라미터와 첫 번째 함수의 함수 해쉬를 이용하여 계산될 수 있다. 한편, n이 1인 경우, 0 번째 함수는 존재하지 않기 때문에, 첫 번째 함수의 함수 해쉬는 첫 번째 함수의 파라미터만을 이용하여 계산될 수 있다.
이때, 코드 그룹에 포함된 m(m은 2 이상의 자연수)개의 함수들은, 코드 그룹이 포함하는 함수 형태 및 함수 형태로 변형 가능한 형태 중 적어도 하나의 형태의 코드를 포함할 수 있다. 예를 들어, 'int a = 10;'과 같은 인스트럭션은 'createInt(10)'과 같은 함수의 형태로 변환될 수 있으며, 이러한 경우를 포함하는 경우, 'int a = 10;'과 같은 인스트럭션 역시 함수 형태로 변형되어 코드 그룹에 포함된 함수로서 식별될 수 있다.
단계(1130)에서 컴퓨터 장치는 코드 그룹의 해쉬를 키로 이용하여 m 번째 함수의 함수 해쉬를 암호화한 값을 포함하는 코드 그룹의 원장을 생성할 수 있다. 앞서 도 8 및 도 9에서는 코드 그룹의 함수 해쉬(마지막 함수의 함수 해쉬)를 코드 그룹의 해쉬로 암호화한 값을 포함하는 원장의 예들을 설명한 바 있다.
또한, 컴퓨터 장치는 원장을 생성한 제1 코드 그룹과 연관된 제2 코드 그룹이 추가되는 경우, 제2 코드 그룹의 해쉬를 키로 이용하여 제2 코드 그룹의 함수 해쉬뿐만 아니라, 제1 코드 그룹의 원장까지 함께 암호화한 값을 포함하는 제2 코드 그룹의 원장을 생성할 수 있다. 이러한 제2 코드 그룹의 원장은 제1 코드 그룹의 원장을 갱신한 값으로서 활용될 수 있다. 만약, 연관된 코드 그룹이 추가되는 경우, 원장은 다시 갱신될 수 있다. 예를 들어, 제3 코드 그룹의 해쉬를 키로 이용하여 제3 코드 그룹의 함수 해쉬뿐만 아니라, 제2 코드 그룹의 원장까지 함께 암호화한 값을 포함하는 제3 코드 그룹의 원장이 생성될 수 있다. 다시 말해, 공격자가 제3 코드 그룹의 내용을 변경하고자 하는 경우, 제2 코드 그룹뿐만 아니라, 제1 코드 그룹의 함수 해쉬까지 고려해야 하며, 함수 해쉬는 각 코드 그룹들의 함수들(또는 함수의 형태로 변형될 수 있는 인스트럭션들) 각각에 대한 함수 해쉬들까지 고려해야 하기 때문에 코드 그룹 및/또는 코드 그룹이 포함하는 함수들(또는 인스트럭션들)이 늘어날수록 보안성이 증대될 수 있다.
코드 그룹과 원장은 컴퓨터 프로그램에 포함되어 컴퓨터 프로그램을 실행하는 컴퓨터 장치로 제공될 수 있다.
도 12는 본 발명의 일실시예에 있어서, 코드 체인과 원장이 포함된 컴퓨터 프로그램을 실행하는 컴퓨터 장치의 코드 보호 방법의 예를 도시한 흐름도이다. 본 실시예에 따른 코드 보호 방법은 컴퓨터 프로그램을 실행하는 컴퓨터 장치에 의해 수행될 수 있다. 이때, 컴퓨터 장치가 포함하는 적어도 하나의 프로세스는 컴퓨터 장치가 포함하는 메모리가 포함하는 운영체제의 코드나 적어도 하나의 프로그램의 코드에 따른 제어 명령(instruction)을 실행하도록 구현될 수 있다. 여기서, 적어도 하나의 프로세서는 컴퓨터 장치에 저장된 코드가 제공하는 제어 명령에 따라 컴퓨터 장치가 도 12의 방법이 포함하는 단계들(1210 내지 1230)을 수행하도록 컴퓨터 장치를 제어할 수 있다.
단계(1210)에서 컴퓨터 장치는 컴퓨터 프로그램이 포함하는 코드 그룹 및 코드 그룹의 원장을 확인할 수 있다.
단계(1220)에서 컴퓨터 장치는 코드 그룹의 해쉬를 이용하여 원장에 포함된 코드 그룹의 암호화된 함수 해쉬의 복원이 가능한지 여부를 검증할 수 있다. 코드 그룹의 해쉬를 이용하여 암호화된 함수 해쉬의 복원이 가능하지 않은 경우, 컴퓨터 장치는 코드 그룹 및/또는 코드 그룹의 원장 중 적어도 하나가 변경된 것으로 결정할 수 있다.
단계(1230)에서 컴퓨터 장치는 코드 그룹의 해쉬를 이용하여 암호화된 함수 해쉬가 복원되는 경우, 코드 그룹에 대해 계산된 함수 해쉬와 복원된 함수 해쉬를 비교할 수 있다. 만약, 계산된 함수 해쉬와 복원된 함수 해쉬가 동일하지 않은 경우, 컴퓨터 장치는 코드 그룹 및/또는 코드 그룹의 원장 중 적어도 하나가 변경된 것으로 결정할 수 있다. 역으로, 계산된 함수 해쉬와 복원된 함수 해쉬가 동일한 경우, 컴퓨터 장치는 코드 그룹과 원장 모두가 변경되지 않고 적법한 코드만을 포함하고 있음을 보증할 수 있게 된다.
이때, 컴퓨터 장치는 단계(1230)에서 코드 그룹의 코드들을 순차적으로 실행하면서 코드 그룹이 포함하는 함수(또는 함수의 형태로 변형 가능한 인스트럭션)에 대한 함수 해쉬를 순차적으로 계산할 수 있으며, 코드 그룹의 코드들이 최종적으로 실행된 후에 마지막 함수(또는 인스트럭션)에 대해 계산되는 함수 해쉬를 코드 그룹의 함수 해쉬로서 복원된 함수 해쉬와 비교할 수 있다. 이 경우, 컴퓨터 장치는 코드 그룹의 코드들이 정상적으로 실행되었는지 여부까지 검증할 수 있게 된다.
실시예에 따라 컴퓨터 장치는 컴퓨터 프로그램이 포함하는 다수의 코드 그룹들과 다수의 코드 그룹들에 대해 생성된 검증값으로서의 원장을 이용하여 다수의 코드 그룹들을 검증할 수도 있다. 예를 들어, 코드 그룹은 컴퓨터 프로그램이 포함하는 복수의 모듈들에 분산된 순서를 갖는 i(i는 2 이상의 자연수) 개의 코드 서브 그룹들을 포함할 수 있다. 예를 들어, 도 10을 통해 설명한 코드 그룹들(1030 내지 1060)이 특정 코드 그룹의 코드 서브 그룹들일 수 있다. 이때, 원장은 j(j는 i 이하의 자연수) 번째 코드 서브 그룹의 원장이 j 번째 코드 서브 그룹의 함수 해쉬와 j-1 번째 코드 서브 그룹의 원장을 j 번째 코드 서브 그룹의 해쉬로 암호화한 값을 포함하도록 생성될 수 있다. 이때, i 개의 코드 서브 그룹들 각각은 실행 모듈 및 검증 모듈을 포함하는 적어도 하나의 코드 조각을 포함할 수 있다. 이 경우, 컴퓨터 장치는 컴퓨터 프로그램의 런타임마다 i 개의 코드 서브 그룹들에서 랜덤하게 실행 모듈 및 검증 모듈을 선정할 수 있다. 이미 설명한 바와 같이, 실행 모듈은 도 10을 통해 설명한 실행부에 검증 모듈은 도 10을 통해 설명한 검증부에 각각 대응할 수 있다. 이 경우, 앞서 설명한 단계(1220)는 랜덤하게 선정된 실행 모듈의 제어에 따라, 단계(1230)는 랜덤하게 선정된 검증 모듈의 제어에 따라 각각 컴퓨터 장치에 의해 수행될 수 있다.
이때, 컴퓨터 장치는 다수의 코드 그룹들(코드 서브 그룹들)을 단일 연결 리스트의 데이터 구조로 서로 연결하여 코드 체인을 형성할 수 있으며, 도 8을 통해 설명한 바와 같이 다수의 코드 그룹들을 위해 갱신되는 원장의 함수 해쉬를 이용하여 다수의 코드 그룹들을 검증할 수 있다. 또한, 앞서 설명한 바와 같이, 실제로 코드들을 순차적으로 실행하면서 함수(또는 인스트럭션)에 대한 함수 해쉬를 계산함으로써, 다수의 코드 그룹들이 포함하는 코드들이 정상적으로 실행되었는지 여부까지 검증할 수 있다.
한편, 이상의 실시예들에서 보호하고자 하는 코드들은 시리얼라이즈 코드의 형태를 갖는 본 발명의 일실시예에 따른 명세 언어(specification language)로 변환되어 활용될 수도 있다. 명세화 언어의 특징은 보호하고자 하는 모든 코드들이 하나의 함수를 위한 명세(specification)가 되는 것이다. 각각의 명세들은 유일한 핸들을 가질 수 있으며,
도 13은 본 발명의 일실시예에 있어서, 오리지널 코드 그룹이 포함하는 코드들을 명세 언어로 변환한 예를 나타내고 있다. 도 13은 오리지널 코드 그룹(1310)이 포함하는 제1 인스트럭션(1311), 제2 인스트럭션(1312), 제3 인스트럭션(1313) 및 제4 인스트럭션(1314) 각각을 명세 언어의 형태로 변환한 예를 나타내고 있다. 이때, 도 13에서는 제1 인스트럭션(1311)이 핸들(handle) '0x0001'에 의해 식별되는 제1 명세(1320)로, 제2 인스트럭션(1312)이 핸들 '0x0002'에 의해 식별되는 제2 명세(1330)로, 제3 인스트럭션(1313)이 핸들 '0x0003'에 의해 식별되는 제3 명세(1340)로, 그리고 제4 인스트럭션(1314)이 핸들 '0x0004'에 의해 식별되는 제4 명세(1350)로 각각 변환된 예를 나타내고 있다.
명세 언어에서 핸들(handle)은 앞서 설명한 바와 같이 해당 명세를 고유하게 식별하고 다루기 위한 식별자의 역할을 할 수 있다. 또한, 타입(type)은 함수의 종류를 나타낼 수 있으며, 액션(action)은 함수를 위한 명령을 의미할 수 있다. 예를 들어, 제1 명세에서 액션 'create'와 타입 'Value'는 제1 인스트럭션(1311)이 값을 생성하는 함수에 대응되어 변환될 수 있음을 의미할 수 있다. 한편, 옵션(option)은 함수의 인수(argument)를 의미할 수 있다.
이때, 이러한 다수의 명세들을 위한 명세 시퀀스 리스트(1360)가 프래그먼트(1370)에 포함될 수 있다. 프래그먼트(fragment, 1370)는 명세 언어에서의 코드 그룹에 대응할 수 있다. 예를 들어, 앞선 실시예들에서 명세 언어가 활용되는 경우, 실시예들에서 보호하고자 하는 코드 그룹은 '프래그먼트'에 대응될 수 있다. 프래그먼트(1370)는 프래그먼트 핸들 '0001000'에 의해 식별되어 다뤄질 수 있다.
명세 언어의 특징들의 예시를 아래 표 2와 같이 나타낼 수 있다.
type example
declaring variables HANDLE compressedSize = mainpage->Write(value.Coding(new CreateInt(0)));
assign HANDLE logMsg = loggingPaper->Write(value.Coding(new CreateArray(32)));mainpage->Write(value.Coding(new AssignArray(logMsg, "0xE14031CEE431")));
operation HANDLE var1 = loggingPaper->Write(value.Coding(new CreateArray(32)));HANDLE var2 = loggingPaper->Write(value.Coding(new CreateArray(32)));
HANDLE sum = loggingPaper->Write(value.Coding(new CreateArray(32)));
mainpage->Write(value.Coding(new OperateData(var1, var2, sum, "+")));
mainpage->Write(value.Coding(new OperateData(var1, var2, sum, "+")));
compare branch mainpage->Write(value.Coding(new CompareValue(var1, var2, "==", loggingPaper->HandleGet(), INVALID_HANDLE_VALUE)));
getting stack of current thread HANDLE start = page->Write(value.Coding(new CreateInt()));HANDLE end = page->Write(value.Coding(new CreateInt()));
page->Write(branch.Coding(new FindStack(start, end)));
create page Paper *page = (Paper *) note.Coding(new NoteCommand(true));
logging current address ValueSpecLanguage value;BranchSpecLanguage branch;

HANDLE address = page->Write(value.Coding(new CreateInt(0)));
CallApi api;
api.CurrentAddress(address);
page->Write(branch.Coding(&api));

HANDLE msg = page->Write(value.Coding(new CreateCharPtr("this is a current address")));
page->Write(branch.Coding(new PrintLogging(address, msg)));
file open HANDLE fileDescriptor = page->Write(value.Coding(new CreatePointer()));HANDLE fileName = page->Write(value.Coding(new CreateCharPtr("/data/local/tmp/test.bin")));
page->Write(branch.Coding(new CallApi(new FileOpen(fileName, fileDescriptor));
'Paper'는 각 코드를 담는 그룹을 의미할 수 있다. 만약, 아래 표 3과 같이 분기가 발생하는 코드에서 분기('logging_failed()')는 다른 Paper에 포함될 수 있다.
If(result == failed){
logging_failed()
}
이러한 'Paper'를 담는 그룹을 'NoteLanguage'라 할 수 있다. 이때, 하나의 컴파일러는 하나의 노트(Note)를 컴파일하도록 구현될 수 있다. 값을 다루는 'ValueSpecLanguage', 비교나 호출을 통해 분기를 수행하는 'BranchSpecLanguage' 등 언어의 그룹별로 담당하는 객체가 있으며, 여기에 상세한 인자 값을 'Coding'이라는 function을 호출해서 세팅할 수 있다. 또한 이렇게 생성된 명세는 'Paper'에 쓰기(write)되어 'Paper'에 여러 함수들의 명세들이 순서대로 담기게 될 수 있다. 'AssignArray'는 버퍼드 어레이(buffered array)를 할당하기 위한 코드일 수 있으며, 'CreatPointer'는 포인터를 할당하기 위한 코드일 수 있다.이러한 명세 언어를 작성된 코드는 컴파일을 통해 시리얼라이즈드 코드(serialized code) 형태의 함수들로 변환될 수 있다. 일례로, 앞서 설명한 바와 같이, 'int a = 10;'과 같은 인스트럭션은 'createInt(10)'과 같은 함수의 형태로 변환될 수 있다.
도 14는 본 발명의 일실시예에 따른 컴퓨터 장치의 예를 도시한 블록도이다. 앞서 설명한 컴퓨터 장치들은 도 14에 도시된 컴퓨터 장치(1400)와 같은 내부 구성을 가질 수 있다.
이때, 도 14에 도시된 바와 같이 컴퓨터 장치(1400)는, 메모리(1410), 프로세서(1420), 통신 인터페이스(1430) 그리고 입출력 인터페이스(1440)를 포함할 수 있다. 메모리(1310)는 컴퓨터에서 판독 가능한 기록매체로서, RAM(random access memory), ROM(read only memory) 및 디스크 드라이브와 같은 비소멸성 대용량 기록장치(permanent mass storage device)를 포함할 수 있다. 여기서 ROM과 디스크 드라이브와 같은 비소멸성 대용량 기록장치는 메모리(1410)와는 구분되는 별도의 영구 저장 장치로서 컴퓨터 장치(1400)에 포함될 수도 있다. 또한, 메모리(1410)에는 운영체제와 적어도 하나의 프로그램 코드가 저장될 수 있다. 이러한 소프트웨어 구성요소들은 메모리(1410)와는 별도의 컴퓨터에서 판독 가능한 기록매체로부터 메모리(1410)로 로딩될 수 있다. 이러한 별도의 컴퓨터에서 판독 가능한 기록매체는 플로피 드라이브, 디스크, 테이프, DVD/CD-ROM 드라이브, 메모리 카드 등의 컴퓨터에서 판독 가능한 기록매체를 포함할 수 있다. 다른 실시예에서 소프트웨어 구성요소들은 컴퓨터에서 판독 가능한 기록매체가 아닌 통신 인터페이스(1430)를 통해 메모리(1410)에 로딩될 수도 있다. 예를 들어, 소프트웨어 구성요소들은 네트워크(1460)를 통해 수신되는 파일들에 의해 설치되는 컴퓨터 프로그램에 기반하여 컴퓨터 장치(1400)의 메모리(1410)에 로딩될 수 있다.
프로세서(1420)는 기본적인 산술, 로직 및 입출력 연산을 수행함으로써, 컴퓨터 프로그램의 명령을 처리하도록 구성될 수 있다. 명령은 메모리(1410) 또는 통신 인터페이스(1430)에 의해 프로세서(1420)로 제공될 수 있다. 예를 들어 프로세서(1420)는 메모리(1410)와 같은 기록 장치에 저장된 프로그램 코드에 따라 수신되는 명령을 실행하도록 구성될 수 있다.
통신 인터페이스(1430)은 네트워크(1460)를 통해 컴퓨터 장치(1400)가 다른 장치(일례로, 앞서 설명한 저장 장치들)와 서로 통신하기 위한 기능을 제공할 수 있다. 일례로, 컴퓨터 장치(1400)의 프로세서(1420)가 메모리(1410)와 같은 기록 장치에 저장된 프로그램 코드에 따라 생성한 요청이나 명령, 데이터, 파일 등이 통신 인터페이스(1430)의 제어에 따라 네트워크(1460)를 통해 다른 장치들로 전달될 수 있다. 역으로, 다른 장치로부터의 신호나 명령, 데이터, 파일 등이 네트워크(1460)를 거쳐 컴퓨터 장치(1400)의 통신 인터페이스(1430)를 통해 컴퓨터 장치(1400)로 수신될 수 있다. 통신 인터페이스(1430)를 통해 수신된 신호나 명령, 데이터 등은 프로세서(1420)나 메모리(1410)로 전달될 수 있고, 파일 등은 컴퓨터 장치(1400)가 더 포함할 수 있는 저장 매체(상술한 영구 저장 장치)로 저장될 수 있다.
입출력 인터페이스(1440)는 입출력 장치(1450)와의 인터페이스를 위한 수단일 수 있다. 예를 들어, 입력 장치는 마이크, 키보드, 카메라 또는 마우스 등의 장치를, 그리고 출력 장치는 디스플레이, 스피커와 같은 장치를 포함할 수 있다. 다른 예로 입출력 인터페이스(1440)는 터치스크린과 같이 입력과 출력을 위한 기능이 하나로 통합된 장치와의 인터페이스를 위한 수단일 수도 있다. 입출력 장치(1450)는 컴퓨터 장치(1400)와 하나의 장치로 구성될 수도 있다.
또한, 다른 실시예들에서 컴퓨터 장치(1400)는 도 14의 구성요소들보다 더 적은 혹은 더 많은 구성요소들을 포함할 수도 있다. 그러나, 대부분의 종래기술적 구성요소들을 명확하게 도시할 필요성은 없다. 예를 들어, 컴퓨터 장치(1400)는 상술한 입출력 장치(1450) 중 적어도 일부를 포함하도록 구현되거나 또는 트랜시버(transceiver), 데이터베이스 등과 같은 다른 구성요소들을 더 포함할 수도 있다.
이처럼 본 발명의 실시예들에 따르면, 실행 후 제거되는 원타임 코드를 이용하여 컴퓨터 프로그램을 실행함으로써, 공격자들이 동적분석을 통해 인스트럭션들을 역 추적하여 코드를 분석하는 것을 어렵게 만들 수 있다. 또한, 코드의 실행 위치를 추첨을 통해 결정함으로써, 특정 파일에 타겟팅되지 않는 본체가 없는 코드를 제공할 수 있으며, 실행을 위한 트리거 시점이 랜덤인 코드를 제공함으로써, 해당 코드에 대한 정보가 동적분석 등을 통해 노출되는 것을 방지할 수 있다. 또한, 서버에서 전달되는 코드를 실행할 때, 혹은 로컬의 코드를 실행할 때, 적법한 코드만이 추가되었음을 보증할 수 있으며, 또한 코드가 제대로 실행되었는지 여부 및 코드의 무결성을 검증할 수 있다.
이상에서 설명된 시스템 또는 장치는 하드웨어 구성요소, 또는 하드웨어 구성요소 및 소프트웨어 구성요소의 조합으로 구현될 수 있다. 예를 들어, 실시예들에서 설명된 장치 및 구성요소는, 예를 들어, 프로세서, 콘트롤러, 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)될 수 있다. 소프트웨어는 네트워크로 연결된 컴퓨터 시스템 상에 분산되어서, 분산된 방법으로 저장되거나 실행될 수도 있다. 소프트웨어 및 데이터는 하나 이상의 컴퓨터 판독 가능 기록매체에 저장될 수 있다.
실시예에 따른 방법은 다양한 컴퓨터 수단을 통하여 수행될 수 있는 프로그램 명령 형태로 구현되어 컴퓨터 판독 가능 매체에 기록될 수 있다. 상기 컴퓨터 판독 가능 매체는 프로그램 명령, 데이터 파일, 데이터 구조 등을 단독으로 또는 조합하여 포함할 수 있다. 매체는 컴퓨터로 실행 가능한 프로그램을 계속 저장하거나, 실행 또는 다운로드를 위해 임시 저장하는 것일 수도 있다. 또한, 매체는 단일 또는 수개 하드웨어가 결합된 형태의 다양한 기록수단 또는 저장수단일 수 있는데, 어떤 컴퓨터 시스템에 직접 접속되는 매체에 한정되지 않고, 네트워크 상에 분산 존재하는 것일 수도 있다. 매체의 예시로는, 하드 디스크, 플로피 디스크 및 자기 테이프와 같은 자기 매체, CD-ROM 및 DVD와 같은 광기록 매체, 플롭티컬 디스크(floptical disk)와 같은 자기-광 매체(magneto-optical medium), 및 ROM, RAM, 플래시 메모리 등을 포함하여 프로그램 명령어가 저장되도록 구성된 것이 있을 수 있다. 또한, 다른 매체의 예시로, 애플리케이션을 유통하는 앱 스토어나 기타 다양한 소프트웨어를 공급 내지 유통하는 사이트, 서버 등에서 관리하는 기록매체 내지 저장매체도 들 수 있다. 프로그램 명령의 예에는 컴파일러에 의해 만들어지는 것과 같은 기계어 코드뿐만 아니라 인터프리터 등을 사용해서 컴퓨터에 의해서 실행될 수 있는 고급 언어 코드를 포함한다.
이상과 같이 실시예들이 비록 한정된 실시예와 도면에 의해 설명되었으나, 해당 기술분야에서 통상의 지식을 가진 자라면 상기의 기재로부터 다양한 수정 및 변형이 가능하다. 예를 들어, 설명된 기술들이 설명된 방법과 다른 순서로 수행되거나, 및/또는 설명된 시스템, 구조, 장치, 회로 등의 구성요소들이 설명된 방법과 다른 형태로 결합 또는 조합되거나, 다른 구성요소 또는 균등물에 의하여 대치되거나 치환되더라도 적절한 결과가 달성될 수 있다.
그러므로, 다른 구현들, 다른 실시예들 및 청구범위와 균등한 것들도 후술하는 청구범위의 범위에 속한다.

Claims (19)

  1. 컴퓨터 장치와 결합되어 코드 보호 방법을 상기 컴퓨터 장치에 실행시키기 위해 컴퓨터 판독 가능한 기록매체에 저장된 컴퓨터 프로그램에 있어서,
    상기 코드 보호 방법은,
    상기 컴퓨터 프로그램의 실행에 응답하여 상기 컴퓨터 프로그램의 코드를 실행하는 가상 머신을 생성하는 단계;
    상기 가상 머신의 제어에 따라 메모리상에 실행가능한 세그먼트를 로드하는 단계;
    상기 컴퓨터 프로그램이 포함하는 암호화된 코드 그룹을 복원하는 단계;
    상기 실행가능한 세그먼트에서 랜덤하게 선택된 위치에 상기 복원된 코드 그룹을 로드하는 단계;
    상기 랜덤하게 선택된 위치에 로드된 코드 그룹을 실행하는 단계; 및
    상기 실행가능한 세그먼트에서 상기 실행된 코드 그룹을 제거하는 단계
    를 포함하는, 컴퓨터 프로그램.
  2. 제1항에 있어서,
    상기 실행가능한 세그먼트를 로드하는 단계는,
    상기 컴퓨터 프로그램의 인스트럭션이 로드되는 세그먼트와는 별도의 세그먼트를 상기 컴퓨터 프로그램의 실행 시 상기 가상 머신의 제어에 따라 동적으로 로드하는, 컴퓨터 프로그램.
  3. 제1항에 있어서,
    상기 복원된 코드 그룹을 로드하는 단계는,
    상기 실행가능한 세그먼트를 n(상기 n은 2 이상의 자연수) 등분하여 n 개의 영역으로 분할하고, 상기 분할된 n 개의 영역들 중에서 랜덤하게 선택되는 하나의 영역에 상기 복원된 코드 그룹을 로드하는, 컴퓨터 프로그램.
  4. 제1항에 있어서,
    상기 복원하는 단계는,
    상기 가상 머신이 포함하는 복원 모듈을 통해 상기 암호화된 코드 그룹을 복원하는, 컴퓨터 프로그램.
  5. 제1항에 있어서,
    상기 코드 보호 방법은,
    상기 컴퓨터 프로그램이 포함하는 암호화된 다음 코드 그룹에 대해, 상기 암호화된 코드 그룹을 복원하는 단계, 상기 복원된 코드 그룹을 로드하는 단계, 상기 코드 그룹을 실행하는 단계 및 상기 실행된 코드 그룹을 제거하는 단계를 반복 수행하는 단계
    를 더 포함하는, 컴퓨터 프로그램.
  6. 제1항에 있어서,
    상기 코드 그룹을 실행하는 단계는,
    상기 코드 그룹 외부의 라이브러리 또는 함수에 대한 호출에 따라 요구되는 상기 코드 그룹 외부의 오프셋을 상기 가상 머신이 포함하는 리로케이션 모듈을 통해 처리하는, 컴퓨터 프로그램.
  7. 제1항에 있어서,
    상기 코드 그룹은 오리지널 코드 그룹이 포함하는 인스트럭션들 중 적어도 일부를 함수의 형태로 변환한 코드를 포함하는, 컴퓨터 프로그램.
  8. 컴퓨터 프로그램의 실행에 응답하여 상기 컴퓨터 프로그램의 코드를 실행하는 가상 머신을 생성하는 단계;
    상기 가상 머신의 제어에 따라 메모리상에 실행가능한 세그먼트를 로드하는 단계;
    상기 컴퓨터 프로그램이 포함하는 암호화된 코드 그룹을 복원하는 단계;
    상기 실행가능한 세그먼트에서 랜덤하게 선택된 위치에 상기 복원된 코드 그룹을 로드하는 단계;
    상기 랜덤하게 선택된 위치에 로드된 코드 그룹을 실행하는 단계; 및
    상기 실행가능한 세그먼트에서 상기 실행된 코드 그룹을 제거하는 단계
    를 포함하는, 코드 보호 방법.
  9. 제8항에 있어서,
    상기 실행가능한 세그먼트를 로드하는 단계는,
    상기 컴퓨터 프로그램의 인스트럭션이 로드되는 세그먼트와는 별도의 세그먼트를 상기 컴퓨터 프로그램의 실행 시 상기 가상 머신의 제어에 따라 동적으로 로드하는, 코드 보호 방법.
  10. 제8항에 있어서,
    상기 복원된 코드 그룹을 로드하는 단계는,
    상기 실행가능한 세그먼트를 n(상기 n은 2 이상의 자연수) 등분하여 n 개의 영역으로 분할하고, 상기 분할된 n 개의 영역들 중에서 랜덤하게 선택되는 하나의 영역에 상기 복원된 코드 그룹을 로드하는, 코드 보호 방법.
  11. 제8항에 있어서,
    상기 복원하는 단계는,
    상기 가상 머신이 포함하는 복원 모듈을 통해 상기 암호화된 코드 그룹을 복원하는, 코드 보호 방법.
  12. 제8항에 있어서,
    상기 컴퓨터 프로그램이 포함하는 암호화된 다음 코드 그룹에 대해, 상기 암호화된 코드 그룹을 복원하는 단계, 상기 복원된 코드 그룹을 로드하는 단계, 상기 코드 그룹을 실행하는 단계 및 상기 실행된 코드 그룹을 제거하는 단계를 반복 수행하는 단계
    를 더 포함하는, 코드 보호 방법.
  13. 제8항에 있어서,
    상기 코드 그룹을 실행하는 단계는,
    상기 코드 그룹 외부의 라이브러리 또는 함수에 대한 호출에 따라 요구되는 상기 코드 그룹 외부의 오프셋을 상기 가상 머신이 포함하는 리로케이션 모듈을 통해 처리하는, 코드 보호 방법.
  14. 제8항 내지 제13항 중 어느 한 항의 방법을 컴퓨터에 실행시키기 위한 프로그램이 기록되어 있는 것을 특징으로 하는 컴퓨터에서 판독 가능한 기록매체.
  15. 컴퓨터 장치에 있어서,
    상기 컴퓨터 장치에서 판독 가능한 명령을 실행하도록 구현되는 적어도 하나의 프로세서
    를 포함하고,
    상기 적어도 하나의 프로세서에 의해,
    컴퓨터 프로그램의 실행에 응답하여 상기 컴퓨터 프로그램의 코드를 실행하는 가상 머신을 생성하고,
    상기 가상 머신의 제어에 따라 메모리상에 실행가능한 세그먼트를 로드하고,
    상기 컴퓨터 프로그램이 포함하는 암호화된 코드 그룹을 복원하고,
    상기 실행가능한 세그먼트에서 랜덤하게 선택된 위치에 상기 복원된 코드 그룹을 로드하고,
    상기 랜덤하게 선택된 위치에 로드된 코드 그룹을 실행하고,
    상기 실행가능한 세그먼트에서 상기 실행된 코드 그룹을 제거하는,
    컴퓨터 장치.
  16. 제15항에 있어서,
    상기 적어도 하나의 프로세서에 의해,
    상기 컴퓨터 프로그램의 인스트럭션이 로드되는 세그먼트와는 별도의 세그먼트를 상기 컴퓨터 프로그램의 실행 시 상기 가상 머신의 제어에 따라 동적으로 로드하는, 컴퓨터 장치.
  17. 제15항에 있어서,
    상기 적어도 하나의 프로세서에 의해,
    상기 실행가능한 세그먼트를 n(상기 n은 2 이상의 자연수) 등분하여 n 개의 영역으로 분할하고, 상기 분할된 n 개의 영역들 중에서 랜덤하게 선택되는 하나의 영역에 상기 복원된 코드 그룹을 로드하는, 컴퓨터 장치.
  18. 제15항에 있어서,
    상기 적어도 하나의 프로세서에 의해,
    상기 컴퓨터 프로그램이 포함하는 암호화된 다음 코드 그룹을 복원하고,
    상기 실행가능한 세그먼트에서 랜덤하게 선택된 위치에 상기 복원된 다음 코드 그룹을 로드하고,
    상기 랜덤하게 선택된 위치에 로드된 다음 코드 그룹을 실행하고,
    상기 실행가능한 세그먼트에서 상기 실행된 다음 코드 그룹을 제거하는,
    컴퓨터 장치.
  19. 제15항에 있어서,
    상기 적어도 하나의 프로세서에 의해,
    상기 코드 그룹 외부의 라이브러리 또는 함수에 대한 호출에 따라 요구되는 상기 코드 그룹 외부의 오프셋을 상기 가상 머신이 포함하는 리로케이션 모듈을 통해 처리하는, 컴퓨터 장치.
KR1020180092343A 2018-08-08 2018-08-08 원타임 코드를 이용한 코드 보호 방법 및 시스템 KR20200017121A (ko)

Priority Applications (1)

Application Number Priority Date Filing Date Title
KR1020180092343A KR20200017121A (ko) 2018-08-08 2018-08-08 원타임 코드를 이용한 코드 보호 방법 및 시스템

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
KR1020180092343A KR20200017121A (ko) 2018-08-08 2018-08-08 원타임 코드를 이용한 코드 보호 방법 및 시스템

Publications (1)

Publication Number Publication Date
KR20200017121A true KR20200017121A (ko) 2020-02-18

Family

ID=69638602

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020180092343A KR20200017121A (ko) 2018-08-08 2018-08-08 원타임 코드를 이용한 코드 보호 방법 및 시스템

Country Status (1)

Country Link
KR (1) KR20200017121A (ko)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113642021A (zh) * 2021-08-20 2021-11-12 深信服科技股份有限公司 一种业务代码提交方法、处理方法、装置及电子设备

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113642021A (zh) * 2021-08-20 2021-11-12 深信服科技股份有限公司 一种业务代码提交方法、处理方法、装置及电子设备
CN113642021B (zh) * 2021-08-20 2024-05-28 深信服科技股份有限公司 一种业务代码提交方法、处理方法、装置及电子设备

Similar Documents

Publication Publication Date Title
US9141787B2 (en) Interlocked binary protection using whitebox cryptography
US10255414B2 (en) Software self-defense systems and methods
US20160364707A1 (en) Potentate: A Cryptography-Obfuscating, Self-Policing, Pervasive Distribution System For Digital Content
US7287166B1 (en) Guards for application in software tamperproofing
US20160275019A1 (en) Method and apparatus for protecting dynamic libraries
US20190114401A1 (en) On device structure layout randomization for binary code to enhance security through increased entropy
US11269988B2 (en) Automated software application verification system
US20220107827A1 (en) Applying security mitigation measures for stack corruption exploitation in intermediate code files
CN108804913B (zh) 应用程序的运行方法和装置
US11176060B2 (en) Dynamic memory protection
KR20200017121A (ko) 원타임 코드를 이용한 코드 보호 방법 및 시스템
CN107209815B (zh) 用于使用返回导向编程的代码混淆的方法
KR20200017120A (ko) 코스 스프레잉을 이용한 코드 보호 방법 및 시스템
KR20200017122A (ko) 코드 체인 검증을 이용한 코드 보호 방법 및 시스템
CN116249980A (zh) 通过异构加密的软件访问
CN106922191B (zh) 生成和执行受保护的软件项目
TWI682296B (zh) 映像檔打包方法及映像檔打包系統
KR20210154017A (ko) 클래스 분산 및 순차적 메모리 적재를 이용한 파일 보호 방법 및 시스템
JP3949105B2 (ja) 「リネーム」原理を使用してその無許可使用に対してソフトウェアを保護する方法
JP3949108B2 (ja) 「一時的分離」原理により不正使用に対してソフトウェアを保護する方法
KR102243378B1 (ko) 자바 라이브러리의 무결성을 보장하기 위한 방법 및 장치
JP3949103B2 (ja) 「条件分岐」原理により不正使用に対してソフトウェアを保護する方法
JP3949107B2 (ja) 「変数」原理により不正使用に対してソフトウェアを保護する方法
JP3949106B2 (ja) 「基本関数」原理により不正使用に対してソフトウェアを保護する方法
WO2023156571A1 (en) Protecting software

Legal Events

Date Code Title Description
A201 Request for examination
E902 Notification of reason for refusal
E601 Decision to refuse application