
PE-sieve 기능의 네이티브 Delphi 구현으로, 재사용 가능한 라이브러리, CLI, 그리고 HollowsHunter 통합을 위한 PE-sieve 호환 DLL을 제공합니다.
NativeMirror는 hasherezade의 PE-sieve를 기반으로 각색한, PE-sieve 기능의 독립적인 Object Pascal 구현입니다. 프로세스 메모리를 스캔하고, 수정되거나 주입된 코드를 탐지하며, PE 파일을 덤프합니다.
이 구현은 Delphi 네이티브 API와 PE 엔진으로서 NativePe를 사용합니다. Delphi 라이브러리로 직접 사용하거나, CLI를 통해, 또는 PE-sieve 호환 DLL 인터페이스를 통해 사용할 수 있습니다. 세 가지 모두 동일한 스캐너 코어를 공유합니다. 호환성 목표는 PE-sieve 0.4.1.5의 외부에서 관찰 가능한 동작이며, 완전한 동작 동등성은 입증되지 않았습니다.
../NativePe로 배치하거나 Delphi 검색 경로를 조정하십시오.NativeMirrorScan.NativeAsm.dproj 프로젝트는 USE_NATIVEASM을 활성화합니다. 이것이 없으면 NativeMirror는 Delphi/LDE 폴백을 사용합니다. NativeASM 검색 경로를 설치 환경에 맞게 조정하십시오.py 런처가 포함된 Python 3: DLL 빌드 후 단계와 Python 테스트에 필요합니다. 스크립트는 Python 표준 라이브러리를 사용합니다.일부 프로젝트 구성에는 로컬 종속성 경로가 포함되어 있습니다. 다른 머신에서 빌드하기 전에 검색 경로를 확인하십시오.
Delphi에서 NativeMirror.groupproj를 열고 필요한 프로젝트, 플랫폼 및 구성을 선택하십시오.
| 프로젝트 | 출력 |
|---|---|
tools/NativeMirrorScan/NativeMirrorScan.dproj | NativeMirrorScan.exe |
tools/NativeMirrorDll/pe-sieve.dproj | pe-sieve.dll |
tests/ScannerIntegration/NativeMirrorTestTarget.dproj | Win64 테스트 대상 |
tests/ScannerIntegration/NativeMirrorTestTarget32.dproj | Win32 테스트 대상 |
tests/ScannerIntegration/NativeMirrorScannerTests.dproj | Win64 스캐너 테스트 러너 |
tests/HollowsHunterIntegration/NativeMirrorHollowsHunterTests.dproj | Win64 HollowsHunter 테스트 러너 |
필요에 따라 CLI와 DLL을 Win32 및 Win64용으로 빌드하십시오. 통합 테스트를 실행하기 전에 두 테스트 대상을 모두 빌드하십시오. 테스트 러너는 Win64용으로 빌드하십시오.
출력은 bin/<Platform>/<Config>에 저장됩니다. 아래 예제는 Debug를 사용합니다. 컴파일러 유닛은 dcu/에 저장됩니다. 실행 파일은 tools/에 두지 마십시오.
프로젝트 루트에서 다음 명령을 실행하십시오. 1234를 스캔할 프로세스 ID로 바꾸십시오.
.\bin\Win64\Debug\NativeMirrorScan.exe /help
.\bin\Win64\Debug\NativeMirrorScan.exe /pid 1234
.\bin\Win64\Debug\NativeMirrorScan.exe /pid 1234 /json /quiet /ofilter 2
.\bin\Win64\Debug\NativeMirrorScan.exe /pid 1234 /dir output
/ofilter 2는 덤프 출력을 비활성화합니다. /dir output은 보고서와 덤프의 출력 디렉터리를 선택합니다. 필요할 때 bin/Win32/Debug 아래의 Win32 실행 파일을 사용하십시오. 대상 프로세스에 대한 접근은 Windows 권한에 따라 달라집니다.
src/와 그 유닛 하위 디렉터리들을 NativePe와 함께 프로젝트의 검색 경로에 추가하십시오. TNativeMirrorOptions와 함께 ScanAndDump를 호출하십시오. 이 라이브러리는 애플리케이션에 컴파일되며, 이 사용 방식에는 NativeMirrorScan.exe나 pe-sieve.dll이 필요하지 않습니다. Python은 별도의 DLL 빌드와 Python 테스트에만 필요합니다.
다음 콘솔 예제는 PID 1234를 스캔하고 보고서를 JSON으로 출력합니다:
program ScanExample;
{$APPTYPE CONSOLE}
uses
System.JSON,
NativeMirror.Core.Types,
NativeMirror.Core.Options,
NativeMirror.Core.Engine;
var
Options: TNativeMirrorOptions;
Report: TNativeMirrorReportEx;
Json: TJSONObject;
begin
Options := TNativeMirrorOptions.Default;
Options.Pid := 1234;
Options.Quiet := True;
Options.OutputFilter := nmOutNoDir;
Report := ScanAndDump(Options);
try
Json := Report.ToJson(Options.ResultsFilter, Options.JsonLevel);
try
Writeln(Json.ToJSON);
finally
Json.Free;
end;
finally
Report.Free;
end;
end.
PID를 대상으로 바꾸세요. nmOutNoDir는 보고서 파일과 덤프를 비활성화합니다. 스캔 오류는 Report.ErrorReport에서, 스캔 결과는 Report.ScanReport에서 확인하세요. 반환된 보고서의 소유권은 호출자에게 있으며, 호출자가 직접 해제해야 합니다.
PE-sieve 릴리스에서 pe-sieve32.exe와 pe-sieve64.exe를 다운로드하세요. 기존 비교 스크립트는 v0.4.1.1 실행 파일을 사용합니다. 두 파일을 모두 bin/Win64/Debug에 배치하세요. Win64 테스트 스크립트는 해당 위치에서 참조 스캐너를 찾습니다. 32 실행 파일은 Win64 테스트 도구와 함께 저장되어 있지만, 원래의 Win32 참조 구현입니다.
Debug 설정은 다음과 같습니다:
bin/
Win64/Debug/
NativeMirrorScan.exe
pe-sieve.dll
pe-sieve.dll.exports.json
pe-sieve32.exe
pe-sieve64.exe
NativeMirrorTestTarget.exe
NativeMirrorScannerTests.exe
NativeMirrorHollowsHunterTests.exe
hollows_hunter.exe
Win32/Debug/
NativeMirrorScan.exe
pe-sieve.dll
pe-sieve.dll.exports.json
NativeMirrorTestTarget32.exe
NativeMirror는 CLI, DLL, export 레코드, 타깃, 테스트 러너를 생성합니다. PE-sieve와 HollowsHunter 실행 파일은 별도로 다운로드합니다. HollowsHunter는 통합 테스트나 수동 DLL 사용 시에만 필요합니다.
HollowsHunter 릴리스에서 hollows_hunter64_dll.zip, v0.4.1.1을 다운로드하십시오. DLL 패키지를 사용하십시오. 호스트 아키텍처와 API 계약이 일치하면 NativeMirror가 최종 빌드한 pe-sieve.dll이 HollowsHunter가 사용하는 원본 PE-sieve DLL을 대체합니다. 독립 실행형 정적 실행 파일은 대체 DLL을 사용할 수 없습니다. 제공된 통합 테스트는 v0.4.1.1 Win64 DLL 호스트를 다룹니다.
수동으로 실행하려면 패키지의 hollows_hunter.exe를 NativeMirror로 빌드한 pe-sieve.dll 옆인 bin/Win64/Debug에 복사하십시오. 패키지의 원본 DLL을 NativeMirror DLL 위에 복사하지 마십시오. 호스트와 DLL 모두 Win64여야 합니다.
.\bin\Win64\Debug\hollows_hunter.exe /pid 1234 /quiet /hooks /ofilter 2 /json /report 7
자동 비교를 위해, 동일한 패키지에서 변경되지 않은 원본 EXE와 DLL을 다음 위치로 추출하십시오:
tests/HollowsHunterIntegration/fixtures/Win64/pe-sieve-C/
hollows_hunter.exe
pe-sieve.dll
manifest.json
기존 manifest.json을 유지합니다. 이 파일은 예상 버전과 SHA-256 해시를 기록합니다. 러너는 이 파일들을 확인하고, 동일한 호스트를 별도의 reference 및 NativeMirror 디렉터리에 복사하며, 각 DLL을 통제된 테스트 프로세스에 대해 테스트합니다. 파일을 다운로드하거나 bin의 빌드를 덮어쓰지 않습니다.
PE-sieve는 PESieve_version을 32비트 데이터 값으로 내보냅니다. 버전 0.4.1.5의 경우 해당 값은 0x00040105입니다. 호출자는 내보내기 주소가 숫자를 반환하는 함수가 아니라 이 4바이트를 가리킬 것으로 기대합니다.
이 프로젝트에서 사용하는 Delphi 12 컴파일러/링커는 exports 절을 통해 변수를 직접 내보내지 않습니다. 따라서 DLL에는 표시된 버전 값이 포함되며, 처음에는 요구되는 이름으로 헬퍼 함수를 내보냅니다.
링크 후, 프로젝트의 빌드 후 이벤트가 다음을 실행합니다:
py tools/NativeMirrorDll/finalize_exports.py bin/Win64/Debug/pe-sieve.dll
스크립트는 PESieve_version 내보내기 항목을 저장된 숫자를 가리키도록 설정하고 PE 체크섬을 업데이트합니다. 스캐너 코드와 기타 내보내기 대상은 변경하지 않습니다. 이 단계는 pe-sieve.dproj를 빌드할 때 자동으로 실행되며, 스크립트가 실패하면 빌드도 실패합니다.
스크립트는 또한 백업으로 pe-sieve.dll.before-version-export를 생성하고, 최종 내보내기 정보와 DLL 해시를 담은 pe-sieve.dll.exports.json을 생성합니다. 테스트 러너를 위해 JSON 파일을 보관하십시오. 일반 DLL 클라이언트에는 완성된 DLL만 필요합니다. Python은 빌드/테스트 머신에서 필요하며, 완성된 DLL을 사용할 때는 필요하지 않습니다.
필요한 프로젝트를 빌드하고 위의 참조 파일을 설치한 후 프로젝트 루트에서 명령을 실행하십시오.
.\bin\Win64\Debug\NativeMirrorScannerTests.exe
.\bin\Win64\Debug\NativeMirrorHollowsHunterTests.exe
py tests/CLIOutput/test_source_contract.py
py tests/CLIOutput/test_cli_arguments.py
py tests/ParityAudit/run_module_cases.py
스캐너 러너는 bin/Win64/<Config>에서 자신과 함께 있는 CLI와 pe-sieve64.exe를 찾습니다. Python 비교 스크립트는 기본적으로 bin/Win64/Debug를 사용합니다. 지원되는 경우 명시적 재정의가 가능합니다:
$env:NATIVEMIRROR_SCAN_EXE = "$PWD\bin\Win64\Debug\NativeMirrorScan.exe"
$env:PESIEVE_EXE = "$PWD\bin\Win64\Debug\pe-sieve64.exe"
$env:NATIVEMIRROR_TARGET32_EXE = "$PWD\bin\Win32\Debug\NativeMirrorTestTarget32.exe"
소스 계약 테스트는 pe-sieve-master/pe-sieve-master에 고정된 PE-sieve 0.4.1.5 소스 트리를 필요로 합니다. C++ DLL 테스트는 include/에 있는 원본 헤더를 사용합니다. 이 참조 소스는 공개된 프로젝트에 포함되어 있지 않습니다.
C++ DLL 계약 테스트를 빌드하고 실행하려면:
cmake -S tests/PeSieveDll -B parity-work/dll-contract-build-x64 -G "Visual Studio 17 2022" -A x64
cmake --build parity-work/dll-contract-build-x64 --config Debug
cmake -S tests/PeSieveDll -B parity-work/dll-contract-build-x86 -G "Visual Studio 17 2022" -A Win32
cmake --build parity-work/dll-contract-build-x86 --config Debug
py -m unittest discover -s tests/PeSieveDll -p test_version_export.py -v
py tests/PeSieveDll/run_contract.py --arch both
마지막 명령에는 완성된 Win32 및 Win64 NativeMirror DLL, 두 CLI 빌드, 그리고 두 테스트 대상이 필요합니다. 테스트 산출물은 parity-work/ 아래에 기록되며, 스캐너 진단은 스캐너 테스트 러너 옆에 기록됩니다.
다운로드한 참조 바이너리는 0.4.1.1입니다. 이들에 대한 비교는 해당 테스트 케이스를 다루며, 0.4.1.5 소스 참조와의 완전한 호환성을 입증하지는 않습니다.