C#에서 코드 난독화

Saad Aslam 2023년10월12일
  1. C#에서 코드 난독화의 의미
  2. C#의 코드 난독화
  3. 이러한 도구를 사용하여 C#에서 난독화를 구현하는 접근 방식
  4. C#에서 난독화의 이름 바꾸기
  5. C#의 문자열 암호화
  6. C#의 안티 디버그 코드
  7. C#의 코드 변조 방지
  8. C#의 더미 코드 삽입
  9. 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#의 바이너리 연결/병합

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

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

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

작가: Saad Aslam
Saad Aslam avatar Saad Aslam avatar

I'm a Flutter application developer with 1 year of professional experience in the field. I've created applications for both, android and iOS using AWS and Firebase, as the backend. I've written articles relating to the theoretical and problem-solving aspects of C, C++, and C#. I'm currently enrolled in an undergraduate program for Information Technology.

LinkedIn