
AMSI/Defender 탐지 경계 분석 및 정적 악성코드 트리아지를 위한 PowerShell 툴킷으로, 바이트 오프셋을 탐지 트리거에 매핑하며 YARA, 엔트로피, 문자열, PE/imphash 분석도 제공합니다. OffsetScan의 동반 도구입니다.
바이트 오프셋 검사, 소스 상관관계, 바이너리 비교, 방어 탐지 경계 분석을 위한 한정된 메모리(bounded-memory) PowerShell 툴킷입니다.
OffsetInspect는 실무 분석가의 질문에 답합니다:
이 바이트 오프셋에는 어떤 콘텐츠가 있으며, 그 주변에는 어떤 소스 또는 바이너리 컨텍스트가 있을까요?
또한 ThreatCheck가 다루는 동일한 분석 문제에서 영감을 얻은 OffsetInspect 고유의 탐지 경계 워크플로를 제공하되, ThreatCheck의 소스나 바이너리를 번들로 포함하지 않습니다. AMSI 또는 Microsoft Defender가 여전히 탐지하는 가장 빠른 콘텐츠 접두사를 찾아내고, 그 경계를 반복 검증한 다음, 그 결과 오프셋을 컨텍스트 검사기에 직접 전달합니다. 이 핵심 위에 다중 영역 발견, 코퍼스 스캔, 탐지 비교(diff), 탐지 트리거 상관관계, 드리프트 저널링, 참여 보고서, 엔트로피 분석, 문자열 추출, PE/imphash 파싱 등 레드팀 분석 및 정적 트리아주 스위트를 추가합니다. 모두 읽기 전용이며, 승인된 사용을 위한 시그니처 견고성 테스터는 샘플을 메모리에서만 변형하고 엔드포인트 보호를 절대 비활성화하거나 재구성하지 않습니다.
PowerShell 오버헤드 없이 코퍼스 규모의 정적 트리아주(PE 파싱, 엔트로피, 문자열, IOC)를 수행하려면 OffsetScan 을 참조하세요.
동일한 JSON 출력 스키마를 사용하는 네이티브 Rust 바이너리입니다. OffsetInspect 3.1.0 이상은 -IocJsonPath를 통해 OffsetScan IOC JSON을 직접 입력받습니다.
-ContextLines를 통해 이전 및 이후 소스 컨텍스트를 구현합니다.ProbeLog/ProbeCount)을 기록하고, 이를 -Verbose로 실시간 스트리밍하여 스캔의 실제 공급자 비용을 보고서로 바로 사용할 수 있는 기록을 생성합니다.-CaptureTelemetry)과 상관관계를 맺습니다: Microsoft Defender 경고가 발생했는지, 어떤 컨텍스트로 발생했는지, 어떤 원격 측정 소스가 눈이 멀었는지 - "가시성 가정 후 검증" 원칙을 구현합니다. 읽기 전용, 관리자 권한 불필요, Windows 전용.Get-OffsetSignature): 플랫폼의 실제 신뢰 검증을 사용하여 파일이 유효하게 서명되고 신뢰되는지, 서명자가 누구인지, 임베디드 서명인지 카탈로그 서명인지 보고합니다. 이 서명자 신호는 imphash 및 빌드 툴체인 지문(임포트 대 툴체인 대 서명자)을 보완합니다. Windows 전용.| Command | Purpose | Platform |
|---|---|---|
Invoke-OffsetInspect | 바이트 오프셋을 소스/바이너리 컨텍스트, 헥스 및 비교로 매핑 | 크로스 플랫폼 |
Invoke-OffsetThreatScan | 단일 파일에 대한 AMSI/Defender 탐지 경계 검색 | Windows |
Invoke-OffsetThreatScanBatch | 파일 코퍼스 스캔; -Summary는 탐지 매트릭스를 반환 | Windows |
Invoke-OffsetThreatScanRegion | 인메모리 AMSI를 통한 다중 영역 발견(디스크 쓰기 없음) | Windows |
Invoke-OffsetMutationTest | 시그니처 견고성 테스트: 탐지된 샘플을 메모리에서 변형하고 어떤 변형이 우회하는지 보고(승인된 용도로만) | Windows |
Compare-OffsetThreatResult | 두 스캔 결과 비교(예: 시그니처 정의 업데이트 전후) | 크로스 플랫폼 |
Get-OffsetDetectionTrigger | 탐지 경계를 가장 가능성 높은 트리거 콘텐츠와 상관관계 매핑 | 크로스 플랫폼 |
Add-OffsetDriftEntry | 탐지 스냅샷(파일 해시 + Defender 시그니처 버전)을 저널에 기록 | 크로스 플랫폼² |
Get-OffsetDrift | 파일 탐지 가능성이 어떻게 변경되었는지 설명: 파일 변경 vs 시그니처 업데이트 vs 비결정적 결과 | 크로스 플랫폼 |
Export-OffsetThreatReport | 스캔 결과를 Markdown/HTML 참여 보고서로 렌더링 | 크로스 플랫폼 |
Invoke-OffsetYaraScan | 파일을 YARA 규칙과 매칭; 바이트 오프셋과 함께 히트 반환 | 크로스 플랫폼¹ |
Invoke-OffsetClamScan | ClamAV 엔진으로 파일 스캔; 정규화된 탐지 결과 | 크로스 플랫폼¹ |
Get-OffsetEntropy | 패킹/암호화 영역을 찾기 위한 창별 섀넌 엔트로피 | 크로스 플랫폼 |
Get-OffsetString | 바이트 오프셋과 함께 ASCII/UTF-16LE 문자열 추출 | 크로스 플랫폼 |
Get-OffsetPEInfo | PE 헤더, 섹션, 임포트/imphash, 오버레이, 오프셋→섹션 | 크로스 플랫폼 |
Get-OffsetIOC | 통합 지표 패널: 해시, 엔트로피, PE/imphash, 문자열 | 크로스 플랫폼 |
Get-OffsetSignature | Authenticode 서명: 유효하게 서명되고 신뢰되는지, 서명자가 누구인지, 임베디드 vs 카탈로그 | Windows |
¹ 이 두 명령은 선택적 외부 의존성이 있습니다: Invoke-OffsetYaraScan은 YARA 엔진(winget install VirusTotal.YARA)이 필요하고, Invoke-OffsetClamScan은 시그니처 데이터베이스가 있는 ClamAV(winget install Cisco.ClamAV, 이후 freshclam)가 필요합니다. 다른 모든 명령은 자체 포함입니다. 여기서 ClamAV는 경계 검색 엔진이 아닌 단일 파일 탐지기입니다. clamscan은 호출마다 전체 데이터베이스를 로드하므로, 이분 검색을 하려면 clamd 데몬이 필요합니다.
² Add-OffsetDriftEntry는 크로스 플랫폼에서 저널링하지만, Defender 시그니처/엔진 버전 필드는 Windows에서만 채워집니다(Get-MpComputerStatus 사용). 다른 플랫폼에서는 null로 기록되며 나머지 스냅샷은 여전히 기록됩니다.
오프셋 검사 코어와 모든 정적 트리아주 헬퍼는 크로스 플랫폼(Windows, Linux, macOS)입니다. AMSI/Defender 위협 공급자는 Windows 전용입니다.
Install-Module OffsetInspect -Scope CurrentUser Import-Module OffsetInspect
### 저장소 체크아웃```powershell
git clone https://github.com/warpedatom/OffsetInspect.git
cd OffsetInspect
Import-Module ./module/OffsetInspect/OffsetInspect.psd1 -Force
이 저장소에는 경량 CLI 래퍼도 포함되어 있습니다:```powershell ./OffsetInspect.ps1 ./OffsetThreatScan.ps1 -Engine AMSI
## 오프셋 검사
### 사람이 읽을 수 있는 출력```powershell
Invoke-OffsetInspect ./sample.bin 0x200
The input chunk is empty — no content was provided to translate. Please supply the markdown text for chunk 9 of 63.```powershell $inspectParameters = @{ FilePaths = './script.ps1' OffsetInputs = 128, 256, 512 ByteWindow = 64 ContextLines = 4 } Invoke-OffsetInspect @inspectParameters
### 구조화된 객체```powershell
$inspectParameters = @{
FilePaths = './script.ps1'
OffsetInputs = 0x80, 0x100
PassThru = $true
}
$results = Invoke-OffsetInspect @inspectParameters
$results | Where-Object BytesDiffer
Invoke-OffsetInspect ./sample.bin 0x200 -Json Invoke-OffsetInspect ./sample.bin 0x200 -Csv Invoke-OffsetInspect ./sample.bin 0x200 -CsvPath ./artifacts/offsets.csv
JSON 모드는 단일 결과의 경우에도 항상 배열을 출력합니다.
### 이진 비교```powershell
$compareParameters = @{
FilePaths = './before.bin'
OffsetInputs = 0x200
CompareFile = './after.bin'
PassThru = $true
}
Invoke-OffsetInspect @compareParameters
| 입력 | 해석 |
|---|---|
512 | 10진수 512 |
0x200 또는 0X200 | 16진수 0x200 |
200h | 16진수 0x200 |
E1AB1 | A-F를 포함하므로 접두사가 없는 16진수 |
접두사나 접미사가 없는 숫자로만 구성된 값은 의도적으로 10진수로 처리됩니다.