
명령어 주입, 정크 코드, 상수 난독화 및 런타임 복호화를 통해 x86-64 어셈블리를 난독화하여 리버스 엔지니어링과 분석(anti-analysis)을 방해합니다.
Assembly Code Obfuscator는 x86-64 어셈블리 코드의 보안을 강화하도록 설계된 강력하고 다재다능한 도구입니다. 다양한 난독화 기법과 안티 분석 조치를 적용하여 프로젝트를 리버스 엔지니어링 및 분석으로부터 보호합니다.
명령어 주입: 각 어셈블리 명령어 앞에 사용자 정의 바이트 시퀀스를 삽입하여 디스어셈블러를 혼란시킵니다.
난수화: 코드 구조에 무작위성을 도입하여 예측 가능성을 낮춥니다.
디버거 탐지: 코드 실행 중 디버거의 존재를 감지하고 안티 디버깅 조치를 적용합니다.
안티 분석 기법: 조건부 분기와 타이밍 검사를 통해 동적 분석 도구를 혼란시킵니다.
동적 복호화: 코드 섹션을 암호화하고 런타임에 동적으로 복호화하여 복잡성을 높입니다.
동적 압축 해제: 코드 섹션을 압축하고 실행 중 동적으로 압축을 해제하여 코드의 실제 본질을 숨깁니다.
상수 난독화: XOR 연산, 비트 조작 등의 기법을 사용하여 상수와 데이터 값을 난독화합니다.
변수 이름 변경: 변수와 레지스터의 이름을 변경하여 코드를 사람이 읽기 어렵게 만듭니다.
정크 코드 삽입: 정크 코드 조각을 삽입하여 코드베이스를 더욱 복잡하게 만듭니다.
난독화 프로세스의 핵심은 코드 파일의 각 어셈블리 명령어 앞에 사용자 정의 바이트 시퀀스를 삽입하는 것입니다. 전략적으로 설계된 이러한 바이트 시퀀스는 디스어셈블러와 분석가 모두를 혼란시키기 위한 것입니다. 이 과정을 자세히 살펴보겠습니다:
4005d2: 55 push rbp
메모리(hex):
0x55
400665: eb 01 jmp 400668 <main+0x3>
400667: b0 55 mov al,0x55
400669: eb 01 jmp 40066c <main+0x7>
메모리(hex):
0xEB, 0x01, 0xB0, 0x55
변환 과정을 분석하면 다음과 같습니다:
원본 명령어 PUSH RBP는 0x55로 어셈블됩니다. 난독화 도구는 그 앞에 0xEB, 0x01, 0xB0 바이트를 삽입합니다.
그 결과, 디스어셈블될 때 원본 코드와 완전히 다르게 보일 수 있는 일련의 명령어가 생성됩니다. 이로 인해 리버스 엔지니어가 코드의 실제 목적을 이해하기 어려워집니다.
코드에 무작위성 요소를 도입합니다. 명령어 순서 변경, 피연산자 교체, 연산 코드 치환 등의 기법이 포함됩니다.
코드 실행 중 디버거의 존재를 감지하는 메커니즘을 통합합니다. 디버거 관련 흔적을 식별하고 안티 분석 조치를 트리거하는 런타임 검사를 수행합니다.
조건부 분기와 타이밍 검사와 같은 여러 안티 분석 조치를 통합합니다. 예를 들어, 분석 프로세스를 지연시키기 위해 조건부 점프와 지연 루프를 삽입할 수 있습니다.
동적 복호화 기법을 사용합니다. 특정 코드 섹션을 암호화하고 비밀 키를 사용하여 런타임에 복호화합니다. 이 복호화 프로세스는 코드 실행 중에 동적으로 발생합니다.
특정 코드 섹션을 압축하고 실행 시 즉시 압축을 해제합니다.
XOR 연산, 비트 조작, 산술 연산과 같은 기법을 사용하여 상수를 난독화합니다. 이를 통해 상수 값을 쉽게 알아볼 수 없도록 보장합니다.
이 도구는 변수와 레지스터의 이름을 변경하여 코드를 읽기 어렵게 만듭니다. 이 과정은 변수 이름을 무작위로 생성된 문자열이나 숫자 식별자로 대체하는 것을 포함합니다.
코드를 더욱 난독화하기 위해 난독화 도구는 전략적인 위치에 정크 코드 조각을 삽입합니다. 이 정크 코드는 프로그램 로직에 영향을 주지 않지만 코드베이스를 어지럽히는 데 기여하는 무관한 명령어들로 구성됩니다.
; Original Code
mov eax, 1
; After Junk Code Insertion
mov ebx, 2
sub ecx, ecx
add edx, edx
메모리(hex):
0x89, 0xD8, 0x31, 0xC9, 0x01, 0xD2
삽입된 정크 코드는 주의를 분산시키고 코드가 더욱 복잡해 보이도록 설계되었습니다.
가짜 UPX 헤더를 감지하는 기능도 포함합니다. UPX 헤더 변조 징후가 있는지 코드를 스캔하여 실행 파일의 무결성을 보장합니다.
변환 전(원본 코드):
section .text
global _start
_start:
; Calculate the sum of the first 10 natural numbers
mov ecx, 10 ; Initialize loop counter
mov eax, 0 ; Initialize sum to 0
loop_start:
add eax, ecx ; Add current value of ECX to EAX (sum)
loop loop_start ; Decrement ECX and loop if not zero
; Exit program
mov eax, 1 ; SYS_exit
int 0x80 ; Invoke syscall
16진수 표현(원본 코드):
31 C9 xor ecx,ecx
B8 00 00 00 00 mov eax,0x0
EB 0E jmp 0x1c
01 C8 add eax,ecx
E2 FB loop 0x11
B8 01 00 00 00 mov eax,0x1
CD 80 int 0x80
변환 후(난독화된 코드):
section .text
global _start
_start:
; Calculate the sum of the first 10 natural numbers
mov eax, 0x1
add eax, 0x2
add eax, 0x3
add eax, 0x4
add eax, 0x5
add eax, 0x6
add eax, 0x7
add eax, 0x8
add eax, 0x9
add eax, 0xa
; Exit program
mov eax, 0x1
int 0x80
16진수 표현(난독화된 코드):
B8 01 00 00 00 mov eax,0x1
83 C0 02 add eax,0x2
83 C0 03 add eax,0x3
83 C0 04 add eax,0x4
83 C0 05 add eax,0x5
83 C0 06 add eax,0x6
83 C0 07 add eax,0x7
83 C0 08 add eax,0x8
83 C0 09 add eax,0x9
83 C0 0A add eax,0xa
B8 01 00 00 00 mov eax,0x1
CD 80 int 0x80
난독화된 코드에서는 중복된 ADD 명령어를 추가하고 즉시 피연산자로 16진수 값을 사용하여 원래 프로그램 로직을 덜 명확하게 만들었습니다.
이 프로젝트는 MIT 라이선스에 따라 라이선스가 부여됩니다. 자세한 내용은 LICENSE 파일을 참조하세요.
기여는 언제나 환영합니다!.
문제, 기능 요청 또는 일반적인 문의 사항이 있으면 이슈를 생성해 주세요.
이 도구는 교육 및 윤리적 목적으로 제작되었습니다.