가이드: 코드 난독화 리버스 엔지니어링

게시 됨: 2021-11-17

코드 난독화 그림은 애플리케이션 해킹을 방지하기 위해 가장 널리 사용되는 애플리케이션 보안 접근 방식 중 하나입니다. 이는 전 세계 보안 전문가들이 가장 자주 제안하는 AppSec 노력 중 하나이며 종종 애플리케이션의 매우 최소한의 보안 요구 사항을 처리합니다. 이 전략은 해킹 시도에 대한 주요 방어 메커니즘으로 자주 사용되며 코드 주입, 리버스 엔지니어링, 고객 및 애플리케이션 사용자의 개인 정보 변조와 같은 일반적인 위협으로부터 보호합니다.

코드의 난독화?

더 이상 이해하거나 이해할 수 없거나 실용적이지 않은 실행 파일을 난독화하는 관행을 코드 난독화라고 합니다. 소스코드는 실행은커녕 제3자가 이해하기 어렵고 이해하기 어려울 정도로 난독화되어 있습니다. 최종 사용자 UI 또는 코드의 의도된 출력은 모호성의 영향을 받지 않습니다. 이는 소프트웨어의 실행 코드에 액세스할 수 있는 잠재적인 해커가 코드를 쓸모 없게 만드는 예방 조치일 뿐입니다.

코드를 난독화해야 하는 이유는 무엇입니까?

코드의 난독화는 개인의 이익을 위한 해킹 가능성 측면에서 상당한 단점이 있는 오픈 소스 소프트웨어에서 특히 중요합니다. 개발자는 프로그램을 리버스 엔지니어링하기 어렵게 만들어 보안 위험, 불법 액세스 및 응용 프로그램 결함 발견으로부터 제품의 지적 재산을 보호합니다.

사용된 은폐 기술의 유형에 관계없이 이 접근 방식은 위험한 소스 코드를 제한하고 다양한 수준의 프로그램 보안을 보장합니다. 시간, 비용 및 리소스 이유는 모두 디컴파일된 코드가 읽을 수 없게 렌더링되기 때문에 난독화될 때 코드를 포기하는 것을 선호합니다.

코드 난독화 기술

난독화는 다양한 수준에서 작동합니다. 의미 체계/어휘 코드 구조 수준 또는 데이터 구조/제어 흐름 수준에서 구현될 수 있습니다. 난독화 전략도 코드의 작업에 따라 다릅니다. 본질적으로 보안 팀은 개발 팀과 협력하여 코드에 사용할 난독화 종류를 결정합니다.

난독화의 이름을 바꿔야 합니다.

이 접근 방식은 변수 이름을 혼동하여 변수를 활용하려는 실제 목표를 교묘하게 숨겨야 합니다. 디컴파일러는 메서드와 변수의 이름이 다양한 표기법과 숫자로 바뀌기 때문에 제어 흐름을 이해하는 데 어려움을 겪습니다. 이 난독화 방법은 일반적으로 Java, .NET 및 Android 플랫폼 애플리케이션 코드를 위장하는 데 사용됩니다. 이는 애플리케이션에 대한 보호 계층을 제공하기 위해 소스 코드를 직접 대상으로 하기 때문에 레이아웃 난독화로 분류됩니다.

데이터 난독화

이 방법은 코드에서 사용되는 데이터 구조에 초점을 맞추므로 해커가 프로그램의 진정한 목표에 액세스할 수 없습니다. 여기에는 소프트웨어가 데이터를 메모리에 저장하는 방식과 최종 결과를 생성하기 위해 해당 데이터를 처리하는 방식이 변경될 수 있습니다. 이 절차는 다양한 방법으로 수행할 수 있습니다.

1. 집계의 난독화
그 결과 소프트웨어에 데이터가 저장되는 방식이 변경됩니다. 예를 들어 배열은 프로그램 전체에서 참조할 수 있는 여러 하위 배열로 나눌 수 있습니다.

2. 데이터 저장의 난독화
이것은 데이터가 메모리에 저장되는 방식에 영향을 미칩니다. 예를 들어 개발자는 변수 동작의 진정한 특성을 모호하게 하기 위해 로컬 변수 저장소와 전역 변수 저장소 사이를 섞을 수 있습니다.

3. 요청 시 난독화 획득
이 접근 방식은 프로그램/코드 조각의 기능을 변경하지 않고 데이터의 순서를 변경합니다. 개발자는 변수 참조의 각 인스턴스에 대해 호출되는 고유한 모듈을 만들어 이를 달성합니다.

4. 문자열 암호화
이 기술은 읽을 수 있는 모든 문자열을 암호화하여 읽을 수 없는 코드를 생성합니다. 소프트웨어가 실행되면 런타임에 암호를 해독해야 합니다.

5. 제어/코드 흐름의 난독화
코드베이스의 한 부분에서 다른 부분으로 제어가 전송되는 방식은 프로그램의 목표를 설정하는 데 중요합니다. 이 흐름을 난독화하는 것은 종종 게임의 흐름을 왜곡시키는 가장 유익한 방법입니다. 이 난독화 전략은 해커가 코드가 특정 경로를 따르는 방법과 이유를 파악하기 어렵게 하여 해커를 막습니다.

임의의 예기치 않은 명령문과 절대 실행되지 않는 불필요한 대소문자 전환 명령문(데드 코드)을 포함하는 것은 이 난독화 전략을 수행하는 가장 일반적인 방법 중 하나입니다. 이러한 주장은 표적 해커를 당황하게 하는 것 외에는 다른 기능이 없습니다. 조건부 프로그램 방향의 경우 프로그램 실행 명령문의 이러한 변경은 매우 유용합니다.

난독화를 디버깅 중입니다.

디버그 정보는 소스 코드를 디컴파일하고 다시 컴파일하여 프로그램 흐름 및 결함에 대한 중요한 정보를 결정하는 데 자주 유용합니다. ID, 줄 번호를 변경하거나 디버그 데이터에 대한 액세스를 완전히 차단하여 식별 데이터를 숨기는 것이 중요합니다.

난독화를 해결해야 합니다.

메모리 프로그래밍 실수는 공격, 특히 C 및 C++와 같은 비메모리 안전 언어에서 널리 퍼졌습니다. 보안 결함은 제어되지 않은 어레이 액세스와 같은 오류로 인해 자주 발생합니다. 주소 난독화 방식은 변환된 코드가 수행될 때마다 코드의 가상 주소와 프로그램의 데이터가 무작위화되기 때문에 역공학을 어렵게 만듭니다. 결과적으로 대부분의 메모리 오류 공격은 성공 가능성이 매우 낮은 비결정적입니다.

맞춤형 코딩

개발자는 이 접근 방식을 사용하여 사용자 지정 알고리즘으로 문자열을 암호화한 다음 원래 코드를 복구하는 디코더 기능을 제공합니다.

런타임에 전달된 인수

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

다양한 보안 위협으로부터 애플리케이션을 보호하기 위한 계층화된 방어 방법을 개발하기 위해 보안 팀은 동시에 둘 이상의 기술을 배포하도록 선택할 수 있습니다.

결론

요약하자면, 잘못된 지시만으로는 고급 보안 문제를 해결하는 데 효과적이지 않습니다. AI 소프트웨어의 가용성과 해커의 기술로 인해 코드를 난독화하는 것이 더 어렵지만 불가능한 것은 아닙니다. 결과적으로 암호화는 모든 소프트웨어 보안 문제에 대한 만병통치약이 아닙니다.
개발 팀은 보안 요구, 프로그램의 특성 및 성능 벤치마크에 따라 신뢰할 수 없는 환경에서 코드를 보호하기 위해 다양한 코드 난독화 접근 방식을 사용할 수 있습니다. 이는 각각의 접근 방식의 장단점을 고려하면서 수행되어야 합니다. 암호화, RASP, 데이터 보존 규정 등과 같은 다른 AppSec 이니셔티브는 이 전략에 의해 지원되어야 합니다. AppSealing과 같은 RASP 솔루션과 결합하면 오늘날의 보안 문제에 대한 강력한 해독제가 됩니다.