코드 난독 화 | 프로그래머는 반드시 알아야 되는 난독화에 대한 개념 설명 110 개의 베스트 답변

당신은 주제를 찾고 있습니까 “코드 난독 화 – 프로그래머는 반드시 알아야 되는 난독화에 대한 개념 설명“? 다음 카테고리의 웹사이트 ppa.maxfit.vn 에서 귀하의 모든 질문에 답변해 드립니다: https://ppa.maxfit.vn/blog. 바로 아래에서 답을 찾을 수 있습니다. 작성자 컴맹이 해커가 되기까지 이(가) 작성한 기사에는 조회수 2,852회 및 좋아요 56개 개의 좋아요가 있습니다.

코드 난독 화 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 프로그래머는 반드시 알아야 되는 난독화에 대한 개념 설명 – 코드 난독 화 주제에 대한 세부정보를 참조하세요

코드 난독 화 주제에 대한 자세한 내용은 여기를 참조하세요.

코드 난독화 : 코드 보안을 위한 포괄적인 가이드 – AppSealing

코드 난독화는 실행 가능한 코드를 수정하여 이해, 해석, 실행에 사용할 수 없도록 하는 것입니다. 소스 코드 자체가 난독화되어 있어 제3자가 이해할 수 …

+ 여기에 표시

Source: www.appsealing.com

Date Published: 6/5/2021

View: 5014

난독화 – 위키백과, 우리 모두의 백과사전

코드 난독화는 프로그래밍 언어로 작성된 코드에 대해 읽기 어렵게 만드는 작업이다. 대표적인 사용 예로는 프로그램에서 사용된 아이디어나 알고리즘 등을 숨기는 것 …

+ 여기에 보기

Source: ko.wikipedia.org

Date Published: 3/23/2022

View: 8034

코드 난독화(Code Obfuscation) – 서광열 블로그

코드 난독화는 프로그램을 변화하는 방법의 일종으로, 코드를 읽기 어렵게 만들어 역공학을 통한 공격을 막는 기술을 의미한다. 난독화는 난독화의 …

+ 더 읽기

Source: skyul.tistory.com

Date Published: 8/8/2021

View: 9485

혼용되어 불리는 세 가지 소스코드 난독화 기법 – ksg – Medium

소스코드 난독화는 말 그대로 소스코드를 뒤죽박죽 만들어서 리버싱 엔지니어링을 힘들게 만드는 보호 작업을 의미입니다. 난독(명사) -읽기 어려움. 소스 …

+ 여기에 자세히 보기

Source: ksg97031.medium.com

Date Published: 12/10/2021

View: 1390

[칼럼] 모바일 어플리케이션의 소스코드를 보호하는 코드 난독화 …

코드 난독화란 말 그대로 소스코드를 읽기 어렵게 만들어 가독성을 떨어지게 만드는 기술입니다. 프로그래머들이 개발한 소스코드의 핵심 아이디어와 중요 데이터를 역공학 …

+ 더 읽기

Source: appguard.toast.com

Date Published: 7/24/2021

View: 1551

코드 난독화(Code Obfuscation) – 비트코기의 IT Note

구획 난독화, 데이터 난독화, 제어 난독화, 예방 난독화, 집단 난독화 가. 코드 난독화(Code Obfuscation)의 정의 – 역공학을 통한 보안 취약점 공격 …

+ 자세한 내용은 여기를 클릭하십시오

Source: itpenote.tistory.com

Date Published: 12/11/2022

View: 2730

안티 리버싱 :: 06 – 코드 난독화, 패킹

코드 난독화 (Code Obfuscating). ” obfuscate “. 말 그대로 코드를 읽기 어렵게 만들어서 리버서들이 분석하기 어렵게 하는 기술이다. 난독화 대상에 …

+ 자세한 내용은 여기를 클릭하십시오

Source: iforint.tistory.com

Date Published: 12/19/2021

View: 8027

바이너리 난독화 기법(Binary Obfuscation Techniques) – topcue

실무에서 마주친 난독화의 종류를 식별할 수 있는 것을 목표로 한다. Junk Code Insertion. 정크 코드 삽입(junk code insertion)은 명령어 수행의 …

+ 여기에 더 보기

Source: rond-o.tistory.com

Date Published: 5/15/2021

View: 902

코드 난독화 – IT위키

프로그램 코드를 읽기 어렵게 일부 또는 전체를 변경하는 것. 난독화의 대상에 따라 크게 ‘소스 코드 난독화’와 ‘바이너리 난독화’로 나뉜다.

+ 더 읽기

Source: itwiki.kr

Date Published: 4/26/2022

View: 4871

DuoShield | 더블 난독화 솔루션

이제 단순 ‘난독화’ 만으로 안심할 수 없다. ✓ ‘더블 난독화’는 피할 수 없는 선택! ✓ 소스코드 난독화와 바이너리 난독화 기술의 결합으로 가장 강력한 난독화 수준 …

+ 여기에 더 보기

Source: www.nshc.net

Date Published: 4/4/2021

View: 4811

주제와 관련된 이미지 코드 난독 화

주제와 관련된 더 많은 사진을 참조하십시오 프로그래머는 반드시 알아야 되는 난독화에 대한 개념 설명. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

프로그래머는 반드시 알아야 되는 난독화에 대한 개념 설명
프로그래머는 반드시 알아야 되는 난독화에 대한 개념 설명

주제에 대한 기사 평가 코드 난독 화

  • Author: 컴맹이 해커가 되기까지
  • Views: 조회수 2,852회
  • Likes: 좋아요 56개
  • Date Published: 2020. 2. 18.
  • Video Url link: https://www.youtube.com/watch?v=QtoMvAADThQ

코드 난독화 : 코드 보안을 위한 포괄적인 가이드

코드 난독화는 애플리케이션을 해킹으로부터 보호하기 위해 가장 많이 사용되는 애플리케이션 보안 기술 중에 하나입니다. 이는 전 세계 보안 전문가들이 가장 권장하는 AppSec 이니셔티브 중 하나이며, 애플리케이션의 최소 보안 사항으로 요구되는 경우가 많습니다. 대개 이 기술은 해킹 시도에 대한 주요한 방어 메커니즘 역할을 수행하며 코드 주입, 리버스 엔지니어링, 고객 및 애플리케이션 사용자의 개인정보 변조와 같은 일반적인 공격으로부터 보호합니다.

코드 난독화란?

코드 난독화는 실행 가능한 코드를 수정하여 이해, 해석, 실행에 사용할 수 없도록 하는 것입니다. 소스 코드 자체가 난독화되어 있어 제3자가 이해할 수 없고 실행만 가능하게 됩니다. 코드 난독화는 최종 사용자를 위한 애플리케이션 인터페이스 또는 코드의 의도된 출력에 영향을 미치지 않습니다. 이는 애플리케이션의 실행 코드를 손에 넣을 수도 있는 해커가 코드를 사용할 수 없도록 하기 위한 예방 조치일 뿐입니다.

코드 난독화가 필요한 이유

코드 난독화는 특히 오픈소스 애플리케이션에 유용하며, 이는 개인의 이익을 위한 코드를 해킹할 가능성을 크게 줄여줍니다. 애플리케이션을 리버스 엔지니어링하기 어렵게 만드는 방법을 통해 개발자는 제품의 지적 재산을 보안 위협, 무단 액세스, 애플리케이션 취약점 발견으로부터 보호합니다. 이 과정은 소스 코드에 대한 악의적인 접근을 제한하고, 구현된 난독화 기법의 종류에 따라 다양한 수준의 코드 보호를 보장합니다. 시간, 비용, 리소스 측면에서 난독화된 코드를 디컴파일하여도 이해하기 어렵기 때문에, 공격자는 코드를 더 이상 보유할 의미가 없어지게 됩니다.

코드 난독화 기술 유형

난독화는 여러 수준에서 작용하며, 의미 구조/유사 코드 구조 또는 데이터 구조/제어 흐름 수준에서 적용됩니다. 난독화 기술도 코드에서 수행하는 연산에 따라 달라집니다. 기본적으로 보안팀은 개발팀과 협의하여 코드에 어떤 수준의 난독화를 사용할지 결정합니다.

이름 변경 난독화

이 기술은 변수의 이름을 혼동하게 만들어 원래 사용 의도를 지능적으로 가려줍니다. 메소드와 변수는 서로 다른 표기법과 숫자를 사용하여 이름이 변경되므로 디컴파일러가 제어 흐름을 이해하기 어렵습니다. 이 난독화 기술은 Java, .NET, Android 플랫폼에서 개발된 애플리케이션 코드를 난독화하기 위해 주로 사용됩니다. 이는 레이아웃 난독화의 전반적인 범주에 속하며, 소스 코드를 직접 대상으로 하여 애플리케이션에 대한 방어 계층을 제공합니다.

이름 변경 난독화 메소드의 예

출처: PreEmptive

데이터 난독화

이 기술은 해커가 프로그램의 실제 의도를 파악할 수 없도록 코드에 사용되는 데이터 구조를 대상으로 합니다. 여기에는 프로그램을 통해 데이터가 메모리에 저장되는 방식과 저장된 데이터가 최종 출력을 표시하기 위해 해석되는 방식을 변경하는 것이 포함될 수 있습니다. 이 기술에는 다양한 변형이 있습니다.

1. 집계 난독화

이 방법은 프로그램에 데이터가 저장되는 방식을 변경합니다. 예를 들어, 배열은 많은 하위 배열로 분할될 수 있으며 프로그램의 다른 위치에서 참조될 수 있습니다.

2. 저장 난독화

이 방법은 데이터가 메모리에 저장되는 방식을 변경합니다. 예를 들어, 개발자는 변수의 저장 위치를 로컬 저장소와 전역 저장소 사이에서 이리저리 바꿀 수 있어서 변수 동작의 실제 특성을 난독화할 수 있습니다.

3. 순서 난독화

이 방법은 프로그램/코드 스니펫의 동작을 변경하지 않고 데이터의 순서를 변경합니다. 개발자는 변수 참조의 모든 인스턴스에 대해 호출되는 별도의 모듈을 개발하는 방식으로 이러한 방법을 구현합니다.

4. 문자열 암호화

이 방법은 읽을 수 있는 문자열을 모두 암호화하여 읽을 수 없는 코드를 생성합니다. 따라서 프로그램이 실행될 때 런타임에 암호를 해독해야 합니다.

5. 제어/코드 흐름 난독화

제어가 코드베이스의 한 섹션에서 다른 섹션으로 전달되는 방법은 프로그램의 의도를 결정하는 데 중요한 역할을 합니다. 이 흐름을 혼란스럽게 하는 것은 일반적으로 해커를 혼동하게 만들 수 있는 방법 중 가장 효과가 좋은 방법입니다. 이 난독화 방법은 해커가 코드의 특정 흐름을 채택하는 방법과 이유를 해독하지 못하게 합니다.

이를 구현하는 가장 일반적인 방법 중 하나는 임의적이고 예상치 못한 구문을 사용하여, 절대로 실행되지 않는 불필요한 대소문자 전환 구문(데드 코드)을 추가하는 것입니다. 이러한 구문은 해커를 혼란스럽게 만드는 것을 목적으로 합니다. 프로그램 실행 구문의 순서에 대한 이러한 변경은 조건부 프로그램 성향을 가진 경우에 특히 유용합니다.

제어 흐름 난독화 예

출처: PreEmptive

디버그 난독화

디버그 정보는 종종 프로그램 흐름, 디컴파일, 재컴파일을 통해 프로그램의 결함 등에 대한 중요한 정보를 아는 데 유용합니다. 식별자, 줄 번호를 변경하거나 디버그 정보에 대한 액세스를 모두 중지하여 이러한 식별 가능한 정보를 마스킹하는 것이 중요합니다.

주소 난독화

C, C++와 같은 비메모리 안전 언어를 사용하여 메모리 프로그래밍 오류를 이용하는 공격을 수행하는 것이 보편화 되었습니다. 검사되지 않은 배열의 액세스와 같은 오류로 인해 보안 취약성이 발생하는 경우가 많습니다. 주소 난독화 방법은 변환된 코드가 실행될 때마다 코드의 가상 주소와 프로그램의 데이터가 랜덤화되기 때문에 리버스 엔지니어링 과정을 어렵게 만듭니다. 이는 대부분의 메모리 오류 취약점을 이용한 공격의 효과를 장담할 수 없게 만들기 때문에, 공격 성공의 가능성을 낮추는데 효과적입니다.

주소 난독화의 예

출처: ScienceDirect

커스텀 인코딩

개발자는 커스텀 알고리즘을 사용하여 문자열을 인코딩하고 원래 코드를 가져올 수 있는 디코더 기능을 제공합니다.

런타임에 인수 전달

런타임에 인수를 예상하도록 프로그램을 변경할 수 있습니다. 이렇게 하려면 사용자가 변수의 암호를 해독할 코드와 암호 해독 키를 모두 가지고 있어야 합니다.

또한 보안 팀은 여러 가지 보안 위협으로부터 애플리케이션을 보호하기 위한 계층적 방어 방식을 구현하기 위해 둘 이상의 기술을 동시에 구현할 수도 있습니다.

난독화 방법의 품질 결정

코드 난독화의 성공 여부는 코드 변환 품질을 결정하는 몇 가지 매개변수에 달려 있습니다. 난독화 기술의 품질은 다음 요소의 조합에 의해 결정되어야 합니다.

힘과 탄력성:

난독화된 코드는 가장 취약한 부분에 의해 파괴될 수 있습니다. 따라서 난독화를 시도했을 때 난독화된 코드에 의해 어느 정도의 저항이 나타나는지 확인하는 것이 품질을 확인하는 가장 좋은 방법입니다. 코드를 해독하는 데 더 많은 노력과 시간이 필요할수록 난독화가 더 잘 된 것입니다.

차별화와 효과

이는 난독화된 코드가 원본 코드와 얼마나 다른지 보여줍니다. 제어 흐름의 깊이, 중첩 수준, 상속 수준은 소스 코드의 복잡성을 증가시키는 데 사용됩니다. 코드 난독화는 이러한 복잡성을 증가시킵니다.

스텔스

공격자가 난독화된 부분을 혼동하도록 원본 소스 코드와 구분할 수 없어야 합니다. 이는 공격자가 리버스 엔지니어링을 수행하기 어렵게 만듭니다. 이 요인은 상황에 따라 다르며, 종종 자동화된 리버스 엔지니어링 공격을 피하는 데 중요한 요소입니다.

비용

이것은 난독화되지 않은 코드에 비해 난독화된 코드를 실행하는 데 소요된 시간과 자원으로 정의됩니다. 난독화된 코드를 구현할 때 몇 가지 성능 고려 사항을 염두에 두어야 합니다. 지능적으로 난독화된 코드는 신중한 기술을 사용하여 불필요하게 비용/자원을 지출하지 않고 공격자를 혼란스럽게 하는 목적을 제공해야 합니다.

난독화가 코드 성능에 영향을 미치는가?

코드 난독화는 코드 구조에 큰 변화를 가져오므로 애플리케이션의 성능에도 큰 변화를 가져올 수 있습니다. 일반적으로 이름 변경 난독화는 변수, 메소드, 클래스만 변경되므로 성능에 거의 영향을 미치지 않습니다. 반면에 제어 흐름 난독화는 코드 성능에 영향을 미칩니다. 의미 없는 제어 루프를 추가하여 코드를 따르기 어렵게 만드는 것은 종종 기존 코드베이스에 오버헤드를 추가하기 때문에 구현해야 할 필수 기능이지만 주의가 필요합니다.

코드 난독화의 경험 법칙은 원본 코드에 적용되는 기술의 수가 많을수록 해독에 더 많은 시간이 소비된다는 것입니다. 기술 및 컨텍스트화에 따라 코드 성능에 미치는 영향은 일반적으로 10%에서 80%까지 다양합니다. 따라서, 위에서 논의한 요소인 효과와 복원력은 코드 난독화의 지침이 되어야 합니다(난독화 이름 변경 제외). 어떤 종류의 난독화도 기회비용이 있기 때문입니다.

위에서 설명한 대부분의 난독화 기술은 코드 성능을 중요시하며, 애플리케이션에 가장 적합한 기술을 선택하는 것은 개발 및 보안 전문가의 몫입니다. 바이너리 링크와 같은 기술은 여러 입력 라이브러리를 더 적은 수의 출력 라이브러리로 결합합니다. 이렇게 하면 애플리케이션이 가벼워지고 해커가 앱 코드를 조작할 수 있는 인터페이스가 줄어들 수 있지만, 코드 실행을 위해 런타임에 디컴파일을 하는 것은 번거롭고 종종 코드 실행 시간을 늘립니다. 이러한 균형은 보안 로드맵에서 고려하여 적절한 보호 계층을 추가하는 동시에 실제 환경에 코드를 실행할 수 있도록 사전에 결정해야 합니다. 즉, 난독화가 더 강력하고 복잡할수록 성능 오버헤드는 더 커집니다.

코드 난독화의 이점

보안 팀이 오픈 소스 플랫폼에서 호스팅되는 애플리케이션의 코드 난독화를 구현하는 방식에서 특히 많은 이점이 발생합니다. 신뢰할 수 없는 환경에서는 공격자가 코드를 검토하고 애플리케이션을 분석하기 어렵게 만드는 난독화된 애플리케이션을 배포하는 것이 항상 더 좋습니다. 이 프로세스를 통해 불법적인 이익을 얻기 위해 가짜 애플리케이션을 디버깅하고 변조 및 재배포하려는 범죄자가 이용할 수 있는 허점을 남기지 않을 수 있습니다. 이러한 보호 레이어는 특히 비즈니스에 치명적인 고객의 개인정보를 처리하는 애플리케이션에 필수적입니다.

또한 대부분의 난독화기는 유용하지 않은 메타데이터, 사용되지 않는 불필요한 코드 또는 중복 코드를 제거하여 코드를 최적화합니다. 이러한 최소화를 통해 컴파일 프로세스 속도가 빨라지고 코드 실행 속도가 빨라지며 결과도 빨라져 코드 실행 속도도 빨라집니다.

코드 난독화의 또 다른 주요 이점은 애플리케이션을 리버스 엔지니어링하기 어렵게 만든다는 것인데, 오픈 소스 플랫폼에 코드를 구축하는 것을 더 이상 걱정할 필요가 없게 됩니다. 반복적인 코드 난독화는 여러 개의 보안 레이어를 적용하는 경우에 특히 많이 사용됩니다. 이 기술에서 보안 팀은 이전 알고리즘의 출력이 다음 줄에 입력 역할을 하는 하나 이상의 난독화 알고리즘을 적용합니다. 이러한 방식으로 공격자는 프로그램의 원래 의도와 프로그램에 표시되는 내용에 대해 혼동할 수 있으며, 결과적으로 해독 시도가 실패할 수 있습니다.

코드 난독화는 난독화된 코드를 해독하는 데 심각한 노력, 기술, 자원, 시간이 필요하기 때문에 위협을 처리하고 재미로 해킹하는 사람들을 제거하는 실용적인 방법입니다. 해커가 성공하더라도, 해독된 부분은 원래 코드와 많이 닮지 않을 수 있습니다. 실효성 측면에서 실제 측정값을 찾기는 어렵지만 대부분의 기업은 보안을 위해 코드를 난독화하며 사유화합니다.

코드 난독화의 단점

모든 난독화 기술이 코드 성능에 영향을 미치기는 하지만 그 정도는 미미합니다. 난독화된 코드 부분과 난독화된 알고리즘의 복잡성에 따라 코드를 해독하는 데 상당한 노력이 수반될 수 있습니다.

자동화된 해독기 대부분은 난독화된 애플리케이션을 리버스 엔지니어링할 수 있습니다. 난독화는 리버스 엔지니어링을 지연시킬 수 있을 뿐 불가능하게 만드는 것은 아닙니다.

일부 안티바이러스 소프트웨어는 난독화된 코드가 있는 사이트를 방문할 때 사용자에게 경고를 보낼 수도 있는데, 이는 난독화가 악성 코드를 숨기기 위해 사용될 수도 있기 때문입니다. 이는 사용자가 합법적인 애플리케이션을 사용하는 것을 막고 신뢰할 수 있는 회사에서 멀어지게 될 수 있습니다.

코드를 난독화해야 하는가?

코드 난독화의 장단점을 고려할 때 적절한 질문은 ‘코드 난독화를 적용해야 하는가’입니다. 짧게 대답하자면 ‘예’입니다. 코드 난독화는 최소한 프로그램을 이해하기 어렵지만 기능을 그대로 유지하는 코드 조각으로 변환합니다. 리버스 엔지니어링 및 사이버 범죄자에게 제기되는 문제는 코드를 난독화하기에 충분한 이유입니다. 강력한 바이너리 수준의 난독화는 코드 미니화로 인해 프로그램 성능에 이점을 제공하므로 전략적인 코드 난독화를 구현해야 할 충분한 이유가 됩니다.

더 나은 결과를 위해 보안 전문가들은 코드 교체, 코드 변조 탐지, 런타임 애플리케이션 자가 보호(RASP), 워터마크, 암호화, 서버측 보호 등과 같은 다른 보안 메커니즘과 함께 코드 난독화를 구현하도록 권장합니다. 이렇게 하면 공격자는 제시간에 공격 행위를 완료하기가 어려워집니다. 성능에 민감한 코드를 식별하고 강력한 난독화 기술이 적용되는 경우 성능에 영향을 줄 수 있는 코드 부분을 표시할 수 있도록 애플리케이션의 런타임 동작을 분석하는 난독화 도구가 있습니다.

코드 난독화 도구

Android Studio에는 ProGuard 및 DexGuard와 같은 몇 가지 도구가 있습니다. Java의 오픈 소스 난독화기에는 클래스 파일 축소 프로그램인 ProGuard가 포함되며 사용하지 않는 클래스를 제거합니다. 또한 나머지 클래스의 이름을 의미 없는 이름으로 바꾸는 데 도움이 됩니다. 결과로 생성된 JAR 파일은 리버스 엔지니어링이 어렵습니다.

Python 난독화

이것은 Python 스크립트를 난독화하고 난독화된 스크립트를 고정 머신 스크립트에 바인딩하는 명령줄 인터페이스 도구입니다. 런타임 동안 각 함수의 co_code와 상수를 보호하여 Python 스크립트의 난독화를 도와줍니다. 또한 실행 중에 난독화된 스크립트의 라이센스 파일을 확인합니다. 개발자는 이를 통해 원래의 Python 스크립트를 난독화된 스크립트로 원활하게 교체할 수 있습니다.

JavaScript 난독화

이 도구는 JavaScript를 난독화하고, 기존 JS 파일을 전혀 새로운 표현식으로 변환하여 기능을 변경하지 않고서는 이해하기 어렵고 재사용할 수 없게 만드는 것으로 유명합니다. 콘솔 출력을 비활성화하여 디버그 보호, 변수 및 함수 이름 변경, 문자열 제거, 비활성 코드 주입, 자가 방어 기능과 같은 다양한 변환을 수행합니다. 사용자가 JS 파일을 업로드하고 필요한 난독화 수준에 따라 적절한 옵션을 선택할 수 있는 사용이 간편한 인터페이스를 갖추고 있습니다. 전역 변수 이름 바꾸기, 문자열 배열 회전 또는 섞기, 문자열 배열 인코딩, 모든 문자열을 유니코드 표현식으로 변환하여 이스케이프 시퀀스에 유니코드 작업을 수행하는 등의 다양한 작업을 수행할 수 있습니다. 또한 제어 흐름 평탄화도 포함되어 프로그램 소스 코드의 이해를 방해합니다. 그러나 이러한 변환은 런타임 속도를 약 1.5배 느리게 하여 코드 성능에 영향을 미칩니다.

SourceMap

이것은 난독화된 JavaScript 코드를 디버깅하는 데 도움을 주는 또 다른 도구입니다. 별도의 소스 맵은 프로덕션 환경에서 코드를 디버깅하는 데 유용할 수 있으며, 개발 팀은 소스 맵을 외부에서는 알 수 없는 비공개 위치에 업로드할 수 있습니다.

UglifyJS

CLI 모드에서 작동하며 JS 코드를 최소화, 난독화, 복원(beautify)하기 위한 다양한 옵션이 있습니다. JS에서 AST(추상 구문 트리)를 생성하는 파서, 변수, 메소드 이름을 단일 문자로 줄이는 맹글러 구성 요소와 변환을 사용하여 AST를 작은 것으로 최적화하는 압축기 구성 요소로 구성됩니다.

JavaScript의 한 가지 단점은 완전한 해독 방지가 될 수 없다는 것입니다. JS는 기본적으로 브라우저에서 실행되며 브라우저의 JS 엔진이 리소스를 렌더링하기 위해 JS를 읽어야 하기 때문입니다. 따라서 이 캡처 포인트는 생략할 수 없습니다.

PHP 난독화

Naneu의 PHP 난독화기

이것은 PHP를 파싱하고 변수 이름과 메소드를 난독화하는 난독화 도구입니다. 이 라이브러리는 UnPHP와 같은 해독기로부터 PHP를 보호하며 네이티브 PHP 환경에서 코드를 실행하는 데 유용합니다.

Yakpro PO

이 도구는 PHP Parser 4.x를 사용하여 PHP 코드를 구문 분석하며 GIT 클론으로 사용할 수 있습니다. 이로 인해 PHP 컴파일러는 재배포 코드를 이해할 수 있지만 소스 코드를 변조하는 사람은 이해할 수 없습니다. 제어 흐름 난독화를 구현하고, 주석, 들여쓰기, 문자열 리터럴을 모두 제거하고, 프로그램 디렉토리 전체를 반복적으로 난독화하며, 이름 변경 난독화를 구현합니다.

PHP Compactor 라이브러리는 PHP 코드베이스를 간결화 및 압축하는 또 다른 오픈 소스 라이브러리 난독화 도구입니다. 공백, 빈 줄, 주석이 제거되고 문자열이 인코딩됩니다.

HTML 난독화

HTML은 HTML 태그를 사용하여 복원(beautify)된 단순히 마크업된 텍스트입니다. HTML을 난독화하는 것은 보통 JavaScript로 변환하거나, 각 HTML 줄을 해당하는 숫자 코드로 변환하거나, 두 가지 메소드를 조합하여 수행합니다. 이것은 종종 효과적이지만, 변환의 각 단계에서 코드 오버헤드가 추가되기 때문에 순수 HTML의 무시할 수 있는 크기를 2~3배 증가시킵니다.

기존의 보안 접근 방식은 주로 서버측 보안에 중점을 두기 때문에 HFO(HTML Field Obfuscation)는 무시되는 경우가 많습니다. 앱에는 몇 가지 보안 취약성이 있습니다. Man-In-The-Browser와 같은 공격은 스크립트를 주입하여 사용자 이름 및 암호와 같은 중요한 필드에 연결하고 사용자가 입력할 때 자격 증명을 탈취합니다. 부정행위 방지 애플리케이션은 HFO를 사용하여 스크립트가 실행되지 않도록 합니다.

이 접근 방식은 대상 필드를 식별하는 데 브라우저 기반 애플리케이션을 사용하는 공격을 교란하도록 설계되었습니다. 미끼 필드는 필드 값을 암호화하는 것 외에도 공격자의 주의를 분산시키는 데에도 사용됩니다.

C, C#, and C++ 난독화

C 코드를 난독화하는 가장 좋은 방법은 컴파일하여 바이너리만 배포하는 것입니다. 이렇게 배포된 코드를 원래 형태로 리버스 엔지니어링하는 것은 매우 어렵습니다. 디컴파일 후 C/C++ 기계어 출력은 자체 난독화 되어 있어, 일정 수준의 난독화 기능이 내장되어 있다고 할 수 있습니다. 이러한 특징은 지적 재산에 대한 기술적 보호에 도움이 된다고 할 수 있습니다.

ANTLR(Another Tool for Language Recognition)은 C/C++ 소스 코드를 입력 파일로 가져와서 입력의 암시적 계층을 캡처하여 AST로 변환하는 파서 생성기입니다. 얻어진 구조에 기초하여, 각 노드는 구조의 의미 있는 구성요소를 나타냅니다. 이는 노드를 재구성하고 난독화 후 성능과 복원력을 검토함으로써 난독화 알고리즘을 구현하는 기반이 됩니다.

C/C++에 비해 C# 코드는 리버스 엔지니어링이 더 쉽습니다. 그 이유는 C# 어셈블리에 C++에 없는 메타데이터가 포함되어 있기 때문입니다. 또한 C#는 C/C++보다 소스 코드로 디컴파일하기가 쉬운 중간 언어로 매핑됩니다. 자동 난독화 도구의 일부 기능에는 사용자가 정의할 수 있는 보존된 이름 목록, C#에 대해 미리 정의된 예약 이름 목록, 주석 제거가 있습니다.

Crypto Obfuscator는 정교한 난독화 기술을 사용하여 C# 코드를 리버스 엔지니어링으로부터 보호합니다. 여기에는 기호 이름을 인식할 수 없는 이름으로 바꾸기, 중요한 메소드를 숨기기 위한 외부 메소드로부터 호출 숨기기, 문자열 암호화, 제어 흐름 난독화 등이 포함됩니다.

결론

요컨대, 코드 난독화만으로는 복잡한 보안 위협을 처리할 수 없습니다. 코드를 해독하는 것은 어렵지만, 자동화된 도구를 이용할 수 있고 해커도 전문 지식을 갖고 있으므로 리버스 엔지니어링이 불가능하지는 않습니다.

따라서 코드 난독화는 모든 애플리케이션 보안 요구를 위한 올인원 솔루션이 아닙니다. 개발 팀은 보안 요구 사항, 애플리케이션의 특성 및 성능 벤치마크에 따라 신뢰할 수 없는 환경에서 코드를 보호하기 위해 다수의 코드 난독화 기술을 구현하는 것을 고려할 수 있습니다. 각 기술의 장단점을 고려하여 이러한 작업을 수행해야 합니다. 이 전략은 암호화, RASP, 데이터 보존 정책 등과 같은 다른 AppSec 이니셔티브를 보완해야 합니다. 앱실링(AppSealing)과 같은 RASP 도구와 함께 사용하면 현재의 보안 위협에 대한 강력한 해결책을 구축할 수 있습니다.

위키백과, 우리 모두의 백과사전

코드 난독화는 프로그래밍 언어로 작성된 코드에 대해 읽기 어렵게 만드는 작업이다. 대표적인 사용 예로는 프로그램에서 사용된 아이디어나 알고리즘 등을 숨기는 것 등이 있다. 코드 난독화 과정을 거친 코드를 특정 기준에 의해 심사하는 대회도 있다.

개요 [ 편집 ]

코드 난독화는 프로그램 코드의 일부 또는 전체를 변경하는 방법 중 하나로, 코드의 가독성을 낮춰 역공학에 대한 대비책을 제공한다. 난독화를 적용하는 범위에 따라 소스 코드 난독화와 바이너리 난독화로 나눌 수 있다.[1] 또한, 난독화의 목적에 따라 각각 기술의 무단복제와 불법으로 침입하려는 프로그램을 방지하는 것으로 나뉘기도 한다.[2]

원리 [ 편집 ]

필요 이상으로 복잡한, 또는 아무것도 하지 않는 코드를 작성한다.

관련이 없는 여러 함수들을 뒤섞는다.

데이터를 알아보기 힘들게 인코딩한다.

만드는 방법 [ 편집 ]

다음과 같은 소수인지를 판별하는 액션스크립트 3 소스에 있는 isPrime 함수를 난독화 시켜보자.

//난독화 할 함수. function isPrime ( n : int ) : Boolean { var r : int = 0 ; while ( r * r <= n ) r ++; r --;// r은 [ n의 제곱근 ] 임 . if ( n == r ) return false ;// n이 0 또는 1 if ( n < 4 ) return true ; if ( n % 2 == 0 || n % 3 == 0 || n % r == 0 ){ return false ; } for ( var i : int = 6 ; i < r ; i += 6 ){ if ( n % ( i - 1 ) == 0 ) return n == i - 1 ; if ( n % ( i + 1 ) == 0 ) return n == i + 1 ; } return true ; } //함수 테스트 var num : int = 0 ; for ( var i : int = 0 ; i <= 100000 ; i ++ ){ if ( isPrime ( i )) num ++; } trace ( num ); //9592(π(100000))이 출력된다. for를 while로 바꾸고, 특별한 변수를 쓴다. [ 편집 ] for 문을 while 문으로 바꾼다. 만약 for 문이 두 번 이상 중첩되었을 경우, 아래와 같이 특별한 변수를 쓴다. int i , j ; for ( i = 0 ; i < 9 ; i ++ ) for ( j = 0 ; j < 9 ; j ++ ) printf ( "%d*%d=%d " , i + 1 , j + 1 ,( i + 1 ) * ( j + 1 )); 위 C 코드를 int k = 0 ; int i ( 0 ), j ( 0 ); while ( k < 9 * 9 ){ i = k / 9 ; j = k % 9 ; printf ( "%d*%d=%d " , i + 1 , j + 1 ,( i + 1 ) * ( j + 1 )); k ++ ; } 이렇게 바꾼다. 그 결과, 첫 번째의 액션스크립트 코드는 다음과 같이 바뀐다. (함수 부분만) function isPrime ( n : int ) : Boolean { var r : int = 0 ; while ( r * r <= n ) r ++; r --; if ( n == r ) return false ; if ( n < 4 ) return true ; if ( n % 2 == 0 || n % 3 == 0 || n % r == 0 ){ return false ; } var i : int = 6 ; while ( i < r ){ if ( n % ( i - 1 ) == 0 ) return n == i - 1 ; if ( n % ( i + 1 ) == 0 ) return n == i + 1 ; i += 6 ; } return true ; } 순환문을 재귀 함수로 바꾼다. [ 편집 ] 모든 순환문은 재귀 함수로 바꿀 수 있다. 함수의 인자로 함수 내부에 쓰이는 변수를 추가하고, 재귀적으로 호출을 시키는 방식이다. while문의 조건을 if문으로 바꾸는 식으로 순환문을 다음과 같이 재귀 함수로 바꿀 수 있다. function isPrime ( n : int , r : int = 0 , i : int = 6 ) : Boolean { if (( r + 1 ) * ( r + 1 ) <= n ) return isPrime ( n , r + 1 , i ); else if ( n == r ) return false ; else if ( n < 4 ) return true ; else if ( n % 2 == 0 || n % 3 == 0 || n % r == 0 ) return false ; else if ( i < r ) if ( n % ( i - 1 ) == 0 ) return n == i - 1 ; else if ( n % ( i + 1 ) == 0 ) return n == i + 1 ; else return isPrime ( n , r , i + 6 ); else return true ; } 이 방식에서 생기는 문제는, 수많은 함수 호출로 인해 속도가 매우 느려진다는 것이다. 구조를 난독화하고, 변수 이름을 의미없게 짓는다. [ 편집 ] if ( A ) B ; else if ( C ) D ; else E ; 같은 if-else 문을 ?: 조건 연산자를 이용하여 A ? B : C ? D : E ; 로 바꿀 수 있다. 변수 이름을 무작위로 (예: int rabbitNum = 0;을 int m = 0;으로 바꿈) 지어서 코드를 더욱 난독화 시킬 수 있다. function isPrime ( a : int , b : int = 0 , c : int = 6 ) : Boolean { return ( b + 1 ) * ( b + 1 ) <= a ? isPrime ( a , b + 1 , c ) : a == b ? false : a < 4 ? true : a % 2 == 0 || a % 3 == 0 || a % b == 0 ? false : c < b ? a % ( c - 1 ) == 0 ? a == c - 1 : a % ( c + 1 ) == 0 ? a == c + 1 : isPrime ( a , b , c + 6 ) : true ; } 내부 변수를 없앤다. [ 편집 ] 만약 내부 변수가 쓰인다면, 그것을 다른 것으로 치환한다. 예 : 다음 C 코드를 다음과 같이 바꾼다. double divide ( int a , int b ){ double c = a / ( double ) b ; return c ; } c를 a/(double)b로 치환한다. double divide ( int a , int b ){ return a / ( double ) b ; } 이름을 다시 한번 난독화한다. [ 편집 ] 함수 이름과 변수 이름을 바꾼다. 여기에서는 변수 이름을 _, __, ___으로 바꾸고, 함수 이름을 ____으로 바꿨다. function ____ ( _ : int , __ : int = 0 , ___ : int = 6 ) : Boolean { return ( __ + 1 ) * ( __ + 1 ) <= _ ? ____ ( _ , __ + 1 , ___ ) : _ == __ ? false : _ < 4 ? true : _ % 2 == 0 || _ % 3 == 0 || _ % __ == 0 ? false : ___ < __ ? _ % ( ___ - 1 ) == 0 ? _ == ___ - 1 : _ % ( ___ + 1 ) == 0 ? _ == ___ + 1 : ____ ( _ , __ , ___ + 6 ) : true ; } 리터럴을 함수 인자로 넘겨주는 방법을 쓸 수도 있고, 살짝 위험하기는 하지만, 1을 a/a와 같이 다른 변수로 치환시키는 방법을 쓸 수도 있다. 비록 권장하는 방법은 아니지만, 여기에서는 후자의 방법을 쓰겠다. function ____ ( _ : int , __ : int = 0 , ___ : int = 6 ) : Boolean { return ( __ + ___ /___)*(__+___/ ___ ) <= _ ? ____ ( _ , __ + ___ / ___ , ___ ) : _ == __ ? _ - _ : _ < ___ - ( __ + _ + __ - _ ) /__?_/ _ : _ % ( __ /__+_/ _ ) == _ - _ || _ % ( __ * ___ /(__+__))==__-__ || _%__==___-___?___/ ___ - _ / _ : ___ < __ ? _ % ( ___ - _ /_)==__/ __ - ___ /___?_==___-__/ __ : _ % ( ___ + ___ / ___ ) == __ + _ - __ - _ ? _ == ___ + ___ /___:____(_, __, ___+(__*___*(_+_+_)+__*_*___+(__+__)*___*_)/ _ /__/ ___ ) : _ ; } 스페이스, 탭 등을 없앤다. [ 편집 ] 여기에서는 한 줄로 적으면 너무 길어지므로, 적당히 줄바꿈을 하였다. function ____ ( _ : int , __ : int = 0 , ___ : int = 6 ) : Boolean { return ( __ + ___ /___)*(__+___/ ___ ) <= _ ? ____ ( _ , __ + ___ / ___ , ___ ) : _ == __ ? _ - _ : _ < ___ - ( __ + _ + __ - _ ) /__?_/ _ : _ % ( __ /__+_/ _ ) == _ - _ || _ % ( __ * ___ /(__+__))==__-__||_%__==___-___?___/ ___ - _ / _ : ___ < __ ? _ % ( ___ - _ /_)==__/ __ - ___ /___?_==___-__/ __ : _ % ( ___ + ___ /___)==__+_-__-_?_==___+___/ ___ : ____ ( _ , __ , ___ + ( __ * ___ * ( _ + _ + _ ) + __ * _ * ___ + ( __ + __ ) * ___ * _ ) /_/ __ / ___ ) : _ } 최종 결과 [ 편집 ] function ____ ( _ : int , __ : int = 0 , ___ : int = 6 ) : Boolean { return ( __ + ___ /___)*(__+___/ ___ ) <= _ ? ____ ( _ , __ + ___ / ___ , ___ ) : _ == __ ? _ - _ : _ < ___ - ( __ + _ + __ - _ ) /__?_/ _ : _ % ( __ /__+_/ _ ) == _ - _ || _ % ( __ * ___ /(__+__))==__-__||_%__==___-___?___/ ___ - _ / _ : ___ < __ ? _ % ( ___ - _ /_)==__/ __ - ___ /___?_==___-__/ __ : _ % ( ___ + ___ /___)==__+_-__-_?_==___+___/ ___ : ____ ( _ , __ , ___ + ( __ * ___ * ( _ + _ + _ ) + __ * _ * ___ + ( __ + __ ) * ___ * _ ) /_/ __ / ___ ) : _ } //함수 테스트 var num : int = 0 ; for ( var i : int = 0 ; i <= 100000 ; i ++ ){ if ( ____ ( i )) num ++; } trace ( num ); //9592 사용 예 [ 편집 ] 자바스크립트 코드의 용량을 줄이는 데 쓰는 Packer는, 또한 자바스크립트를 읽기 어렵게 하는 데 쓰인다. 각주 [ 편집 ] ↑ 마이크로소프트웨어(2007.12월) 서광열의 프로그래밍 언어 이야기, 코드 난독화 ↑ 보안공학연구논문지(Journal of Security Engineering), Vol. 5, No. 2, May 2008 이병용, 최용수. Obfuscation 기술의 현황 및 분석과 향후 개발 방향

코드 난독화(Code Obfuscation)

마이크로소프트웨어 2007년 12월에 기고한 글입니다.

역공학(reverse engineering)이란?

역공학의 개념

대부분의 개발자들은 컴파일된 바이너리를 완전한 블랙박스로 취급한다. 윈도의 PE 포맷이나 리눅스의 ELF 포맷을 이해하더라도 코드섹션(code section)에 들어있는 기계어(어셈블리어)를 이해하기란 무척 어렵다. 하지만 보안 취약점 분석가들의 주요 업무는 이런 바이너리 코드를 읽고 보안 취약점을 찾아내는 것이다. 이는 보안 전문가들이라 할지라도 쉽지 않은 일인데, 보통 컴파일된 바이너리를 다시 원래의 소스코드로 복구하는 프로그램인 디컴파일러(decompiler)의 도움을 받는다. 디컴파일러는 원래 소스 코드를 완벽히 복구하지는 못하지만, 어셈블리에 비해서는 훨씬 이해하기 쉬운 프로그래밍 언어(주로 C)의 소스 코드를 생성해준다. 또한 코드 섹션에 직접 브레이크를 걸고 실행시켜볼 수 있는 디버거(debugger)의 도움을 받는 경우도 많다.

이처럼 바이너리 코드를 분석해 유용한 정보를 뽑아내는 작업을 역공학(reverse engineering)이라 부른다. 최근 보안 취약점 분석의 상당 부분은 역공학과 관련되어 있다. 실제로 역공학은 윈도우처럼 소스 코드가 공개되지 않은 운영체제나, 어플리케이션의 보안 버그를 찾아내는데 적극적으로 활용되고 있다.

역공학의 위험성을 보여주는 예로, 각종 보안 프로그램들이 뚫린 사례를 들 수 있다. 예를 들어 도서관 같은 공용 컴퓨터에 불법적인 프로그램을 설치하는 것을 막기 위해 리부팅하면 하드가 리셋(reset)되는 시스템이 있다. 이 시스템은 추가적은 프로그램 설치를 위해 관리자 모드를 제공하는데, 4자리의 패스워드를 입력하도록 되어있다. 역공학을 이용해 패스워드를 검사하는 루틴을 찾아내면, 이 부분을 건너뛰게 만들 수도 있다.

수십 가지의 안전장치를 마련한 인터넷 뱅킹도 예외가 아니다. 안전한 공인 인증서를 이용한다고 해도, 입력받은 비밀번호와 공인인증서 비밀번호를 비교하는 코드를 찾아내서 해당 루틴을 건너뛰게 만든다면 공인인증서의 비밀번호(passphrase)는 의미가 없어진다. 아무리 많은 안전장치를 걸어놔도 윈도 머신에서 실행되는 바이너리라면, 그 내용을 분석해 해당 코드를 제거해 버리면 되기 때문이다.

현재 MS 윈도의 보안 모델에서는 이런 역공학에 의한 공격에 효과적인 대응책이 없다. 그나마 우리가 할 수 있는 차선책은 바이너리를 분석하기 어렵도록 복잡하게 만들어 주는 것이다. 코드 난독화의 필요성은 여기서 출발한다.

코드 난독화(code obfuscation)

코드 난독화는 프로그램을 변화하는 방법의 일종으로, 코드를 읽기 어렵게 만들어 역공학을 통한 공격을 막는 기술을 의미한다. 난독화는 난독화의 대상에 따라 크게 1) 소스 코드 난독화와 2) 바이너리 난독화로 나눌 수 있다. 소스 코드 난독화는 C/C++/자바 등의 프로그램의 소스 코드를 알아보기 힘든 형태로 바꾸는 기술이고, 바이너리 난독화는 컴파일 후에 생성된 바이너리를 역공학을 통해 분석하기 힘들게 변조하는 기술이다.

일단 소스 코드 난독화의 필요성을 먼저 이야기해보자. 첫 번째 경우는 부득이하게 소스 코드를 릴리즈(release)해야 하는 경우이다. 예를 들어 플래시 파일 시스템을 파는 A라는 회사가 있다고 하자. B 회사는 A 회사의 라이브러리를 구매해서 제품을 만들려고 한다. B 회사는 매우 많은 플랫폼을 가지고 있고, 여러 설정에 따라서 플래시 파일 시스템을 조금씩 다르게 컴파일해야할 필요가 있다고 하자. 이 경우 B 사가 일일이 해당 라이브러리를 빌드해서 릴리즈해주는 방법도 있지만, 난독화 도구를 이용해 코드를 적당히 알아보기 힘들게 만든 후에 A 사에 넘겨서 A사가 직접 빌드하도록 하는 것이 편리할 것이다.

또 다른 예로 최근 부각 받는 AJAX의 경우, 자바스크립트(JavaScript)로 작성된 코드가 브라우저에 그대로 노출되는 문제가 있다. 소스 코드를 공개하고 싶지 않은 개발자라면 AJAX의 이런 특성이 큰 부담이 될 것이다. 이 경우 자바스크립트 코드를 쉽게 알아보지 못하도록 난독화 도구를 사용할 수 있다. 다음은 JavaScript Obfuscator가 실제로 자바 스크립트를 난독화한 예제이다. 원래 코드와 난독화된 코드를 비교해보면, 난독화 과정에 대한 감을 잡을 수 있을 것이다.

<원래 코드>

//detect which browser is used

var detect = navigator.userAgent.toLowerCase();

var OS,browser,version,total,thestring;

if (checkIt(‘konqueror’))

{

browser = “Konqueror”;

OS = “Linux”;

}

else if (checkIt(‘opera’)) browser = “Opera”

else if (checkIt(‘msie’)) browser = “Internet Explorer”

else if (!checkIt(‘compatible’))

{

browser = “Netscape Navigator”

version = detect.charAt(8);

}

else browser = “An unknown browser”;

//version of browser

if (!version) version = detect.charAt(place + thestring.length);

//client OS

if (!OS)

{

if (checkIt(‘linux’)) OS = “Linux”;

else if (checkIt(‘x11’)) OS = “Unix”;

else if (checkIt(‘mac’)) OS = “Mac”

else if (checkIt(‘win’)) OS = “Windows”

else OS = “an unknown operating system”;

}

//check the string

function checkIt(string)

{

place = detect.indexOf(string) + 1;

thestring = string;

return place;

}

NHN Cloud

무료 데모 환경 예약하기

NHN AppGuard에서 탐지한 보안 로그를 대쉬보드에서 검색하고 다양한 실시간 보안 정책을 경험 할 수 있습니다.

필수 데모 아이디 필수 이름 필수 회사 이메일 개인정보 수집 및 이용 동의 (필수) 보기

자세히 보기

안티 리버싱 :: 06 – 코드 난독화, 패킹

1. 코드 난독화 (Code Obfuscating)

” obfuscate ”

말 그대로 코드를 읽기 어렵게 만들어서 리버서들이 분석하기 어렵게 하는 기술이다.

난독화 대상에 따라 크게

– 소스코드 난독화 : 프로그래밍 언어로 작성된 소스 코드를 알아보기 힘든 형태로 바꾸는 기술

– 바이너리 난독화 : 컴파일 후에 생성된 바이너리를 역공학을 통해 분석하기 힘들게 변조하는 기술

로 나눌 수 있다.

난독화를 시키면 결과값이 동일하고 문법에 위배되지는 않지만 변수명, 순서, 쓸모없는 코드 등을 이용하여 읽는 것을 어렵게 만드는 것이다.

(암호화와는 좀 다른 개념이다.

암호화는 읽기 어려운 수준이 아니라 키값(DES, AES 등) 이 있어야 볼 수 있다는 뜻..!)

1.1 Dummy Codes

: 실제로는 아무런 역할을 하지 않지만, 코드 사이에 넣음으로써 코드 난독화를 시키거나 디스어셈블러와 같은 분석툴이 명령어(instruction)들을 잘못 해석하게 하는 용도로 사용된다.

간단한 Dummy Codes 들을 섞은 코드를 작성해보면 다음과 같다.

(흐름 파악을 위해… )

__asm { xor ebx, ebx add ebx, 2 add esi, ebx mov eax, fs:[0x30] // PEB mov ecx, 0xsecurityfact cmp ecx, 0xsecurity jne fact add esp, 0x20 call esp // never happen fact: sub ecx, eax cmp byte ptr [eax + 2], 1 // BeingDebugged vs 1 je DebuggerDetected lea ebx, [eax + ecx] push 00403116 push 0 call printf xor ecx, ecx DebuggerDetected: add ecx, 3 push 004030F1 push 0 call printf xor ecx, ecx }

이 중에서 유효한, 목표하는 코드는 다음과 같다.

__asm {

mov eax, fs:[0x30] // PEB

jmp fact

fact:

cmp byte ptr [eax + 2], 1 // BeingDebugged vs 1

je DebuggerDetected

push 00403116

push 0

call printf

DebuggerDetected:

push 004030F1

push 0

call printf

}

2. 패킹(Packing)

패킹은 크게

– 프로그램 용량을 줄이거나(shrink),

– 검사/분석을 어렵게 하기 위한

2가지 목적을 위해 사용된다.

많은 packer 가 있지만, 모두 비슷한 패턴을 가진다:

– 실행 파일을 변환하여 데이터로 저장하고,

– OS 에서 호출하는 언패킹 스텁(unpacking stub) 을 제공한다.

그래서 압축 파일과는 달리, 내부에 압축 해제 코드를 포함하여 실행하는 순간에 알아서 압축이 해제되고 실행되는 기술이다.

이를 수행하는 것이 패커(packer)이고, 상용화중인 패커들의 종류와 특징에 대해 알아보겠다.

2.1 UPX

– 프리웨어 https://github.com/upx/upx

– 가벼우면서 다양한 포맷 지원

– 효율이 좋아 많이 쓰임

2.2 ASPack / ASProtect

– 상용 프로그램

– x86, x64 윈도우 실행파일을 모두 지원

– 코드 압축률은 그닥이지만 암호화는 잘 되어있다. (Stolen Bytes 기법이 최초로 구현된 패커)

http://www.aspack.com/

2.3 Themida

– 가장 강력한 패커 중 하나 (언패킹할 수 있는 자가 많이 없다고..)

– anti-debugging, anti-dumping, anti-VM 등 다양한 기능 지원 및 직접 커스텀 가능

– 현재 카카오톡, 은행 등의 프로그램에서 많이 사용 중

(실제로 디버거 쓰면서 카카오톡 사용 불가능.. 이때 뜨는 경고문에 Themida ~ 예전 게시글 참고)

2020/08/04 – [SECURITY/REVERSING] – 안티 리버싱 :: 01 – 안티 리버싱이란?

https://www.oreans.com/

참고 문헌

[1] practical malware analysis / Michael Sikorski & Andrew Honig / 2012 / Ch.18

[2] Anti-Reversing Techniques / 김형찬 / 20160929

바이너리 난독화 기법(Binary Obfuscation Techniques)

Introduction

바이너리 난독화(binary obfuscation)의 주요 목적은 바이너리의 정적 분석 과정을 방해하는 것이다.

바이너리의 심벌(변수 및 함수) 이름을 바꾸는 것은 변수가 어떤 데이터를 보유하고 있는지에 대한 정보 또는 함수명에서 동작에 대한 단서 등이 손실된다는 것을 의미한다.

코드를 난독화하는 데에는 여러 가지 이유가 있을 수 있다.

가장 일반적인 경우는 DRM(Digital Rights Management) 때문이다. 예를 들어, 자격을 확인하는 코드를 난독화하여 크래커(cracker)로 하여금 자격 확인을 우회하기 어렵게 만들 수 있다. 난독화가 쓰이는 또 다른 분야는 anti-cheat 소프트웨어다.

물론 이외에도 안티 바이러스나 샌드박스(sandbox)를 우회하는 악의적인 동작을 숨기는 목적으로 쓰이기도 한다.

난독화의 주요한 목표 중 하나는 분석가의 작업을 어렵게 만드는 것이다. 난독화는 일반적으로 컴파일러에 의해 최적화된 간단한 코드의 최적화를 해제(de-optimizing)하여 남용(abuse)한다. 그로 인해 CPU가 더 많은 계산을 수행해야 하지만 사람인 분석가가 더 이해하기 어렵게 만든다.

다음 중 하나라도 만족한다면 난독화의 목표를 달성했다고 말할 수 있다.

분석가가 분석할 시간이 없다.

분석가가 좌절해서 포기한다.

난독화가 해제되기 전에 프로그램이 대체(superseded)된다.

난독화는 unbreakable한 것이 아니며, 그것을 깨는 데 필요한 시간이 성공했을 때의 이점보다 크다면 성공이다.

난독화에는 다양한 유형이 있으며, 여기서는 가장 일반적인 유형을 다룰 것이다. 실무에서 마주친 난독화의 종류를 식별할 수 있는 것을 목표로 한다.

Junk Code Insertion

정크 코드 삽입(junk code insertion)은 명령어 수행의 결과에 영향을 미치지 않는 선에서 실제 명령어들을 코드(다른 명령어들) 사이에 교차해 배치(interleave)하는 기술이다. 다시 말해 실제 명령어를 다른 명령어들 사이에 숨기는 기술이다. 이때 숨기려는 명령어는 실제로 아주 단순한 동작을 수행할지라도 기타 명령어들과 함께 보면 아주 복잡한 작업을 수행하는 것처럼 보인다.

이런 명령어들은 분석한 뒤 nop으로 패치하는 방식으로 우회할 수 있다.

이는 아주 간단한 기술이지만 경험이 부족한 분석가를 속이기에 충분하다. 이 기술은 opaque predicates 및 변종 코드(metamorphic code)와 결합해 사용할 때 유용하다.

Junk Code Insertion technique

Metamorphic Code

변종 코드(metamorphic code)는 명령어를 같은 결과를 산출하지만 난해한 일련의 코드로 확장시키는 기술이다.

그 효과는 단순한 코드를 복잡하게 보이도록 만드는 독창성에 달려있다. 이는 난독화에서 가장 중요한 주제이며 다른 몇 가지 기법의 핵심이다.

Metamorphic Code technique

Data Encoding

데이터 인코딩(data encoding)은 산술 연산과 literal value를 여러 난해한 계산으로 확장시키는 기술이다. 다시 말해 정적 데이터 값을 하드 코딩하지 않고 런타임에 계산되도록 하는 것이다.

이는 필요한 곳에서 호출되는 동안 디코딩된 문자열을 임시로 계산한 다음 호출이 반환된 후 해당 메모리를 지우거나 다시 인코딩하는 방식으로 문자열에도 적용된다.

Data Encoding technique

Opaque Predicates

opaque predicate는 정적 결과의 분기(that always taken or never taken)에 코드를 삽입하여 branch predicate의 계산 자체를 난독화하는 기술이다. 동일한 결과를 생성하는 trivial branch 명령어 대신 여분의 검사를 추가한다. 또한 절대 취해지지 않는(nerver taken) 분기를 추가해 분석을 더욱 혼란스럽게 만든다.

이 기술은 코드의 cyclomatic 복잡도를 폭발적으로 증가시키고, 대부분의 디컴파일러들이 난해한 코드를 생성하게 만든다.

Opaque Predicates technique

Splitting

splitting은 함수나 기본 블록을 비조건 점프(unconditional jump), call, opaque predicates 등으로 구성되는 더 작은 함수나 블록으로 분할하여 interleave하는 기술이다. 이는 코드의 전체적인 흐름을 파악하는 것이 불가능하거나 매우 어려워지기 때문에 함수의 context나 상태를 추적하는 것을 어렵게 만든다.

splitting되면 코드는 함수가 덜 선형적으로 보이게 만들기 위해 종종 scramble되거나 랜덤화된다.

Splitting technique

Control Flow Flattening

제어 흐름 평탄화(control flow flattening)는 함수의 논리 흐름을 state machine으로 바꾸고 상태를 기반으로 모든 경로를 단일 dispatch table로 평탄화(flatten)하는 기술이다.

각 분기는 다음 분기에 따라 상태를 업데이트한다. flattening은 해석되는 바이트 코드가 없다는 점을 제외하면 가상화와 모습이 비슷하다.

Control Flow Flattening technique

Virtualization

가상화(virtualization)는 난독화 분야에서 가장 최근에 발전한 기술 중 하나다. native code를 매칭되는 interpreter loop과 함께 동적으로 생성된 unique bytecode로 변환하여 동작한다. 그런 다음 함수 호출은 실행할 바이트코드 스트림에 대한 포인터가 있는 가상 머신에 대한 entry point로 대체된다.

제어 흐름 그래프(CFG)는 제어 흐름 평면화(control-flow-flattened) 함수와 거의 동일하게 보이지만 함수 자체에 상태를 포함하는 대신 인터프리터에서 바이트코드 실행을 로드하고 처리한다는 점이 추가되었다.

Polymorphic Code

다형성 코드(polymorphic code)는 실행 중에 스스로 수정하여 수행하는 작업이나 후속 실행(심지어는 동일한 실행 중에도)에서 수행하는 경로를 변경하거나 코드를 수정하는 기술이다. 이 기술은 분석하기 매우 어려워 보일 수 있지만, 쓰기 가능하고 실행 가능한 메모리(또는 메모리 보호 API에 대한 호출)가 필요하므로 이를 감지할 수 있다.

참고

[1] https://hexterisk.github.io/blog/posts/

[2] NorthSec 2020 Advanced Binary Analysis Workshop by Alexandre Beaulieu

코드 난독화

Code Obfuscation

프로그램 코드를 읽기 어렵게 일부 또는 전체를 변경하는 것. 난독화의 대상에 따라 크게 ‘소스 코드 난독화’와 ‘바이너리 난독화’로 나뉜다. 소스 코드 난독화는 C/C++/자바 등의 프로그램의 소스 코드를 알아보기 힘든 형태로 바꾸는 기술이고, 바이너리 난독화는 컴파일 후에 생성된 바이너리를 역공학을 통해 분석하기 힘들게 변조하는 기술이다.

코드 난독화 유형 [ 편집 | 원본 편집 ]

구분 설명 배치난독화 실행파일에 포함된 문자열의 내용을 무작위 치환 자료난독화 프로그램 내부 자료 구조 변환 또는 암호화 제어 난독화 제어 흐름을 바꿈으로써 디컴파 난이도 향상 ㄴ계산 변환 goto분의 loop중간을 가르키게 함으로써 원래의 for문으로 쉽게 디커파일 불가 ㄴ집합 변환 inline/outline, 복제(cloning), 루프 해제(loop unrolling)

루프 조건을 추가함으로써 루프 확장 ㄴ순서 변환 분기 명령을 이용한 블록 순서 변환

루프 순서 변환, 수식 순서 변환 등 디컴파일 방지 역공학도구로 사용되는 디컴파일러나 디버거 또는 무력화

return instruction후 추가적인 instruction 삽입으로 특정 decompiler무력화

코드 난독화 주요 기술 [ 편집 | 원본 편집 ]

더블 난독화 솔루션 – 소스코드 난독화와 바이너리 난독화 기술의 결합 – NSHC Inc.

더블 난독화

✓ 이제 단순 ‘난독화’ 만으로 안심할 수 없다.

✓ ‘더블 난독화’는 피할 수 없는 선택!

✓ 소스코드 난독화와 바이너리 난독화 기술의 결합으로 가장 강력한 난독화 수준을 구현

키워드에 대한 정보 코드 난독 화

다음은 Bing에서 코드 난독 화 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 프로그래머는 반드시 알아야 되는 난독화에 대한 개념 설명

  • 동영상
  • 공유
  • 카메라폰
  • 동영상폰
  • 무료
  • 올리기

프로그래머는 #반드시 #알아야 #되는 #난독화에 #대한 #개념 #설명


YouTube에서 코드 난독 화 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 프로그래머는 반드시 알아야 되는 난독화에 대한 개념 설명 | 코드 난독 화, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

Leave a Comment