다형 코드
Polymorphic code컴퓨팅에서 다형성 코드는 원래 알고리즘을 그대로 유지하면서 다형성 엔진을 사용하여 변환하는 코드입니다. 즉, 코드가 실행될 때마다 그 자체가 바뀌지만 코드(시멘틱스)의 기능은 전혀 변경되지 않습니다.예를 들어, 간단한 산술식 3+1과 6-2는 모두 같은 결과를 얻지만 CPU에서 다른 기계 코드를 사용하여 실행된다.이 기술은 컴퓨터 바이러스, 셸 코드 및 컴퓨터 웜에 의해 [1]존재를 숨기기 위해 사용되는 경우가 있습니다.
암호화는 코드를 숨기는 가장 일반적인 방법입니다.암호화에서는 코드의 본체(payload라고도 불린다)가 암호화되어 의미가 없어 보입니다.코드가 이전과 같이 기능하기 위해서, 복호화 기능이 코드에 추가된다.코드가 실행되면 이 함수는 payload를 읽고 복호화한 후 차례로 실행합니다.
암호화만으로는 다형이 아닙니다.다형성 동작을 얻기 위해 암호화기/복호화기 쌍은 코드의 각 복사본과 함께 변환됩니다.이것에 의해, 같은 기능을 하는 [2]코드의 다른 버전을 사용할 수 있습니다.
악성코드
대부분의 안티바이러스 소프트웨어 및 침입 탐지 시스템(IDS)은 컴퓨터 네트워크를 통해 전송되는 컴퓨터 파일 및 데이터 패킷을 검색하여 악성 코드를 찾으려 합니다.보안 소프트웨어가 기존의 컴퓨터 바이러스 또는 웜에 대응하는 패턴을 검출했을 경우, 적절한 조치를 취해 위협을 무력화합니다.다형 알고리즘은 이러한 소프트웨어가 지속적으로 변이를 일으키기 때문에 문제를 일으키는 코드를 인식하는 것을 어렵게 합니다.
악성 프로그래머는 바이러스 또는 웜이 전파될 때마다 암호화되지 않은 복호화 엔진(및 그 결과 암호화된 페이로드)을 고쳐 쓰는 것으로, 이 바이러스 스캔 전략으로부터 암호화된 코드를 보호하려고 하고 있습니다.안티바이러스 소프트웨어는 복잡한 패턴 분석을 사용하여 복호화 엔진의 다른 돌연변이 내에서 기본 패턴을 찾아내고 이러한 악성 프로그램을 안정적으로 탐지할 수 있도록 합니다.
에뮬레이션을 사용하면 기존의 서명 스캔 등 다른 방법을 사용하기 전에 가상 환경에서 멀웨어가 자신을 분리하도록 함으로써 다형 난독화를 방지할 수 있습니다.이러한 가상 환경을 샌드박스라고 부르기도 합니다.복호화 알고리즘의 변동에 관계없이 복호화 페이로드가 동일한 경우 다형성은 바이러스를 이러한 에뮬레이션으로부터 보호하지 않습니다.변성 코드 기술은 바이러스가 감염에서 감염까지 일정하게 유지되는 식별 가능한 코드 블록을 메모리에 갖지 않고 실행될 수 있기 때문에 검출을 더욱 복잡하게 하기 위해 사용될 수 있다.
최초의 다형성 바이러스는 마크 워시번에 의해 작성되었다.1260이라고 불리는 이 바이러스는 1990년에 작성되었다.더 잘 알려진 다형 바이러스는 1992년 해커 다크 어벤저에 의해 바이러스 백신 소프트웨어로부터의 패턴 인식을 피하기 위한 수단으로 만들어졌습니다.일반적이고 매우 치명적인 다형성 바이러스는 파일 감염자 Virut이다.
예
이 예는 실제로는 다형 코드는 아니지만 XOR 연산자를 통한 암호화 세계에 대한 소개 역할을 합니다.예를 들어 변수 A와 변수 C가 아닌 변수를 사용하는 알고리즘에서는 C를 변경하는 대량의 코드가 존재할 수 있으며 알고리즘 자체에 영향을 주지 않으므로 최종 산출물에 관계없이 무한히 변경할 수 있습니다.
시작: GOTO Decryption_Code Encrypted: ...많은 암호화된 코드...복호화_코드: C = C + 1 A = 암호화 루프: B = *A C = 3214 * A = B XOR CryptoKey * A = 1 C = A + B = A + 1 GO 루프 복호화되지 않은 경우
암호화된 코드가 payload입니다.다른 버전의 코드를 만들기 위해 각 복사본에서 C를 조작하는 가비지 라인이 변경됩니다."Encrypted"(암호화된 코드 대량) 내의 코드는 Decryption_Code와 CryptoKey 사이의 코드 및 각 알고리즘에서 동일한 작업을 수행하는 새로운 코드를 검색할 수 있습니다.일반적으로 코더는 바이러스의 첫 번째 생성에 제로 키(예: A xor 0 = A)를 사용합니다.이 키를 사용하면 코드가 암호화되지 않기 때문에 코더가 더 쉽게 사용할 수 있습니다.다음으로 코더는 증분 키알고리즘 또는 랜덤키알고리즘을 실장합니다.
다형 암호화
다형 코드를 사용하여 암호화 알고리즘을 생성할 수도 있습니다.이 코드는 온라인 서비스 String Encrypt에 [3]의해 생성되었습니다.문자열 또는 파일 내용을 가져와 랜덤 암호화 명령으로 암호화하고 지원되는 여러 프로그래밍 언어 중 하나로 다형성 복호화 코드를 생성합니다.
// https://www.stringencrypt.com에서 암호화(v1.1.0) [C/C++] // szLabel = "Wikipedia" wchar_t sz라벨[10] = { 0xB1A8, 0xB12E, 0xB0B4, 0xB03C, 0x33B9, 0xB30C, 0x3295, 0xB260, 0xB5E5, 0x35A2 }; 위해서 (서명되어 있지 않다 동작 = 0, KRSpk = 0; 동작 < > 10; 동작++) { KRSpk = sz라벨[동작]; KRSpk ^= 0x2622; KRSpk = ~KRSpk; KRSpk --; KRSpk += 동작; KRSpk = (((KRSpk & 0xFFFF) >> 3) (KRSpk << > 13)) & 0xFFFF; KRSpk += 동작; KRSpk --; KRSpk = ((KRSpk << > 8) ( (KRSpk & 0xFFFF) >> 8)) & 0xFFFF; KRSpk ^= 0xE702; KRSpk = ((KRSpk << > 4) ( (KRSpk & 0xFFFF) >> 12)) & 0xFFFF; KRSpk ^= 동작; KRSpk ++; KRSpk = (((KRSpk & 0xFFFF) >> 8) (KRSpk << > 8)) & 0xFFFF; KRSpk = ~KRSpk; sz라벨[동작] = KRSpk; } 인쇄(sz라벨); 이 C++의 예에서 알 수 있듯이 문자열은 암호화되어 각 문자는 UNICODE widechar 형식을 사용하여 암호화된 형식으로 저장됩니다.비트 단위 XOR, NOT, 덧셈, 뺄셈, 비트 회전 등 다양한 암호화 명령어가 사용되었습니다.암호화 키, 비트 회전 카운터 및 암호화 명령도 모두 랜덤화됩니다.출력 코드는 C/C++, C#, Java, JavaScript, Python, Ruby, Haskell, MASM, FASM, AutoIt에서 생성할 수 있습니다.랜덤화 덕분에 생성된 알고리즘은 매번 다릅니다.범용 복호화 툴을 작성할 수 없으며, 다형 암호화 코드를 사용하여 컴파일된 코드를 재암호화할 때마다 분석해야 합니다.
「 」를 참조해 주세요.
레퍼런스
- ^ Raghunathan, Srinivasan (2007). Protecting anti-virus software under viral attacks (M.Sc.). Arizona State University. CiteSeerX 10.1.1.93.796.
- ^ Wong, Wing; Stamp, M. (2006). "Hunting for Metamorphic Engines". Journal in Computer Virology. 2 (3): 211–229. CiteSeerX 10.1.1.108.3878. doi:10.1007/s11416-006-0028-7. S2CID 8116065.
- ^ 바토즈 우이치크(2015년).문자열 및 파일 암호화
- Spinellis, Diomidis (January 2003). "Reliable identification of bounded-length viruses is NP-complete". IEEE Transactions on Information Theory. 49 (1): 280–4. doi:10.1109/TIT.2002.806137.