HOWTO · Csharp

C#에서 코드 난독화

이 기사에서는 해커가 읽거나 이해할 수 없도록 C#에서 코드를 난독화하는 방법을 탐구할 것입니다.

이 기사에서는 C#에서 코드를 난독화하는 방법을 소개합니다. 다양한 방법과 프로세스에 도움이 될 수 있는 몇 가지 도구를 사용합니다.

대부분의 비 .Net 컴파일러는 기본 CPU 명령어가 포함된 바이너리 프로그램을 내보냅니다. 디스어셈블, 디컴파일 및 리버스 엔지니어링이 매우 어렵습니다.

그러나 C# 및 Managed C++와 같은 모든 .Net 컴파일러는 MSIL(Microsoft Intermediate Language Format)로 컴파일된 프로그램을 제공합니다.

이 형식은 클래스 이름, 필드, 메서드, 속성 및 설정은 물론 풍부한 구조의 실제 코드와 같은 소프트웨어에 대한 많은 고급 정보를 유지합니다.

결과적으로 .Net 어셈블리에서 이 정보를 추출하기 위해 다양한 디컴파일러와 디스어셈블러가 만들어졌습니다.

C#에서 코드 난독화의 의미

해커에게 더 이상 유용하지 않지만 완전한 기능을 유지하도록 실행 파일을 수정하는 기술을 코드 난독화(Code Obfuscation)라고 합니다.

프로시저가 메서드 문이나 메타데이터를 수정할 수 있지만 프로그램 출력에는 영향을 주지 않습니다.

C#의 코드 난독화

코드 난독화는 계층화된 방어를 제공하기 위해 함께 작동하는 여러 가지 다양한 접근 방식으로 구성됩니다. 중간 수준 명령어를 내보내는 C#과 같은 언어에 특히 유용합니다.

C# 코드를 해커가 해석하기 어렵게 만드는 데 도움이 되는 여러 Obfuscator 도구를 사용할 수 있습니다.

  • .NET 리액터
  • Eazfuscator.NET
  • 바벨
  • 컨퓨저엑스

이러한 도구를 사용하여 C#에서 난독화를 구현하는 접근 방식

코드를 다른 사람이 이해할 수 없도록 만드는 방법에는 여러 가지가 있습니다. 다음 단락에서는 그 중 몇 가지를 설명합니다.

C#에서 난독화의 이름 바꾸기

이 기술은 메서드와 변수의 이름을 수정합니다. 디컴파일된 소스를 사람이 이해하기 어렵게 만들지만 프로그램 실행에는 영향을 미치지 않습니다.

새 이름에는 알파벳, 숫자, 인쇄할 수 없거나 보이지 않는 문자와 같은 다양한 체계가 사용될 수 있습니다.

이름의 범위가 다른 한 오버로드될 수 있습니다. 대부분의 C# Obfuscator는 난독화라는 이름을 근본적인 변환으로 사용합니다.

난독화 이름 바꾸기 전의 원본 소스 코드:

public class Data {
  public int age;
  public Data(int age) {
    this.age = age;
  }
}

Rename Obfuscation이 구현된 소스 코드.

public class a {
  public int b;
  public a(int b) {
    this.b = b;
  }
}

C#의 문자열 암호화

문자열은 잘 관리되고 잘 실행된 코드의 일부로 즉시 식별할 수 있습니다.

메서드와 변수의 이름이 바뀌더라도 문자열 참조는 바이너리 내에서 문자열 참조를 확인하여 중요한 코드 영역을 찾을 수 있습니다.

여기에는 사용자가 볼 수 있는 모든 메시지가 포함됩니다. 이것은 이러한 형태의 공격에 대한 장벽을 제공할 것입니다.

문자열 암호화는 실행 파일의 문자열을 암호화하지만 필요할 때만 실제 값을 반환합니다.

문자열 암호화 전의 원본 소스 코드:

Console.WriteLine("Encrypt this");

문자열 암호화가 구현된 소스 코드.

Console.WriteLine("x%$&#@");

C#의 안티 디버그 코드

공격자가 데이터를 변경하거나 중요한 구성 요소의 기능을 훔치려고 하면 리버스 엔지니어링 및 디버깅을 시작할 것입니다.

전문가와 해커는 도구를 사용하여 코드를 한 줄씩 분석합니다. 난독화자는 애플리케이션 자체 보호를 통해 이를 식별할 수 있습니다.

디버거를 사용하면 중요한 데이터를 파괴하거나 무작위 충돌을 유발하거나 특정 작업을 수행할 수 있습니다.

IT 보안 전문가는 안티 디버그 도구를 사용하여 해커가 공격의 일부로 디버그 애플리케이션을 사용하는지 여부를 감지할 수 있습니다.

해커는 디버그 도구를 사용하여 코드에 적용하는 변경 사항을 확인하는 데 사용되는 시기를 식별할 수 있습니다.

C#의 코드 변조 방지

obfuscator는 애플리케이션 자체 보호를 삽입할 수 있습니다. 변조가 발견되면 프로그램이 종료되거나 기능이 제한되거나 무작위 충돌(충돌 원인을 숨기기 위해) 또는 기타 특정 조치가 취해질 수 있습니다.

또한 발견된 변조를 알리는 메시지를 서비스에 보낼 수도 있습니다.

C#의 더미 코드 삽입

프로그램의 논리에는 영향을 미치지 않지만 디컴파일러를 중단시키거나 리버스 엔지니어링된 코드를 이해하기 훨씬 어렵게 만드는 코드를 실행 파일에 삽입합니다.

C#의 바이너리 연결/병합

이 변환은 여러 입력 실행 파일/라이브러리를 하나 이상의 출력 바이너리로 결합합니다.

연결은 특히 이름 바꾸기 및 트리밍과 결합할 때 응용 프로그램의 크기를 최소화하는 데 도움이 될 수 있습니다.

또한 배포를 더 쉽게 만들고 해커가 액세스할 수 있는 정보의 수를 최소화할 수 있습니다.