Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
packer-tutorial — Windows용 패커 작성 방법에 대한 튜토리얼! | Kitploit
도구/GitHubGitHub/frank2/packer-tutorial
Reverse EngineeringMalware AnalysisBinary AnalysisLearning & Education
GitHubfrank2/packer-tutorial

packer-tutorial

Windows용 패커 작성 방법에 대한 튜토리얼!

저장소 보기
31932243년 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

PACKERS

목차

  1. 패커란 무엇인가?: 패커의 목적에 대한 소개와 패커 개발에 필요한 사항에 대한 안내.
  2. 사전 요구 사항: 이 튜토리얼을 진행하는 데 필요한 도구.
  3. 맛보기: 이 튜토리얼로 무엇을 만들지 보여주는 데모.
  4. CMake 프로젝트 구상: 패커의 다소 복잡한 요구 사항을 위한 빌드 시스템을 만드는 미니 CMake 튜토리얼.
  5. 스텁에 바이너리 패킹하기: 패커/스텁 조합에서 패커 부분을 작성하는 방법에 대한 튜토리얼이자 Windows 실행 파일 형식에 대한 소개.
    1. 리소스 관리
    2. PE 파일 구문 분석
    3. PE 파일 조작
  6. 로더 시뮬레이션: 대상 실행 파일을 언패킹하고 로드하는 최소 스텁 실행 파일을 빌드하는 방법에 대한 튜토리얼이자 더 고급 Windows 실행 파일 조작에 대한 소개.
    1. 메모리에서 우리의 PE 읽기
    2. 실행을 위해 PE 로드하기
    3. API 가져오기 해석
    4. 주소 해석
    5. 실행 전환
  7. 추가 연습: 패커 개발 지식을 더 확장하기 위한 몇 가지 연습 문제.

부담스러워 보이나요? 이 readme를 요약한 프레젠테이션 버전을 시도해 보세요. YouTube 동영상이 곧 공개됩니다!

패커란 무엇인가?

패커는 자신의 주소 공간(때로는 다른 프로세스의 주소 공간) 내에서 다른 프로그램을 압축 해제하고 실행하는 프로그램입니다. 디버거나 가상 샌드박스와 같은 분석 환경을 공격하는 벡터로 알려져 있기도 합니다. 주로 다음과 같은 몇 가지 용도로 사용됩니다:

  • 압축: 패커는 일반적으로 특정 바이너리의 코드를 압축하는 데 사용됩니다. 이는 패커의 몇 안 되는 합법적인 용도 중 하나입니다. 압축 패커의 예는 UPX를 참조하세요.
  • 난독화: 패커는 프로그램을 난독화하거나 리버스 엔지니어링으로부터 방어하려는 경우에도 사용됩니다. 안티 리버싱 패커의 예는 Riot Games의 packman 패커를 참조하세요.
  • 회피: 악성코드는 안티바이러스 및 EDR까지 회피하기 위해 다양한 패커를 자주 사용합니다. 회피형 패커의 예는 SmokeLoader 패커 분석을 참조하세요.

기본적으로 패커는 몇 가지 기본 단계만 수행합니다:

  1. 압축 단계: 이 단계에서는 원본 실행 파일을 압축하거나 난독화하거나 둘 다 수행하여 새 바이너리로 만듭니다.
  2. 압축 해제 단계: 이 단계에서는 패킹된 실행 파일이 로드를 위해 원본 실행 파일을 압축 해제하거나 난독화를 해제합니다.
  3. 로딩 단계: 이 단계에서는 패커가 호스트 플랫폼의 실행 파일 로더와 유사한 여러 단계를 모방합니다. 실행 파일 바이너리의 복잡성 때문에, 어느 정도 깊이로 에뮬레이션할지에 따라 가장 복잡한 단계입니다.
  4. 실행 단계: 이 단계에서는 호스트 스텁 실행 파일의 코드가 새로 로드된(즉, 언패킹된) 코드로 전환됩니다.

마찬가지로 간단하게, 패커는 몇 가지 구성 요소로만 이루어져 있습니다:

  • 패커: 이 구성 요소는 스텁 실행 파일을 준비하고 주어진 바이너리를 언패킹하는 데 필요한 데이터를 제공하는 역할을 합니다. 이는 궁극적으로 압축 단계입니다.
  • 스텁: 이 바이너리는 원본 바이너리를 압축 해제하고 로드하며 실행하는 코드 부분입니다. 보시다시피 스텁 실행 파일이 패커의 대부분의 무거운 작업을 수행합니다.

패커를 빌드하는 것은 까다로울 수 있습니다. 스텁을 빌드하여 패커 실행 파일에 어떻게든 포함시켜야 하기 때문입니다. Windows의 경우 단순 컴파일을 넘어 Visual Studio의 빌드 시스템을 배우는 것은 힘든 작업이 될 수 있습니다. 다행히 CMake는 Visual Studio를 지원하는 간단하고 크로스 플랫폼인 빌드 시스템을 제공하며, 커스터마이징도 매우 용이합니다!

이 튜토리얼은 다음을 가르치는 것을 목표로 합니다:

  • 패커의 두 주요 구성 요소를 분리하고 통합하여 응집력 있고 테스트 가능한 빌드 환경을 만드는 방법.
  • Windows 실행 파일을 조작하여 추가적이고 로드 가능한 데이터를 추가하는 방법.
  • Windows 실행 파일을 탐색하여 임의의 데이터를 검색하고 로드하는 방법.
  • Windows 실행 파일을 로드하고 실행하기 위해 Windows 로더의 일부를 에뮬레이션하는 방법.

이미 C++와 CMake에 익숙하다면 패킹 섹션으로 바로 건너뛰어도 좋습니다. 그렇지 않다면 계속 읽어 보세요!

사전 요구 사항

  • C++ 지식: 이 튜토리얼에서는 포인터 연산을 많이 사용할 것이므로 C++를 모르면 이 튜토리얼은 거의 쓸모가 없습니다.
  • Visual Studio: Visual Studio에는 완전한 기능을 갖춘 Windows C++ 컴파일러가 포함되어 있습니다. 이 프로젝트는 Visual Studio 2019에서 테스트되었지만, 최신 버전도 문제없을 것입니다.
  • CMake: CMake는 Visual Studio 컴파일러용 빌드를 구성하는 데 사용하는 빌드 시스템입니다.

맛보기

먼저, 이 빌드 시스템이 제대로 작동하여 올바르게 패킹된 실행 파일을 생성한다는 것을 어떻게든 증명해 봅시다. CMake와 Visual Studio를 설치한 후, 원하는 터미널로 이 저장소의 루트 디렉터리로 이동하여 다음을 실행하세요:``` $ mkdir build $ cd build $ cmake ../

이렇게 하면 packer 튜토리얼 코드를 빌드하는 데 필요한 프로젝트 파일이 생성됩니다. 그런 다음 실행하세요:```
$ cmake --build ./ --config Release

이렇게 하면 Release 모드로 packer 프로젝트가 빌드됩니다. 그런 다음, 다음 테스트를 실행할 수 있습니다:``` $ ctest -C Release ./

If all goes well, test\_pack and test_unpack should succeed. If you want to see the results of the packing yourself, you should see this:

모든 것이 잘 진행된다면, test\_pack과 test_unpack은 성공해야 합니다. 패킹 결과를 직접 확인하고 싶다면, 다음과 같은 결과를 보게 될 것입니다:```
$ ./packed.exe
I'm just a little guy!

패커를 구성하는 모든 요소에 대해 이야기해 봅시다.

CMake 프로젝트 구상하기

패커의 주요 구성 요소가 무엇인지는 알았지만, 개발 주기 중에 패커를 바로 테스트하려면 어떻게 해야 할까요? 바이너리의 패킹 및 언패킹 과정을 제대로 테스트하려면 전체 프로젝트에 세 번째 바이너리를 추가해야 합니다. 즉, 전체적으로 다음 세 개의 프로젝트가 필요합니다.

  • 패커
  • 스텁(stub)
  • 패킹할 더미 실행 파일

또한 바이너리가 스텁 실행 파일로 압축되도록 하려면 압축 라이브러리도 필요합니다. zlib이 여기에 잘 맞을 것입니다.

시작 단계에서 우리 프로젝트 구조는 다음과 같아야 합니다.``` packer/ +---+ CMakeLists.txt + dummy/ | | | +---+ CMakeLists.txt | + src/ | | | +---+ main.cpp | + stub/ | | | +---+ CMakeLists.txt | + src/ | | | +---+ main.cpp | + src/ | | | +---+ main.cpp | + zlib-1.2.13/ | +---+ CMakeLists.txt + ...

각 폴더의 main.cpp는 지금은 단순히 다음과 같이 보일 수 있습니다:```cpp
#include <iostream>

int main(int argc, char *argv[]) {
    std::cout << "I'm just a little guy!" << std::endl;
    
    return 0;
}

Already, we should establish that we have a simple dependency chain to deal with, which CMake will nicely resolve for us with some instrumentation:

  • packer와 stub은 zlib에 의존합니다.
  • packer는 stub에 의존합니다.
  • dummy는 packer에 의존합니다 (packer에 의해 패킹되어야 하기 때문입니다).

CMake 계측을 위해 루트 프로젝트, 즉 packer부터 시작하겠습니다.

CMake는 일반적으로 처리할 최소 버전을 요구합니다. 오랫동안 존재해 왔고 이전 버전의 장기 사용을 지원하기 때문입니다. 그 후에는 packer 프로젝트를 C++ 프로젝트로 선언할 수 있습니다.```cmake

target a cmake version, you can target a lower version if you like

cmake_minimum_required(VERSION 3.24)

declare our packer as a C++ project (since zlib is a C project and the compilation

detection might get confused)

project(packer CXX)

또한 패커를 "MultiThreadedDLL"(즉, /MD) 대신 "MultiThreaded"(즉, /MT)로 선언하여 런타임 DLL 종속성에 대해 걱정할 필요가 없도록 하고 싶습니다.```cmake
# this line will mark our packer as MultiThreaded, instead of MultiThreadedDLL
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")

변수 설정 문에서 꺾쇠 괄호 안의 문은 generator expression이라고 하며, 필요할 때 구성 시 데이터를 확인하는 데 도움이 됩니다. 이 파일 전체에서 자주 보게 될 것입니다. 이 generator expression은 구성이 Debug임을 감지하면 Debug 문자열을 내보내고, 그렇지 않으면 아무것도 내보내지 않습니다. 따라서 컴파일 프로필로 Debug를 선택하면 MultiThreadedDebug 런타임 라이브러리가 제공되고, Release와 같은 디버그가 아닌 컴파일 프로필을 선택하면 MultiThreaded가 제공됩니다. 무슨 일이 일어나고 있는지 잘 이해하려면 조건부 generator expression을 참조하세요. CMAKE_MSVC_RUNTIME_LIBRARY 변수에 대한 자세한 내용은 CMake 문서를 참조하세요.

CMake를 사용하면 Visual Studio에서 UI로 프로젝트를 만들 때 자동으로 하는 것처럼 소스 코드를 계층 구조로 구성할 수 있으며, 폴더에서 일치하는 파일 이름을 재귀적으로 검색할 수도 있습니다. 우리 구성 파일에서는 헤더(.hpp), 코드(.cpp), 리소스 스크립트(.rc)에 대해 전역 재귀를 설정했습니다. 이 예제에서는 실제로 main.cpp만 필요하지만, 더 큰 프로젝트에서는 알아 두면 유용합니다.```cmake

this will collect header, source and resource files into convenient variables

file(GLOB_RECURSE SRC_FILES ${PROJECT_SOURCE_DIR}/src/.cpp) file(GLOB_RECURSE HDR_FILES ${PROJECT_SOURCE_DIR}/src/.hpp) file(GLOB_RECURSE RC_FILES ${PROJECT_SOURCE_DIR}/src/*.rc)

도구 다운로드