더미다 – 패킹 도구, 바이너리 암호화

더미다 – 패킹 도구, 바이너리 암호화

실제 프로그램에 대한 암호화를 진행해도 좋지만, 모든 보안 요소를 직접 구현한다는 것은 무리다. 따라서 부분적으로 직접 코드를 암호화하고 그 위에 패커를 통해, 보호하는 방법이 유용하다. 그럼 대표적인 상용 패커 더미다(Themida)에 대해 살펴보자. 더미다는 역분석을 못하게 한다기 보다는 어차피 완전히 막기는 어렵기 때문에 분석을 지치도록 하자는 목적을 가진 패커로서, 상용 패커 중 강력하기로 소문난 패커이다. 전문 언패커가 되고자 한다면, 한 번쯤 분석을 시도해 보는 것도 좋다. 아마 많은 분석가 분들이 이 패커에 대해 언패킹을 시도하고 있으며, 대다수 분석가들도 혀를 내두를 정도로 많은 데이터를 포함하고 있다.

도구 사용은 쉽게 이용할 수 있다. http://www.oreans.com/ 에서 다운로드 가능하며, 데모 버전을 통해 테스트를 진행해 볼 수 있다.

더미다 – 패킹 도구, 바이너리 암호화

 

대부분의 안티 디버깅도 내장하고 있어 자체 개발한 보호 코드와 함께 이용하면 강력한 안티 디버깅을 완성할 수 있다. 개발사에서는 Themida 이외에도 WinLicense라는 라이선스 관리 기능을 포함한 제품도 함께 제공하므로 본인 혹은 회사에서 개발한 프로그램을 보호하는 데 유용할 것이라 판단된다. 더미다는 여러 가지 기능을 선택하여 패킹을 진행할 수 있다. 대략적인 메뉴들의 기능들에 대해 알아보자.

Protection Options: 보호 수준을 정하고, 메모리, 모니터링, EP 등 보호할 항목을 활성화하거나 비활성화 할 수 있다. 안티 디버깅도 여기에 포함되며, 활성화/비활성화 할 수 있다. 기본적으로 Anti-Patching을 제외하고 활성화된다. 주요 보호 설정 옵션은 다음과 같다.

Anti-Debugger Detection: 안티 디버깅 기능을 조절할 수 있다. “Ultra”로 설정하면, 바이러스, 루트킷 등의 설치 여부도 감지하게 된다.

Auti Dumpers: 메모리 덤프를 생성할 수 없도록 막는다.

Entry Point Obfuscation: Entry point를 제거하고 암호화한다.

Resources Encryption: 파일에 들어가는 리소스 파일을 암호화한다.

VMWare/Virtual PC: 가상환경에서 실행이 가능하도록 할지 설정한다. 체크시 실행 가능

Advanced API-Wrapping: API를 호출할 때 분석이 어렵도록 여러 번 포장한다.

Anti-Patching: 파일에 대해 수정을 막는다.

Memory Guard: 메모리상에서 패치하는 것을 막는다.

Compression: 압축 항목을 지정한다.

Monitor Blockers: Monitor 프로그램(Filemon, Regmon등)을 감지한다.

Protection Macros: 앞서 진행한 맵 파일을 통해 매크로를 찾은 후 해당 매크로를 보호해 주는 기능이다.

Virtual Machine: 더미다는 프로세스 보호를 위한 보호 기법 중 VM(Virtual Machine) 기반으로 보호를 진행하게 된다. 이 가상 머신에 대한 설정을 아래 옵션을 통해 조절할 수 있다.

Processor Specifications: 가상 머신에서 사용할 프로세서와 코드 암호화 정도를 지정할 수 있다.

Processor Type: 가상 머신에서 이용하는 프로세서를 지정하는데, 기본 값인

Multiprocessor: 가상 머신의 프로세서 개수를 지정한다.

Opcode Type: 가상 머신내 Opcode(기계어, 2부 어셈블리를 확인) 난독화 단계로 높을수록 코드 분석을 어렵도록 한다.

Dynamic Opcode: 기본 Opcode를 다른 여러 Opcode들과 섞어서 할당해, 분석을 어렵게 한다.

Entry Point Virtualization: 프로그램 진입 지점을 얼마만큼 가상화 할 지 지정하게 된다. 값이 높을수록 프로그램 재구성이 어려워져 프로그램 보호에 효과적이다. 기본값은 0이다.

Virtual API-Wrapper: API 함수에 대해 가상화를 진행할 수 있는데, 그 수준를 지정할 수 있다. 값이 높을수록 분석이 어려워진다. API Virtualization Level 통해 지정되며, 기본값은 3이다.

Multi Branch Technology: 분기문에 불필요한 분기 정크 코드를 추가해, 분석을 어렵도록 한다.

Customized Dialogs: 더미다에서 발생한 오류창의 내용을 기본값에서 수정할 수 있는 옵션이다. 기본적으로 보호모드에 해킹도구나, 디버깅도구를 탐지하였을 때 나타난다. 회사에서 이용한다면 이 메시지 정책에 맞게 변경하는 것이 좋다.

Advanced Options: 그 외 옵션으로,
PE 파일 구조에 대한 조작이나, 외부 DLL 거부, .NET 어셈블리 감지 등의 추가 옵션을 설정할 수 있다.

Encrypt Application: 보호하고자 하는 응용프로그램의 실행 중 전체적으로 코드를 암호화하여 보호한다.

Protect as DLL Plugin: 외부 Dll로부터 보호하고자 할 때 이 옵션을 활성화 한다. 활성화 한 경우, 외부 Dll을 연결하여 사용할 수 없다.

Hide from PE scanners: PEid와 같은 도를 통해 PE 코드를 스캔할 경우에 이용할 수 있는 옵션으로, 이를 속이거나 감추어 프로그램을 보호할 수 있다.

.NET assemblies: .NET으로 개발된 프로그램에서 사용할 수 있는 옵션으로, .NET의 어셈블리를 수정하는지 탐지하는 기능을 보호하고자 하는 프로그램을 추가한다.

Active Context: Dll을 이용할 경우 추가하는 옵션으로 이를 통해 Dll을 이용해서 특정 작업을 진행할 수 있다. 비활성화를 추천한다.

Splash screen settings: 프로그램을 시작하기 전 그림문자 같이 특정 문구를 확인하여 실행할 수 있도록 구성한다.

Localization: 더미다 유저 인터페이스의 국가를 지정한다.

이외 많은 공개 패커들이 있지만, 필자 역시 검증된 패커 이 외에 공개 패커는 거의 사용하지 않는다. 그래서 여기서 그러한 도구들을 소개하는 건 독자 여러분에게 많은 도움이 되지는 않을 것 같다(필자 역시 대부분 프로그램 컴파일시 더미다와 함께 몇 가지 자체 보호코드를 삽입한다).

하지만 무조건 더미다만 써야 한다는 것은 아니다. 본인이 이용하고자 하는 프로그램에 문제는 없는지 확인한 후 패커를 선택하기 바라며, 일부 백신에서는 패킹한 프로그램을 바이러스로 진단하는 경우가 종종 있다. 이를 피할 수 있는 최소한의 방법으로 패킹시 프로그램의 이름과 버전 정보를 입력해 주도록 하자. 이를 통해 약간의 잘못된 탐지를 막을 수 있고, 그 외의 경우는 백신 업체에게 예외 처리를 부탁해야 한다.

[그림] 프로그램 이름과 버전 정보를 포함하도록 하자

더미다로 패킹시 프로그램 실행 중 갑자기 종료된다거나 API 호출을 정상적으로 하지 못하는 등의 오류가 나타날 수 있다. 필자는 업무 중 몇몇 게임을 보호하기 위해 사용하였을 때, 더미다로 몇몇 프로그램의 경우 실행에 오류가 나타난다. 이는 프로그램 패킹에 따른 성능적인 부분과 암호화적인 부분 때문에 문제가 있을 수 있다. 이 경우 옵션 조정을 진행해야 하는 부분은 바로 Virtual Machine 부분으로, VM 머신 기반으로 프로그램을 보호하는 더미다의 실제적인 실행 성능과 관계된 부분이라 할 수 있다.

[그림] 가상 머신의 암호화 정도를 조절할 수 있다

API Virtualization Level과 Opdoce Type, Dynamic Opcode 값을 낮춤으로써 패킹 파일의 실행 속도를 개선이 가능하다.

이외에도 Themida.ini에 아래 문장을 추가해 직접 더미다 엔진의 기능을 조정할 수 있다.

[General]

ShowSecureEngineOptions = yes

위 옵션을 추가하면 아래와 같이 보이지 않던 메뉴인 SecureEngine Config라는 메뉴가 추가된다.

[그림] 더미다 엔진 기능 설정

이 기능들을 비활성화하여 문제점을 해결할 수 있으므로, 패킹과 관련된 문제점 발생시 이용하면 유용할 것이다. 아래는 엔진으로 조절 가능한 옵션과 간단한 설명을 달아 두었다.

아래 옵션에 대해 자세한 설명은 개발사 측에서도 하지 않는 관계로 정확한 설명은 해줄 수가 없지만, 대략적인 용도와 프로그램의 실행 속도에 도움이 되는 엔진 옵션에 대해 굵게 표시하였으니 참고하기 바란다. 차후 프로그램에 패킹으로 인한 문제점 발생시 여기 옵션을 조정해 보도록 하자.

옵션 설명
StopMerging = .data 지정한 세션을 통합하지 않는다.
DLLNotFoundMsg = (The DLL %s is not present. Please, restart the application) Dll이 없을 때 나타나는 메시지를 조정할 수 있다.
ForceForm = true 강제로 Delphi/BCB의 폼에 대해 삭제를 시도한다.
ForceDeepFreeze = true 강제로 무응답 상황을 탐지한다.
SkipDbgMsg = true OutputDebugString을 통해 보내는 Themida/WL 메세지를 보내지 않는다.
SmartKeyDetect = true 스마트키를 탐지한다(기본키 이외 키).
XBundlerAVI = true XBundler의 AVI를 지원하는 기능을 활성화한다.
DetectProcExplorer = true Process explorer를 탐지한다.
ImportLib = cx100.dll 외부 라이브러리 연결(후킹 방식)
ImportFunction = cvGetMat 외부 라이브러리에서 이용할 함수
ForceImportLib = true 외부 라이브러리를 연결할 수 없어도 강제로 연결
DisableShowCode
= true
/showcode 옵션을 비활성화 한다.
FakeStack = true 가짜 스택을 생성한다.
ForceExitOnTimeExpiration = true 예외 상황이 발생하면 강제로 프로그램을 종료한다.
AvoidDoubleAPI = true 마지막 함수 API를 삭제한다.
VMWareSimulate98 = true 윈도우 98인 운영체제의 VMware를 지원한다.
IndirectAPIcall = true API 후킹을 할 수 있도록 호환성을 확대한다.
OptimizeWDCUnload = true WDC_Finalize를 연결하지 않는다.
DisableNETencrypt2
= true
.NET의 PE 필드를 재 암호화 하는 기능을 사용하지 않는다.
PatchBilleniumEffect = true Billenium Effects API 후킹을 패치한다.
ForceImportLib = true 강제로 라이브러리를 로드한다.
DontStripRelocs
= true
제거후 재 지정하는 것을 비활성화 한다.
CustomMsgDLL_ExtractW98 = true 윈도우 9x 이하 버전에서 실행시, DLL 메시지를 추출한다.
CustomMsgDLL_DontEmbed = true DLL 메시지를 추가하지 않는다.
BanLicenseWhenBannedHardwareID = true 하드웨어 ID를 확인하여 해당 머신이 사용불가시 라이센스도 회수한다.
BugCheck = true 버그체크 기능을 활성화 한다.
BanHardwareIDpartial = true 하드웨어 잠김 기능을 사용한다.
DontWrapExceptions
= true
RaiseException를 보호하는 것을 비활성화 한다.
DontFixHooks
= true
XBundler가 후킹한 함수를 되돌린다.
HookAllModules = true XBundler로 모든 모듈의 함수를 후킹한다.
PartialHooking = true .NET에서 필요한 함수만 후킹한다.
DontHookAllModules
= true
K32와 Mscorwks.dll만 XBundler로 후킹한다.
DisableNETencrypt2 = true .NET의 PE 필드를 재 암호화 하는 기능을 사용하지 않는다.
DotNetHookCompatible = true 모든 XBundler로 후킹된 함수가 마지막에서 실제 API를 호출하도록 한다.
ImplicitImport = true 모든 DLL을 블러온다.
ImplicitRedirection = true NULLs을 호출하는 API인 경우 리다이렉션하지 않는다.
PatchIcon = true 아이콘의 마지막 바이트를 수정한다.
ModifyPEStruct = true PE 구조를 조금 변경한다.
DisableWineSupport
= true
WINE을 지원기능을 비활성화 한다.
FixOverlayStart = true 시작시 마지막 DWORD 데이터을 덮어쓴다.
LastSectionName = Themida 마지막 세션 이름을 정한다.
DisableRegMonThread
= true
Regmon용 스레드를 비활성화 한다.
ProtectAsFlash = true Flash 기술을 이용하여 보호한다.
ReHookingEnabled = true K32의 외부에서 XBundler를 연결한다.
VbApiOptimization
= true
VB 응용프로그램을 위해 API 보호를 최적화 한다.
BundlerExceptionSupport = true 추가된 Dll의 예외 처리 지원을 허용한다. (윈도우 2008이후 사용가능)
DisableMacros
= true
메크로 기능을 비활성화 한다.
DisableOverlayEncrypt
= true
암호화를 덮어씌우지 않는다.
DisablePrefetch
= true
윈도우 Prefetch 기능을 사용하지 않도록 한다.
FastCheckIntegrity
= true
무결성 체크를 간략히 마친다.
NoCheckDeepFreeze = true 무응답상황을 체크하지 않는다.
NoThreadEngine = true 스레드 엔진을 이용하지 않는다.
WinMapDisable = true 윈맵을 사용할 수 없도록 한다.

[표] 추가로 설정 가능한 엔진 설정

더미다 이외에도 아래와 같은 패커들도 유명한 도구로서 알아두면 도움이 된다.

VMProtect

http://vmpsoft.com/

DotFix NiceProtect

http://www.niceprotect.com

Facebook Comments

Leave A Reply

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.