
동적 VMP 덤퍼 및 임포트 픽서, VTIL 기반.

VTIL 기반의 동적 VMP 덤퍼 및 임포트 픽서입니다. VMProtect 3.X x64에서 작동합니다.

VMPDump.exe <Target PID> "<Target Module>" [-ep=<Entry Point RVA>] [-disable-reloc]
인수:
<Target PID>: 대상 프로세스의 ID (10진수 또는 16진수 형식).<Target Module>: 덤프하고 수정할 모듈의 이름. 프로세스 이미지 모듈을 원하는 경우 빈 문자열("")을 사용할 수 있습니다.[-ep=<Entry Point RVA>]: 선택적으로 제공되는 엔트리 포인트 RVA (16진수 형식). VMPDump는 옵셔널 헤더의 엔트리 포인트를 이 값으로 덮어씁니다.[-disable-reloc]: VMPDump에게 출력 이미지에서 재배치가 제거되었음을 표시하도록 지시하는 선택적 설정. 이미지는 덤프된 ImageBase에서 로드되도록 강제됩니다. 실행 가능한 덤프가 필요한 경우 유용합니다.VMPDump를 실행하기 전에 대상 프로세스에서 VMProtect 초기화 및 언패킹이 완료되어야 합니다. 즉, OEP(Original Entry Point) 이상의 상태여야 합니다.
덤프되고 수정된 이미지는 프로세스 이미지 모듈 디렉터리에 <Target Module Name>.VMPDump.<Target Module Extension> 이름으로 나타납니다.
VMProtect는 모든 임포트 호출이나 점프에 대해 스텁(stub)을 주입합니다. 이 스텁들은 .vmpX 섹션에서 '난독화된' 썽크(thunk)를 해석하고, 고정 상수를 더해 '난독 해제'합니다. 호출이나 점프 자체는 ret 명령어로 디스패치됩니다.
VMPDump는 모든 실행 가능한 섹션에서 이러한 스텁을 스캔하고, VTIL x64 리프터를 사용하여 VTIL로 리프트합니다. 그런 다음 이러한 스텁에 대해 분석을 수행하여 어떤 종류의 호출을 대체해야 하는지와 어떤 바이트를 덮어써야 하는지 결정합니다.
모든 호출이 검색되면 VMPDump는 새로운 임포트 테이블을 생성하고 기존 IAT에 썽크를 추가합니다. VMP 임포트 스텁에 대한 호출은 이러한 썽크에 대한 직접 호출로 대체됩니다.
변형된 루틴에서는 VMP 임포트 스텁 호출을 직접 썽크 호출로 대체하기에 충분한 바이트가 없는 상황이 발생할 수 있습니다. 후자가 1바이트 더 크기 때문입니다. 이러한 경우 섹션이 확장되고 임포트 썽크로 점프하는 스텁이 주입됩니다. 그런 다음 VMP 임포트 스텁 호출은 해당 주입된 스텁에 대한 5바이트 상대 호출 또는 점프로 대체됩니다.
mkdir build && cd build
cmake -G "Visual Studio 16 2019" ..
cmake --build . --config Release
VS에서 빌드하려면 vcxproj의 include/library 디렉터리를 VTIL-NativeLifers/VTIL-Core/Keystone/Capstone으로 변경하기만 하면 됩니다.
이 프로젝트는 C++20을 필요로 합니다.
코드 섹션이 선형으로 스캔되기 때문에, 특히 심하게 변형되고 난독화된 코드에서는 일부 임포트 스텁 호출이 건너뛰어져 해결되지 않을 수 있습니다. 그러나 VMPDump는 대부분의 VMProtect 변형 불일치에 대한 해결 방법을 포함하고 있으므로, 심하게 변형된 코드에서도 적절한 결과를 생성할 수 있습니다.
이 문제가 발생하면 관련 정보와 함께 이슈를 제출해 주시면 확인하겠습니다.
GPL-3.0 라이선스에 따라 라이선스가 부여됩니다. 어떠한 종류의 보증도 제공되지 않습니다.