
PE 바이너리와 텍스트에서 고신호 IOC를 추출하는 확장 가능하고 결정론적인 정적 분석 엔진으로, SOC 자동화 및 현대 위협 분석 파이프라인을 위해 구축되었습니다.
IOCX CLI를 사용한 PE 파일의 정적 IOC 추출
이 프로젝트는 결정적 정적 IOC 추출 및 PE 분석을 위한 원본 IOCX 엔진입니다. "iocx"라는 이름을 사용하는 다른 모든 저장소는 이 프로젝트와 관련이 없습니다.
공식 링크:
현대 악성코드는 기본적으로 적대적(adversarial) 입니다 — 변형되고, 회피적이며, 단순한 추출기를 무너뜨리도록 설계되었습니다.
IOCX는 정확성과 결정성이 실제로 중요한 환경을 위해 구축되었습니다.
IOCX는 공식 정적 IOC 추출 엔진입니다 — DFIR, SOC 자동화, CI/CD 보안, 대규모 위협 인텔리전스 파이프라인을 위해 구축된 결정적이고 바이너리를 인식하는 시스템입니다.
정규식 전용 추출기나 샌드박스 의존 도구와 달리 IOCX는 다음을 수행합니다:
확장 가능한 현대 위협 분석을 위한 MalX Labs 생태계의 핵심 구성 요소입니다.
echo "http://malicious.example" | iocx -
또는 PE 파일을 안전하게 스캔:
iocx suspicious.exe -a deep
보안 팀은 세 가지 지속적인 문제에 직면합니다:
IOCX는 자동화, 안전성, 확장성을 위해 설계된 결정적이고 정적 전용 엔진으로 이 문제를 해결합니다.
IOCX는 의도적으로 다음이 아닙니다:
신뢰할 수 없는 코드를 절대 실행하지 않습니다. 동적 분석을 절대 수행하지 않습니다. 안전성, 결정성, CI/CD 호환성을 위해 설계상 정적 전용입니다.
IOCX는 레거시 도구의 가정이 아닌 현대 악성코드의 현실을 위해 설계되었습니다.
안정적이고 재현 가능한 출력 — 무작위성 없음, 변동성 없음.
실행은 안전하지 않습니다. 정적 분석은 예측 가능하고 확장 가능하며 CI 친화적입니다.
변형된 PE, 손상된 RVA, 적대적 문자열 — IOCX는 이를 정상 입력으로 취급합니다.
다운스트림 시스템은 업그레이드 시 절대 중단되지 않아야 합니다.
원시 텍스트에서 150–300 MB/s. 일반적인 PE에서 6–15 MB/s. 최악의 적대적 부하에서도 예측 가능.
이러한 약속은 PE 구조 분석에 대한 발표된 연구 방법론 — 결정적 픽스처 구성, 단일 이상 징후 규율, 정확성의 기준으로서의 Windows 로더 동작 — 에서 파생되었습니다. 전체 방법론은 docs/methodology.md를 참조하고, 더 넓은 적대적 PE 분류 체계와 상업용 픽스처 제품군은 paax.dev를 참조하십시오.
요약: IOCX는 이상적인 입력이 아닌 실제 적대적 현실을 위해 구축되었습니다.
150–300 MB/s 지속 처리량 빠른 경로 — PE 파싱 없음.
| 감지기 | 1 MB 시간 |
|---|
IMPORT_* 사유 코드).version_info가 이제 제한된 공개 프로젝션을 통해 모든 분석 수준에서 파싱되어 표시됩니다 (-a full뿐만 아니라).--version 출력, 더 명확한 --help 텍스트, 인수 그룹 재구성..pdata) 디렉토리의 심층 의미론적 검증 추가; 14개의 새로운 사유 코드; 총 15개의 검증기.pip install iocx
iocx suspicious.exe
echo "Visit http://bad.example.com" | iocx -
iocx suspicious.exe -a
from iocx.engine import Engine
engine = Engine()
results = engine.extract("suspicious.exe")
print(results)
IOCX는 IOC, PE 메타데이터, 섹션 분석, 휴리스틱 및 난독화 지표를 포함하는 구조화되고 결정적인 JSON을 생성합니다.
아래 예시는 실제 적대적 PE 샘플의 축약된 출력입니다. 문서화 목적으로 크기를 관리 가능하게 유지하면서 스키마의 형태와 깊이를 보여줍니다.
{
"file": "heuristic_rich.full.exe",
"type": "PE",
"iocs": {
"urls": ["http://not-a-real-domain.test/payload"],
"domains": ["example-malware.com"],
"ips": ["192.0.2.123"],
"hashes": [
"abcd1234ef567890abcd1234ef567890",
"1234567890",
"3333333333333333"
],
"filepaths": [
"/usr/src/mingw-w64-11.0.1-3build1/mingw-w64-crt/crt/crtexe.c",
"/usr/x86_64-w64-mingw32/include",
"/usr/src/mingw-w64-11.0.1-3build1/mingw-w64-crt/crt/pseudo-reloc.c"
]
},
"metadata": {
"file_type": "PE",
"imports": ["KERNEL32.dll", "msvcrt.dll", "USER32.dll"],
"sections": [
".text", ".data", ".rwx", ".rdata",
"UPX0", ".pdata", ".xdata", ".tls"
],
"resources": [],
"resource_strings": [],
"delayed_imports": [],
"bound_imports": [],
"exports": [],
"signatures": [],
"has_signature": false,
"tls": {
"start_address": 5368758272,
"end_address": 5368758280,
"callbacks": 5368754232
},
"header": {
"entry_point": 5088,
"image_base": 5368709120,
"machine": "AMD64",
"subsystem": "Windows GUI"
},
"optional_header": {
"section_alignment": 4096,
"file_alignment": 512,
"size_of_image": 155648
}
},
"analysis": {
"sections": [
{ "name": ".text", "entropy": 5.92 },
{ "name": ".rwx", "entropy": 0 },
{ "name": "UPX0", "entropy": 0.34 },
{ "name": ".rdata", "entropy": 4.03 }
],
"obfuscation": [
{
"value": "abnormal_section_layout_virtual_only",
"category": "obfuscation_hint",
"metadata": {
"section": ".bss",
"raw_size": 0,
"virtual_size": 384
}
}
],
"extended": [
{
"value": "summary",
"category": "pe_metadata",
"metadata": {
"dll_count": 3,
"import_count": 45,
"resource_count": 0,
"has_tls": true,
"has_signature": false
}
}
],
"heuristics": [
{
"value": "packer_suspected",
"metadata": {
"reason": "packer_section_name",
"section": "UPX0"
}
},
{
"value": "anti_debug_heuristic",
"metadata": {
"reason": "anti_debug_api_import",
"dll": "kernel32.dll",
"function": "CheckRemoteDebuggerPresent"
}
},
{
"value": "anti_debug_heuristic",
"metadata": {
"reason": "timing_api_import",
"dll": "kernel32.dll",
"function": "GetTickCount"
}
},
{
"value": "pe_structure_anomaly",
"metadata": {
"reason": "section_overlaps_headers",
"section": ".bss",
"raw_address": 0,
"size_of_headers": 1536
}
},
{
"value": "pe_structure_anomaly",
"metadata": {
"reason": "data_directory_overlap",
"directory_a": "IMAGE_DIRECTORY_ENTRY_IMPORT",
"directory_b": "IMAGE_DIRECTORY_ENTRY_IAT"
}
}
]
}
}
iocx/
├── examples/
├── docs/
├── tests/
└── iocx
├── detectors/
├── parsers/
├── plugins/
├── cli/
└── analysis/
IOCX는 안전하고 예측 가능하게 확장되도록 설계되었습니다. 플러그인은 일급 시민이며, 코어 엔진과 동일한 결정적 스냅샷 테스트로 검증됩니다.
다음을 구축할 수 있습니다:
참조:
docs/specs/overlap-suppression.mddocs/specs/plugin-authoring-guidelines.mdIOCX는 단일 바이너리 그 이상입니다 — 모듈식 생태계입니다:
IOCX는 다음 분야에서 사용됩니다:
지표를 안전하게, 결정적으로, 대규모로 추출해야 하는 모든 곳에서 IOCX가 적합합니다.
모든 테스트 샘플은:
IOCX는 CI에서 엄격한 성능 임계값을 적용하여 다음을 보장합니다:
참조:
docs/performance.mdIOCX라는 이름은 다음에 게시된 공식 엔진만을 지칭합니다:
iocx라는 이름의 저장소iocx-<plugin>iocx-extension-<name>iocx-detector-<feature>IOCX 개발은 안정성, 확장성 및 더 깊은 정적 분석 범위에 중점을 둡니다. 아래 항목은 진행 중인 작업 및 탐구 영역을 나타냅니다.
다음을 환영합니다:
지침은 CONTRIBUTING.md를 참조하십시오.
보안 문제를 발견한 경우 GitHub 이슈를 열지 마십시오.
SECURITY.md의 지침을 따르십시오.
MPL‑2.0 라이선스 — LICENSE 참조.
| 기능 | IOCX | 일반적인 IOC 추출기 | 샌드박스 / 동적 도구 |
|---|
| 안전성 | 무실행, 정적 전용 | 정규식 전용, 바이너리 안전성 없음 | 신뢰할 수 없는 코드 실행 (고위험) |
| 결정성 | 완전히 결정적인 출력 | 노이즈에서 비결정적 | 설계상 비결정적 |
| 바이너리 인식 | 전체 PE 파싱, 휴리스틱 | 바이너리 지원 없음 | 가능하지만 안전하지 않고 느림 |
| 적대적 복원력 | 변형된 PE, 적대적 문자열에 대해 테스트됨 | 쉽게 우회됨 | 종종 충돌하거나 오분류 |
| 성능 | 150–300 MB/s (텍스트), 6–15 MB/s (PE) | 매우 가변적 | 극도로 느림 |
| CI/CD 친화성 | 예 — 안전, 결정적, 빠름 | 부분적 | 아니요 — 파이프라인에 안전하지 않음 |
| 스키마 안정성 | 보장됨 | 드묾 | 없음 |
| 처리량 |
|---|
| Crypto | 0.0037 s | ~270 MB/s |
| Filepaths | 0.0041 s | ~250 MB/s |
| IP | 0.0065 s | ~156 MB/s |
| Domains | 0.0035 s | ~300 MB/s |
dumpbin에 대해 종단 간 검증됨python-magic 의존성 제거--min-length 일관성 수정은 v0.7.5에서 계획됨idna 의존성 추가