KR101048588B1 - 코드 제어 흐름 모호화 장치 및 방법 - Google Patents

코드 제어 흐름 모호화 장치 및 방법 Download PDF

Info

Publication number
KR101048588B1
KR101048588B1 KR1020090031752A KR20090031752A KR101048588B1 KR 101048588 B1 KR101048588 B1 KR 101048588B1 KR 1020090031752 A KR1020090031752 A KR 1020090031752A KR 20090031752 A KR20090031752 A KR 20090031752A KR 101048588 B1 KR101048588 B1 KR 101048588B1
Authority
KR
South Korea
Prior art keywords
instruction
file
control flow
branch
obfuscation
Prior art date
Application number
KR1020090031752A
Other languages
English (en)
Other versions
KR20100113269A (ko
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 KR1020090031752A priority Critical patent/KR101048588B1/ko
Publication of KR20100113269A publication Critical patent/KR20100113269A/ko
Application granted granted Critical
Publication of KR101048588B1 publication Critical patent/KR101048588B1/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/14Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/3005Arrangements for executing specific machine instructions to perform operations for flow control
    • G06F9/30061Multi-way branch instructions, e.g. CASE
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Multimedia (AREA)
  • Technology Law (AREA)
  • Computer Hardware Design (AREA)
  • Computer Security & Cryptography (AREA)
  • Stored Programmes (AREA)

Abstract

코드 제어 흐름 모호화 장치 및 방법이 개시된다. 코드의 제어 흐름을 모호화하기 위한 장치에 있어서, 파일로부터 명령어를 독출하는 독출부, 상기 명령어가 분기 명령어인지 판단하는 판단부, 상기 명령어가 분기 명령어인 경우, 상기 분기 명령어를 모호화하여 모호화 명령어로 변환하는 변환부 및 상기 분기 명령어를 상기 모호화 명령어로 대체하여 상기 파일을 저장하는 저장부를 포함한다.
코드 흐름 모호화, 명령어 독출, 직접분기, 간접분기, 프로파일, 저급언어

Description

코드 제어 흐름 모호화 장치 및 방법 {DEVICE AND METHOD FOR CODE CONTROL FLOW OBFUSCATION}
본 발명의 일실시예들은 코드 제어 흐름 모호화 장치 및 방법에 관한 것으로 특히, 직접분기를 간접분기로 변환하여 코드 제어 흐름을 모호화하는 장치 및 방법에 관한 것이다.
소프트웨어의 보안을 위한 방법 중 하나로 악의적인 목적의 코드 분석을 방해하기 위한 기술이 사용되고 있다. 악의적인 목적의 코드 분석을 방해하기 위한 기술의 일예로, 플로우 차트의 생성을 방해하는 기술이 사용될 수 있다. 여기서, 플로우 차트는 일반적으로 복잡한 알고리즘을 논리적으로 쉽게 나타내어 프로그램 작성의 이해를 돕기 위해 사용될 수 있다. 플로우 차트는 역공학에서도 사용되며, 악의적인 목적을 가진 공격자가 플로우 차트를 생성하여 프로그램의 주요 알고리즘을 쉽게 파악할 수 있다.
종래에는 플로우 차트의 생성을 방해하기 위해, 고급언어(원시코드)를 이용하여 데이터 흐름 모호화를 시도하는 방법이 존재하고 있었다. 이와 같은 방법은 모호화를 하기 위하여 우회 규칙이나 위장 함수 목록, 뒤섞기 함수 목록 등의 수동 적인 설정이 필요하며 프로그램밍 언어에 대한 전문적인 지식이 필요하였다. 또한, 모호화의 강도에 따른 속도 저하가 불가피하였으며, 상황에 따라 컴파일러에 의해 최적화가 되어 적용된 모호화 방법이 제거될 수도 있었다.
따라서, 적은 수의 코드를 삽입하여 속도를 떨어뜨리지 않고, 명확한 모호화 방법을 제공하는 코드 제어 흐름 모호화 장치 및 방법이 요구된다.
본 발명은 플로우 차트 생성을 방해하기 위해, 코드의 직접적인 분기 대신 간접적인 분기를 사용함으로써, 적은 수의 코드를 추가하는 것만으로도 코드 제어 흐름을 모호화하는 방법 및 시스템을 제공한다.
본 발명은 플로우 차트 생성을 방해하기 위해, 저급언어 상에서 코드의 직접적인 분기 대신 간접적인 분기를 사용함으로써, 적용 전후의 속도의 변화가 적은 코드 제어 흐름 모호화 방법 및 시스템을 제공한다.
본 발명의 일실시예에 따른 코드 제어 흐름 모호화 장치는, 파일로부터 명령어를 독출하는 독출부, 상기 명령어가 분기 명령어인지 판단하는 판단부, 상기 명령어가 분기 명령어인 경우, 상기 분기 명령어를 모호화하여 모호화 명령어로 변환하는 변환부 및 상기 분기 명령어를 상기 모호화 명령어로 대체하여 상기 파일을 저장하는 저장부를 포함한다.
본 발명의 일측면에 따르면, 상기 독출부는, 저급언어로 컴파일된 파일로부터 명령어를 독출할 수 있다.
본 발명의 일측면에 따르면, 상기 독출부는, 상기 파일의 핸들러를 생성하는 핸들러 생성부 및 상기 핸들러의 명령어를 라인별로 독출하는 명령어 독출부를 포함할 수 있다.
본 발명의 일측면에 따르면, 상기 변환부는, 직접분기 명령어를 메모리를 사용한 하나 이상의 간접분기 명령어로 변환할 수 있다.
본 발명의 일실시예에 따른 코드 제어 흐름 모호화 방법은, 파일로부터 명령어를 독출하는 단계, 상기 명령어가 분기 명령어인지 판단하는 단계, 상기 명령어가 분기 명령어인 경우, 상기 분기 명령어를 모호화하여 모호화 명령어로 변환하는 단계 및 상기 분기 명령어를 상기 모호화 명령어로 대체하여 상기 파일을 저장하는 단계를 포함한다.
본 발명의 일측면에 따르면, 상기 판단하는 단계는, 상기 명령어가 jmp, jne, jle 중 적어도 하나를 포함하는 경우, 상기 명령어는 분기 명령어인 것으로 판단할 수 있다.
본 발명의 일측면에 따르면, 상기 간접분기 명령어는, push, ret, mov, 및 jmp 명령어 중 적어도 하나를 포함할 수 있다.
본 발명의 일실시예에 따르면, 플로우 차트 생성을 방해하기 위해, 코드의 직접적인 분기 대신 간접적인 분기를 사용함으로써, 적은 수의 코드를 추가하는 것만으로도 코드 제어 흐름을 모호화하는 방법 및 시스템이 제공된다.
본 발명의 일실시예에 따르면, 플로우 차트 생성을 방해하기 위해, 저급언어 상에서 코드의 직접적인 분기 대신 간접적인 분기를 사용함으로써, 적용 전후의 속도의 변화가 적은 코드 제어 흐름 모호화 방법 및 시스템이 제공된다.
이하, 첨부된 도면들에 기재된 내용들을 참조하여 본 발명의 실시예들을 상 세하게 설명한다. 다만, 본 발명이 실시예들에 의해 제한되거나 한정되는 것은 아니다. 각 도면에 제시된 동일한 참조부호는 동일한 부재를 나타낸다. 코드 제어 흐름 모호화 방법은 코드 제어 흐름 모호화 장치를 구성하는 구성 요소에 의해 수행될 수 있다.
도 1은 본 발명의 일실시예에 있어서, 코드 제어 흐름 모호화 장치를 도시한 블록도이다.
도 1을 참고하면, 코드 제어 흐름 모호화 장치(100)는 독출부(110), 판단부(120), 변환부(130), 및 저장부(140)를 포함한다.
독출부(110)는 소프트웨어 코드가 포함된 파일로부터 상기 코드 내의 명령어를 독출할 수 있다. 이때, 상기 파일 내에 포함된 모든 명령어를 순차적으로 읽어 들일 수 있다. 또한, 독출부(110)는 저급언어로 컴파일된 파일로부터 명령어를 독출할 수 있다. 여기서, 저급언어(Low level language)는 기계중심의 언어인 어셈블리어 등을 의미하며, 포트란(FORTRAN), 파스칼(PASCAL), 코볼(COBOL), C 언어 등 인간중심의 고급 언어 (High level language) 및 기계 고유의 언어인 기계어(Machine language)와 구별되는 개념이다.
또한, 독출부(110)는 핸들러 생성부(111) 및 명령어 독출부(112)를 포함할 수 있다. 여기서, 핸들러 생성부(111)는 상기 파일의 핸들러를 생성할 수 있다. 예를 들어, 저급언어 파일을 읽어 들여 상기 파일의 핸들러를 생성할 수 있다.
명령어 독출부(112)는 상기 핸들러의 명령어를 라인별로 독출할 수 있다. 즉, 상기 핸들러로부터 상기 파일에 포함된 명령어를 라인별로 독출할 수 있다.
판단부(120)는 상기 명령어가 분기 명령어인지 판단할 수 있다. 여기서, 상기 명령어가 분기 명령어인지 판단하기 위해, 상기 명령어가 jmp, jne, ja, je, jna, jae, jz, jnae, jnz, jb, js, jnb, jns, jbe, jc, jnbe, jnc, jg, jo, jng, jno, jge, jp, jnge, jpe, jl, jnp, jnl, jpo, jle, 및 jnle 중 적어도 하나를 포함하는지 판단할 수 있다. 이때, 상기 jmp, jne, ja, je, jna, jae, jz, jnae, jnz, jb, js, jnb, jns, jbe, jc, jnbe, jnc, jg, jo, jng, jno, jge, jp, jnge, jpe, jl, jnp, jnl, jpo, jle, 및 jnle 중 적어도 하나를 포함하는 경우, 상기 명령어는 분기 명령어인 것으로 판단할 수 있다. 여기서, jmp, jne, ja, je, jna, jae, jz, jnae, jnz, jb, js, jnb, jns, jbe, jc, jnbe, jnc, jg, jo, jng, jno, jge, jp, jnge, jpe, jl, jnp, jnl, jpo, jle, 및 jnle는 예시적인 명령어이며, 이외의 다른 명령어도 분기 명령어로 판단하도록 설정할 수 있다.
변환부(130)는 상기 명령어가 분기 명령어인 경우, 상기 분기 명령어를 모호화하여 모호화 명령어로 변환할 수 있다. 여기서, 모호화 명령어는 간접분기 명령어일 수 있다. 즉, 모호화를 위해 상기 분기 명령어를 하나 이상의 간접분기 명령어로 변환할 수 있다. 예를 들어, 독출된 명령어가 직접분기 명령어인 경우 상기 직접분기 명령어를 메모리를 사용한 하나 이상의 간접분기 명령어로 변환할 수 있다. 간접분기 명령어는, push, ret, mov, 및 jmp 명령어 중 적어도 하나를 포함할 수 있다. 이때, push, ret, mov, 및 jmp는 간접분기 명령어의 일예이며, 이외의 다른 명령어도 간접 분기를 위한 명령어로 사용될 수 있다. 예를 들어, jmp 명령을 직접적으로 하지 않고 메모리(ex. 스택 메모리, 힙 메모리, 전역 메모리) 등 을 통하여 간접분기 하도록 명령어를 대체할 수 있다.
저장부(140)는 상기 분기 명령어를 상기 모호화 명령어로 대체하여 상기 파일을 저장할 수 있다. 예를 들어, 직접 분기 명령어의 경우, 모호화 명령어인 간접분기 명령어로 대체하여 상기 파일에 저장할 수 있다.
상기와 같이, 어셈블리어 등과 같은 저급언어 단계에서 분기 명령어를 모호화하여 플로우 차트의 생성을 방해할 수 있다.
이를 위해, 직접분기 명령어를 간접분기 명령어로 대체함으로써, 코드 수를 거의 늘리지 않고, 속도를 거의 떨어뜨리지 않는 코드 제어 흐름 모호화 장치 및 방법을 제공할 수 있다.
도 2는 본 발명의 일실시예에 있어서, 고급언어를 기계어로 컴파일하는 과정 상에서 코드 제어 흐름을 모호화하는 과정을 도시한 도면이다.
도 2를 참고하면, 고급언어(210)를 기계어(270)로 컴파일하는 과정 상에서 코드 제어 흐름을 모호화하는 과정이 추가될 수 있다. 예를 들어, C 언어 등과 같은 사용자 중심의 고급언어(210)의 소스코드는 고급언어 컴파일(220) 과정을 통해 어셈블리어 등과 같은 저급언어(230)로 컴파일될 수 있다. 여기서, 저급언어로 컴파일된 소스 코드는 모호화 과정(240)을 통해 모호화된 저급언어(250)로 대체될 수 있다. 여기서, 모호화된 저급언어는, 저급언어에 포함된 직접분기 명령어를 메모리를 사용한 간접분기 명령어로 대체한 것일 수 있다. 일예로, "jmp .L5"라는 명령은 변조화 과정을 통해 "movl $.L5"," jmp .L7" 이라는 명령으로 변조될 수 있다.
이후, 모호화된 저급언어(250)는 다시 저급언어 컴파일(260) 과정을 거쳐 기계어(270)로 컴파일될 수 있다.
상기와 같이, 고급언어를 기계어로 컴파일하는 과정 중 저급언어로 컴파일된 코드를 이용하여 모호화함으로써, 적은 수의 코드를 추가하고도 코드 제어 흐름을 모호화할 수 있다.
도 3은 본 발명의 일실시예에 있어서, 직접분기를 간접분기로 대체하여 코드 제어 흐름을 모호화하는 과정을 설명하기 위한 도면이다.
도 3을 참고하면, 직접분기(310) 플로우를 간접분기 플로우(320)로 대체할 수 있다. 도시된 A, B, C, D 블록은 분기가 없는 연속된 명령의 최소 단위인 베이직 블록(Basic Block)이다. 또한, 플로우 차트는 이러한 베이직 블록 사이의 관계를 도식화 한 것이며, 직선은 직접적인 분기를 의미하고 점선은 간접적인 분기를 의미한다. 여기서, B와 C는 경우에 따라 실행이 되거나, 실행되지 않을 수 있다. 즉, 조건이 참일 경우 B를 실행하고, 거짓일 경우 C를 실행할 수 있다. 따라서, A, B에서의 분기를 모호화 블록(321)을 통해 분기하여 점선의 분기를 추적할 수 없도록 하여 모호화를 수행할 수 있다.
도 4는 본 발명의 일실시예에 있어서, 직접분기를 간접분기로 대체하기 위한 코드를 설명하기 위한 도면이다.
도 4를 참고하면, 직접분기 코드 및 간접분기 코드를 어셈블리어로 표현한 것이다. 직접분기 흐름(410)에서는 jmp 명령을 직접적으로 사용하고 있으나, jmp 명령을 직접적으로 사용하지 않도록 간접분기 흐름(420)으로 대체할 수 있다. 간 접분기 흐름(420)에서는 jmp 명령을 직접적으로 사용하지 않고 메모리(ex. 스택 메모리, 힙 메모리, 전역 메모리)등을 통하여 분기하도록 할 수 있다. 이때, 간접분기 흐름(420)에서는 push, ret이나 메모리를 이용한 mov, jmp 등을 사용할 수 있다.
도 5는 본 발명의 일실시예에 있어서, 코드 제어 흐름 모호화 방법을 설명하기 위한 흐름도이다.
도 5를 참고하면, 단계(510)에서는 파일로부터 명령어를 독출할 수 있다. 이때, 파일은 고급언어의 소스코드를 컴파일하여 생성된 저급언어 파일일 수 있다. 즉, 고급언어 코드를 컴파일하여 생성된 저급언어 코드가 포함된 저급언어 파일로부터 명령어를 순차적으로 독출할 수 있다. 이때, 단계(510)는 상기 파일의 핸들러를 생성하는 단계 및 상기 핸들러의 명령어를 라인별로 독출하는 단계를 포함할 수 있다. 즉, 상기 파일의 핸들러를 생성하고, 상기 핸들러를 통해 파일을 읽고 쓰도록 할 수 있다.
단계(520)에서는 상기 명령어가 분기 명령어인지 판단할 수 있다. 예를 들어, 어셈블리어의 경우, 파일로부터 독출된 명령어가 jmp, jne, ja, je, jna, jae, jz, jnae, jnz, jb, js, jnb, jns, jbe, jc, jnbe, jnc, jg, jo, jng, jno, jge, jp, jnge, jpe, jl, jnp, jnl, jpo, jle, 및 jnle 중 적어도 하나를 포함하는 경우, 상기 명령어는 분기 명령어인 것으로 판단할 수 있다. 또한, jmp, jne, ja, je, jna, jae, jz, jnae, jnz, jb, js, jnb, jns, jbe, jc, jnbe, jnc, jg, jo, jng, jno, jge, jp, jnge, jpe, jl, jnp, jnl, jpo, jle, 및 jnle 뿐만 아니라, 어 셈블리어에서 분기 명령어로 분류될 수 있는 또다른 명령어 중 적어도 하나를 포함하는 경우, 상기 명령어가 분기 명령어인 것으로 판단할 수 있다. 또한, 어셈블리어 이외의 저급언어의 경우에도 각 저급언어의 명령어에서 분기 명령어로 인식될 수 있는 명령어가 포함되는지 판단할 수 있다. 여기서, 상기 명령어가 분기 명령어인지 판단하는 단계는 분기 명령어가 직접분기 명령어인 경우에 한하여 분기 명령어로 판단하도록 할 수 있다. 즉, 간접분기 명령어인 경우에는 별도로 모호화 과정을 수행하지 않을 수 있으므로, 독출된 명령어가 직접분기 명령어인 경우에만 분기 명령어로 판단하여 이후 단계를 수행하도록 할 수 있다.
단계(530)에서는 상기 명령어가 분기 명령어인 경우, 상기 분기 명령어를 모호화하여 모호화 명령어로 변환할 수 있다. 이때, 모호화 명령어는 직접분기 명령어를 간접분기 명령어로 대체하여 생성할 수 있다. 여기서, 어셈블리어의 경우, push, ret, mov, 및 jmp 명령어 중 적어도 하나를 포함하여 간접분기를 생성할 수 있다.
단계(540)에서는 상기 분기 명령어를 상기 모호화 명령어로 대체하여 상기 파일을 저장할 수 있다. 즉, 직접분기 명령어를 간접분기 명령어로 대체하여 저급언어 파일에 저장할 수 있다.
도 6은 본 발명의 일실시예에 있어서, 코드 제어 흐름 모호화 방법을 설명하기 위한 알고리즘을 나타내는 도면이다.
도 6을 참고하면, 단계(610)에서는 파일네임(filename)에 해당하는 파일의 핸들러를 읽어와 변수 F에 저장할 수 있다. 여기서, ReadFile은 파일을 읽어 들이 는 명령이며, 파일네임에 해당하는 파일을 읽어들이고, 핸들러를 만든 후 변수 F에 반환할 수 있다. 즉, 파일 핸들러를 생성하고, 상기 파일 핸들러를 통하여 파일을 읽고 쓸 수 있다.
단계(620)에서는 파일의 첫 번째 라인부터 읽어 오기 위해 변수 n에 1을 저장할 수 있다. 즉, n은 명령어의 순번을 의미하며, 파일의 명령어를 순차적으로 읽어오기 위해 n에 1을 초기화하여 저장하고 값을 1씩 증가시켜 라인별로 순차적으로 명령어를 읽어올 수 있도록 한다.
단계(630)에서는 핸들러 F의 n 번째 라인을 읽어와 변수 inst에 저장할 수 있다. 즉, 파일의 n번째 라인에 있는 명령어를 읽어와 변수 inst에 저장할 수 있다. 여기서, GetInst(arg1, arg2)은 저급언어 arg1 중 arg2 번째 명령어를 읽어 오는 명령일 수 있다.
단계(640)에서는 읽어 들인 inst의 명령어가 분기 명령인지를 확인할 수 있다. 분기 명령어인지 확인하기 위해 어셈블리어의 경우, 읽어 들인 inst의 명령어가 jmp, jne, ja, je, jna, jae, jz, jnae, jnz, jb, js, jnb, jns, jbe, jc, jnbe, jnc, jg, jo, jng, jno, jge, jp, jnge, jpe, jl, jnp, jnl, jpo, jle, 및 jnle 중 적어도 하나를 포함하는지 확인할 수 있다. 읽어 들인 inst의 명령어가 분기 명령어가 아닌 경우, 읽어 들인 inst의 명령어가 파일의 마지막 명령어가 아닌지 확인하고, 마지막 명령어가 아니라면, 다음 라인의 명령어를 읽어오도록 할 수 있다. 따라서, IsBranch(arg1)은 arg1이 분기 명령어인지에 따라 상기 분기 명령어를 모호화하거나, 다음 명령어를 읽어오기 위한 명령일 수 있다.
단계(650)에서는 상기 읽어 들인 inst의 명령어가 분기 명령이라면 모호화를 시도하고, 모호화된 결과를 inst'에 저장할 수 있다. 여기서, 모호화를 위해 직접분기를 간접분기로 변경할 수 있으며, 간접분기를 위해 push, ret, mov, 및 jmp 명령어 중 적어도 하나를 사용할 수 있다. 즉, Obfuscate(arg1)은 arg1에 모호화를 적용하기 위한 명령일 수 있다.
단계(660)에서는 모호화된 명령인 inst'를 상기 파일의 n번째 라인의 명령어로 대체할 수 있다. 상기 간접분기로 변경되어 모호화된 명령어를 상기 파일의 n번째 라인의 명령어로 대체하여 직접분기를 간접분기로 대체할 수 있다. 여기서, SetInst(arg1, arg2, arg3)는 arg1 파일 중 arg2 번째 명령을 arg3로 변경하도록 하는 명령일 수 있다.
단계(670)에서는 상기 파일의 전체 길이를 구하고 마지막으로 읽어 들인 명령어가 상기 파일의 마지막 명령어인지를 확인한다. 즉, 파일 전체의 길이와 변수 n에 저장된 값이 동일한지 판단하고, 동일하다면 마지막으로 읽어 들인 명령어가 상기 파일의 마지막 명령어인 것으로 확인하고, 모호화 과정을 종료할 수 있다. 따라서, 파일의 처음부터 끝까지 모든 명령어를 확인하여, 직접분기 명령어를 간접분기 명령어로 대체할 수 있다. 여기서, SizeofInst(arg1)은 arg1의 총 명령어의 개수를 반환하는 명령일 수 있다.
단계(680)에서는 마지막으로 읽어 들인 명령어가 상기 파일의 마지막 명령어가 아닌 경우, 변수 n에 1을 더하여 다음 라인의 명령어를 읽어오도록 할 수 있다. 따라서, 읽어 들인 명령어가 마지막 명령어일 때까지 순차적으로 파일에 포함 된 명령어를 읽어오고, 모호화를 수행할 수 있다.
한편, 도 5 내지 도 6에서 설명되지 않은 부분은 도 1 내지 도 4의 설명을 참고할 수 있다.
상기와 같이, 파일의 명령어를 순차적으로 읽어 들이고, 읽어 들인 명령어가 직접분기 명령어인 경우, 간접분기 명령어로 대체하여 저장함으로써, 플로우 차트의 생성을 방해할 수 있다.
또한, 적은 수의 코드를 추가하여 모호화를 통한 속도 저하가 거의 없는 코드 제어 흐름 모호화 장치 및 방법을 제공할 수 있다.
또한 본 발명의 일실시예에 따른 코드 제어 흐름 모호화 방법은 다양한 컴퓨터로 구현되는 동작을 수행하기 위한 프로그램 명령을 포함하는 컴퓨터 판독 가능 매체를 포함한다. 상기 컴퓨터 판독 가능 매체는 프로그램 명령, 데이터 파일, 데이터 구조 등을 단독으로 또는 조합하여 포함할 수 있다. 상기 매체는 프로그램 명령은 본 발명을 위하여 특별히 설계되고 구성된 것들이거나 컴퓨터 소프트웨어 당업자에게 공지되어 사용 가능한 것일 수도 있다. 컴퓨터 판독 가능 기록 매체의 예에는 하드 디스크, 플로피 디스크 및 자기 테이프와 같은 자기 매체(magnetic media), CD-ROM, DVD와 같은 광기록 매체(optical media), 플롭티컬 디스크(floptical disk)와 같은 자기-광 매체(magneto-optical media), 및 롬(ROM), 램(RAM), 플래시 메모리 등과 같은 프로그램 명령을 저장하고 수행하도록 특별히 구성된 하드웨어 장치가 포함된다. 프로그램 명령의 예에는 컴파일러에 의해 만들어지는 것과 같은 기계어 코드뿐만 아니라 인터프리터 등을 사용해서 컴퓨터에 의 해서 실행될 수 있는 고급 언어 코드를 포함한다.
이상과 같이 본 발명의 일실시예는 비록 한정된 실시예와 도면에 의해 설명되었으나, 본 발명의 일실시예는 상기 설명된 실시예에 한정되는 것은 아니며, 이는 본 발명이 속하는 분야에서 통상의 지식을 가진 자라면 이러한 기재로부터 다양한 수정 및 변형이 가능하다.  따라서, 본 발명의 일실시예는 아래에 기재된 특허청구범위에 의해서만 파악되어야 하고, 이의 균등 또는 등가적 변형 모두는 본 발명 사상의 범주에 속한다고 할 것이다.
도 1은 본 발명의 일실시예에 있어서, 코드 제어 흐름 모호화 장치를 도시한 블록도이다.
도 2는 본 발명의 일실시예에 있어서, 고급언어를 기계어로 컴파일하는 과정 상에서 코드 제어 흐름을 모호화하는 과정을 도시한 도면이다.
도 3은 본 발명의 일실시예에 있어서, 직접분기를 간접분기로 대체하여 코드 제어 흐름을 모호화하는 과정을 설명하기 위한 도면이다.
도 4는 본 발명의 일실시예에 있어서, 직접분기를 간접분기로 대체하기 위한 코드를 설명하기 위한 도면이다.
도 5는 본 발명의 일실시예에 있어서, 코드 제어 흐름 모호화 방법을 설명하기 위한 흐름도이다.
도 6은 본 발명의 일실시예에 있어서, 코드 제어 흐름 모호화 방법을 설명하기 위한 알고리즘을 나타내는 도면이다.
<도면의 주요 부분에 대한 부호의 설명>
110 : 독출부
120 : 판단부
130 : 변환부
140 : 저장부

Claims (12)

  1. 파일로부터 명령어를 독출하는 독출부;
    상기 명령어가 분기 명령어인지 판단하는 판단부;
    상기 명령어가 분기 명령어인 경우, 상기 분기 명령어를 하나 이상의 모호화 명령어로 변환하는 변환부; 및
    상기 분기 명령어를 상기 모호화 명령어로 대체하여 상기 파일을 저장하는 저장부
    를 포함하고,
    상기 모호화 명령어는,
    간접분기 명령어인 것을 특징으로 하는, 코드 제어 흐름 모호화 장치.
  2. 제1항에 있어서,
    상기 독출부는,
    저급언어로 컴파일된 파일로부터 명령어를 독출하는 것을 특징으로 하는 코드 제어 흐름 모호화 장치.
  3. 제1항에 있어서,
    상기 독출부는,
    상기 파일의 핸들러를 생성하는 핸들러 생성부; 및
    상기 핸들러의 명령어를 라인별로 독출하는 명령어 독출부
    를 포함하는 것을 특징으로 하는 코드 제어 흐름 모호화 장치.
  4. 제1항에 있어서,
    상기 판단부는,
    상기 명령어가 jmp, jne, ja, je, jna, jae, jz, jnae, jnz, jb, js, jnb, jns, jbe, jc, jnbe, jnc, jg, jo, jng, jno, jge, jp, jnge, jpe, jl, jnp, jnl, jpo, jle, 및 jnle 중 적어도 하나를 포함하는 경우, 상기 명령어는 분기 명령어인 것으로 판단하는, 코드 제어 흐름 모호화 장치.
  5. 삭제
  6. 제1항에 있어서,
    상기 변환부는,
    직접분기 명령어를 메모리를 사용한 하나 이상의 간접분기 명령어로 변환하는 것을 특징으로 하는 코드 제어 흐름 모호화 장치.
  7. 제1항에 있어서,
    상기 간접분기 명령어는,
    push, ret, mov, 및 jmp 명령어 중 적어도 하나를 포함하는 것을 특징으로 하는 코드 제어 흐름 모호화 장치.
  8. 제1항에 있어서,
    상기 독출부는,
    상기 파일의 모든 명령어를 순차적으로 독출하는 것을 특징으로 하는 코드 제어 흐름 모호화 장치.
  9. 파일로부터 명령어를 독출하는 단계;
    상기 명령어가 분기 명령어인지 판단하는 단계;
    상기 명령어가 분기 명령어인 경우, 상기 분기 명령어를 하나 이상의 모호화 명령어로 변환하는 단계; 및
    상기 분기 명령어를 상기 모호화 명령어로 대체하여 상기 파일을 저장하는 단계
    를 포함하고,
    상기 모호화 명령어는,
    간접분기 명령어인 것을 특징으로 하는, 코드 제어 흐름 모호화 방법.
  10. 제9항에 있어서,
    상기 독출하는 단계는,
    저급언어로 컴파일된 파일로부터 명령어를 독출하는 것을 특징으로 하는 코드 제어 흐름 모호화 방법.
  11. 제9항에 있어서,
    상기 독출하는 단계는,
    상기 파일의 핸들러를 생성하는 단계; 및
    상기 핸들러의 명령어를 라인별로 독출하는 단계
    를 포함하는 것을 특징으로 하는 코드 제어 흐름 모호화 방법.
  12. 제9항 내지 제11항 중 어느 한 항의 방법을 실행하기 위한 프로그램이 기록되어 있는 것을 특징으로 하는 컴퓨터에서 판독 가능한 기록 매체.
KR1020090031752A 2009-04-13 2009-04-13 코드 제어 흐름 모호화 장치 및 방법 KR101048588B1 (ko)

Priority Applications (1)

Application Number Priority Date Filing Date Title
KR1020090031752A KR101048588B1 (ko) 2009-04-13 2009-04-13 코드 제어 흐름 모호화 장치 및 방법

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
KR1020090031752A KR101048588B1 (ko) 2009-04-13 2009-04-13 코드 제어 흐름 모호화 장치 및 방법

Publications (2)

Publication Number Publication Date
KR20100113269A KR20100113269A (ko) 2010-10-21
KR101048588B1 true KR101048588B1 (ko) 2011-07-12

Family

ID=43132879

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020090031752A KR101048588B1 (ko) 2009-04-13 2009-04-13 코드 제어 흐름 모호화 장치 및 방법

Country Status (1)

Country Link
KR (1) KR101048588B1 (ko)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101306622B1 (ko) * 2011-06-22 2013-09-11 주식회사 에이디칩스 명령어 큐 제어장치
US8756435B2 (en) 2012-03-02 2014-06-17 Apple Inc. Obfuscation of control flow of software
CN111339503B (zh) * 2020-02-25 2023-01-03 Oppo广东移动通信有限公司 控制流混淆方法及相关产品
KR102524627B1 (ko) * 2020-12-31 2023-04-24 충남대학교 산학협력단 중간언어를 활용한 바이너리 프로그램 난독화 시스템 및 그 방법

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20000003016A (ko) * 1998-06-25 2000-01-15 윤종용 컴퓨터 프로그램의 컴파일 방법
KR20070086517A (ko) * 2004-12-22 2007-08-27 텔레호낙티에볼라게트 엘엠 에릭슨(피유비엘) 컴퓨터 프로그램 코드에 정보를 삽입하고 검출하는 방법 및이 방법을 수행하는 컴퓨터 판독가능 매체
KR20090083762A (ko) * 2008-01-30 2009-08-04 한양대학교 산학협력단 응용 프로그램 다형화 방법 및 그 장치

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20000003016A (ko) * 1998-06-25 2000-01-15 윤종용 컴퓨터 프로그램의 컴파일 방법
KR20070086517A (ko) * 2004-12-22 2007-08-27 텔레호낙티에볼라게트 엘엠 에릭슨(피유비엘) 컴퓨터 프로그램 코드에 정보를 삽입하고 검출하는 방법 및이 방법을 수행하는 컴퓨터 판독가능 매체
KR20090083762A (ko) * 2008-01-30 2009-08-04 한양대학교 산학협력단 응용 프로그램 다형화 방법 및 그 장치

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
한국정보보호학회 영남지부 학술발표회지 2009.02., 한동석 외1명저 "Jumping Port를 이용한 Control Flow Obfuscation"(2009.02.)*

Also Published As

Publication number Publication date
KR20100113269A (ko) 2010-10-21

Similar Documents

Publication Publication Date Title
US8874928B2 (en) System and method for obfuscating constants in a computer program
US8615735B2 (en) System and method for blurring instructions and data via binary obfuscation
CN108537012B (zh) 基于变量和代码执行顺序的源代码混淆方法及装置
KR101048588B1 (ko) 코드 제어 흐름 모호화 장치 및 방법
CN109598107B (zh) 一种基于应用安装包文件的代码转换方法及装置
US20080091923A1 (en) Register-based instruction optimization for facilitating efficient emulation of an instruction stream
CN107632832B (zh) 一种面向dalvik字节码控制流混淆方法
CN110574028B (zh) 用于防护软件代码的方法
CN105930694A (zh) 用于模糊虚拟机的灵活指令集
US20100058303A1 (en) System and method for conditional expansion obfuscation
US20200380150A1 (en) Method of encoding and decoding memory data for software security, recording medium and apparatus for performing the method
CN101477610A (zh) 源码和目标码联合嵌入的软件水印方法
US20170139693A1 (en) Code execution method and device
CN105404794A (zh) Java应用软件的保护方法和装置
US10108798B1 (en) Methods and systems for defending against cyber-attacks
EP3867784A1 (en) Applying security mitigation measures for stack corruption exploitation in intermediate code files
KR20080106796A (ko) 자바 변환 가속 장치 및 방법
JP4905480B2 (ja) プログラム難読化プログラム及びプログラム難読化装置
CN112487092B (zh) 一种基于区块链的智能合约调用方法及装置
US8423974B2 (en) System and method for call replacement
CN113721928B (zh) 一种基于二进制分析的动态库裁剪方法
KR20060035077A (ko) 데이터 처리 장치 및 이를 이용한 레지스터 할당 방법
CN101403977A (zh) 信息处理装置及其方法
Géczi et al. Automatic translation of assembly shellcodes to printable byte codes
CN112199163A (zh) 分析解释例程的虚拟指令方法、装置、设备及存储介质

Legal Events

Date Code Title Description
A201 Request for examination
E902 Notification of reason for refusal
E701 Decision to grant or registration of patent right
GRNT Written decision to grant
FPAY Annual fee payment

Payment date: 20140528

Year of fee payment: 4

FPAY Annual fee payment

Payment date: 20150630

Year of fee payment: 5

LAPS Lapse due to unpaid annual fee