
PE 파일용 x64 바이너리 난독화 도구로, 제어 흐름 평탄화, 역어셈블 방지, 임포트 난독화 및 명령어 변형을 통해 리버스 엔지니어링을 방해합니다.
Alcatraz는 x64 바이너리 난독화기로, 다음과 같은 다양한 PE 파일을 난독화할 수 있습니다:
설치: https://vcpkg.io/en/getting-started.html
asmjit: vcpkg.exe install asmjit:x64-windows
Zydis: vcpkg.exe install zydis:x64-windows
1.) 왼쪽 상단의 file을 클릭하여 바이너리를 불러옵니다.
2.) Functions 트리를 확장하여 함수를 추가합니다. (상단 검색창에 이름을 입력하여 검색할 수 있습니다.)
3.) compile을 누릅니다. (참고: 많은 함수를 난독화하는 데 몇 초가 걸릴 수 있습니다.)
다음 데모에서는 표시되는 기능 외의 모든 기능이 비활성화되어 있습니다.
즉시 값이 레지스터로 이동될 때, 여러 비트 연산을 적용하여 난독화합니다. 인기 있는 함수 _security_init_cookie를 살펴보겠습니다.
이전:
이후:

컴파일러가 생성한 깔끔한 프로그램 구조를 제거하고 코드를 새로 생성된 블록에 배치함으로써 프로그램의 복잡성을 증가시킵니다. 이 간단한 main 함수를 예로 들어 보겠습니다 (이 프로그램에 대한 최적화는 비활성화됨):

이것을 IDA 7.6에 넣으면 디컴파일러가 최적화합니다:

이제 제어 흐름을 평탄화하고 IDA가 다시 분석하도록 합시다:

보시다시피, 생성된 코드의 일부만 보여주었음에도 복잡성이 크게 증가했습니다. CFG가 어떻게 생겼는지 알고 싶다면:

레지스터(예: RAX)가 다른 레지스터(예: RCX)에 더해지면 명령어를 변이시킵니다. 즉, 구문은 변경되지만 의미는 그대로입니다.
명령어 ADD RCX, RAX는 다음과 같이 변이될 수 있습니다:
push rax
not rax
sub rcx, rax
pop rax
sub rcx, 1
변이에 대해 더 알아보려면 perses를 참조하세요.
PE 파일이 .exe인 경우 (.dll 지원은 추가 예정), 실제 진입점을 시작 시 복호화하는 사용자 지정 진입점을 생성합니다 (!!! 수동 매핑 시에는 작동하지 않음).

Lea 난독화는 매우 간단하면서도 효과적입니다. 다른 위치를 레지스터로 이동한 후 복호화합니다. 이렇게 하면 리버스 엔지니어가 특정 데이터/함수를 교차 참조할 수 없습니다.
예를 들어 다음과 같은 명령어를 발견했다고 가정해 봅시다: lea rcx, [0xDEAD]
다음과 같이 변이합니다:
pushf
lea rcx, [1CE54]
sub rcx, EFA7
popf
rcx -> 0xDEAD
0xFF 바이트로 시작하는 명령어를 발견하면 앞에 0xEB를 추가합니다.
이는 0xEB 0xFF가 jmp rip + 1로 인코딩되어 결국 실제 첫 번째 0xFF로 점프하기 때문입니다. 이렇게 하면 명령어를 선형 방식으로 디코딩하는 도구를 혼란스럽게 만듭니다.
이전:

이후:

때때로 다음을 삽입할 수 있습니다:
jz 3
jne 1
0xE8
IDA는 0xE8(call)을 디코딩하려고 시도하지만 성공하지 못합니다:

현재 "적절한" IAT 난독화는 없습니다. 0xFF 안티 디스어셈블리 트릭이 당분간 이를 처리합니다. 적절한 구현은 여기에 계획되어 있습니다:
iat.cpp
이는 안티 디스어셈블리를 제외한 모든 기능이 활성화된 main 함수의 일부입니다 (IDA가 함수를 생성할 수 있도록):
