
소스에서 안티 탐지 Frida 서버를 빌드하세요. 16가지 탐지 벡터를 다루는 약 90개의 패치, 무작위 이름으로 매주 자동 빌드.
phantom-frida는 관찰 가능한 런타임 식별자 중 표적화된 집합을 변경하면서 소스에서 Android Frida Server와 Gadget을 빌드합니다. 이는 빌더이자 검증 하네스이며, 모든 애플리케이션별 탐지 방법이 무력화된다는 약속이 아닙니다.
현재 호환성 대상은 Android의 Frida 17.16.4입니다. 다른 Frida 버전은 해당 소스 계약, 전체 빌드, 루팅된 기기 수용 테스트가 반복될 때까지 의도적으로 미검증으로 취급됩니다.
이 프로젝트는 소유하거나 테스트 권한이 있는 애플리케이션과 기기에서만 사용하십시오.
저장소는 세 가지 종류의 증거를 구분합니다:
build.py --verify는 Server와 Gadget을 모두 요구하고, 스테이징된 Gadget을 스트립한 후, 알려진 금지된 런타임 마커를 거부한 뒤에야 두 아티팩트 중 하나를 게시합니다.scripts/android_smoke.py는 하나의 루팅된 기기에서 빌드된 아티팩트를 실행합니다: 인증된 추상-UNIX 전송, 스톡 클라이언트 RPC, 스폰, 어태치, Java 브리지 검증, /proc 검사, 외부 루트 메모리 스캔, 그리고 별도로 로드된 Gadget.소스 테스트나 바이트 스캔 통과는 런타임 스텔스와 동등하지 않습니다. Android 동작에 대한 주장에는 생성된, 민감 정보가 제거된 스모크 테스트 보고서가 포함되어야 합니다.
Actions 탭에서 Build Custom Frida를 실행하십시오. 재사용 가능한 빌드 워크플로는:
build-info.json과 SHA256SUMS를 하나의 빌드 아티팩트에 포함합니다.주간 워크플로는 인증된 GitHub API를 통해 최신 릴리스를 확인하고, 동일한 읽기 전용 빌드 워크플로를 호출하며, 다운로드한 아티팩트를 검증하고, 이를 증명(attest)하며, 최종 작업에만 릴리스 쓰기 권한을 부여합니다.
요구 사항:
android.jar와 D8을 포함하는 Android SDK 플랫폼 및 빌드 도구;--ndk-path를 생략하면 빌더는 build/ 아래에 Android NDK r29를 다운로드합니다. 검증된 고정 입력 arm64 빌드는 다음과 같습니다:
export ANDROID_SDK_ROOT=/path/to/Android/Sdk
python3 build.py \
--version 17.16.4 \
--name oemcodec \
--arch android-arm64 \
--port 27142 \
--extended \
--strict-wx \
--verify
유용한 옵션:
--version, -v Exact Frida semantic version (required)
--name, -n Lowercase replacement name, 3-20 characters
--arch, -a One or more supported Android architectures
--port, -p Listening port; omitted keeps 27042
--extended, -e Apply the optional extended identifier transformations
--strict-wx Harden Frida-owned persistent anonymous RWX mappings on Android
--temp-fixes Apply opt-in, device-specific stability changes
--verify Reject known forbidden markers in final artifacts
--skip-build Patch source without compiling
--skip-clone Use an existing source tree in the work directory
--ndk-path Use an existing Android NDK r29 directory
위 예시의 경우, output/에는 다음이 포함됩니다:
oemcodec-server-17.16.4-android-arm64
oemcodec-server-17.16.4-android-arm64.gz
oemcodec-gadget-17.16.4-android-arm64.so
oemcodec-gadget-17.16.4-android-arm64.so.gz
build-info.json
SHA256SUMS
build-info.json은 정확한 builder, Frida, frida-core 커밋, NDK 버전, UTC 빌드 시간, 아키텍처, 이름, 포트, 엄격한 W^X 코드 풀 모드, 그리고 Actions에서 빌드된 경우 워크플로 URL을 기록합니다. 사용 전에 다운로드한 바이너리 파일을 검증하세요:
cd output
sha256sum --check SHA256SUMS
python3 -m json.tool build-info.json >/dev/null
공개 주간 릴리스에는 GitHub 빌드 출처 증명(attestation)도 함께 제공됩니다.
SHA256SUMS는 하나의 출력 세트를 식별하며, 바이너리 해시는 서로 다른 빌드 호스트 간에 일치할 것으로 예상되지 않습니다.
빌더는 re.frida.* 아래의 D-Bus 프로토콜 인터페이스, /re/frida/GadgetSession 경로, 공개 대문자 Frida JavaScript API 문자열, 그리고 스톡 클라이언트가 요구하는 생성된 C ABI 심볼을 보존합니다. 해당 값들의 이름을 변경하면 정상적인 Frida 클라이언트/서버 계약이 깨지게 됩니다.
D-Bus 서비스 식별자, 헬퍼 JNI 패키지, zymbiote 소켓 접두사, 선택된 프로세스/라이브러리/경로 식별자, 선택된 스레드 이름, 그리고 선택적 사용자 지정 포트는 빌더가 변환할 수 있는 별개의 구현 세부 사항입니다. 출력 검증기는 다음의 명시적 마커 세트를 거부합니다:
frida\0
frida-zymbiote
re/frida/HelperBackend
frida-server
frida-helper
frida-agent
frida-gadget
frida-eternal-agent
frida-generate-certificate
frida-main-loop
frida:rpc
FridaScriptEngine
GLib-GIO
GDBusProxy
GumScript
Frida/
gum-js-loop
gmain\0
gdbus\0
pool-frida
pool-spawner
jit-cache\0
정확한 공개 API 문자열 Frida\0와 허용 목록에 포함된 re.frida.* 프로토콜
식별자는 의도적으로 그대로 유지됩니다. HTTP/Inspector 접두사
Frida/는 검증 실패이며 독립적으로 이름이 변경됩니다.
build-info.json에 기록된 정확한 Python 바인딩을 설치하고,
고정된 Java 브리지 의존성을 설치한 뒤, 루팅된 Android 기기 하나를 정확히 연결합니다:
python3 -m pip install "frida==17.16.4" frida-tools
npm ci --ignore-scripts
python3 scripts/android_smoke.py \
--server output/oemcodec-server-17.16.4-android-arm64 \
--gadget output/oemcodec-gadget-17.16.4-android-arm64.so \
--name oemcodec \
--port 27142 \
--package com.example.app \
--ndk build/android-ndk-r29 \
--report android-smoke-report.json
패키지는 테스트 권한이 부여된 설치된 Java 애플리케이션이어야 합니다.
하네스는 Frida 17에서 요구하는 명시적인
frida-java-bridge와 함께 test_comprehensive.js를 컴파일합니다. 서버와 Gadget은 각각
인증된 임의의 추상 UNIX 소켓에서 수신 대기하며, 이들의 호스트 TCP 포트는 ADB 포워드로만
존재하고 기기 TCP 리스너는 노출되지 않습니다. 하네스는 또한 Frida 자체의 프로세스 뷰
바깥에서 /proc/<pid>/mem을 통해 매핑된 에이전트 및 Gadget 이미지를 스캔하는
ABI 일치 루트 프로브를 컴파일합니다. 종료 시 프로세스, 포워드, 원격 테스트 디렉터리를
정리합니다. /proc 게이트는 레거시 linjector 파일 디스크립터 이름과 0이 아닌
TracerPid도 거부합니다.
Frida Gadget 구성은 라이브러리 옆에
lib<name>-gadget.config.so라는 이름으로 지정되어야 하며, 하네스가 이 파일을 생성하고
배포합니다.
python -m pip install --requirement requirements-dev.txt
npm ci --ignore-scripts
python -m pytest
ruff check .
ruff format --check .
mypy build.py patches.py namegen.py scripts
node --check test_comprehensive.js
bash -n build-wsl.sh
go run github.com/rhysd/actionlint/cmd/[email protected]
전체 증거 요구 사항은 CONTRIBUTING.md를 참조하세요.
build.py Clone, patch, compile, verify, and collect artifacts
patches.py Source and same-length binary transformations
namegen.py Seeded build-name and port generation
scripts/android_smoke.py Rooted Android Server/Gadget acceptance harness
test_comprehensive.js Structured Frida 17 Java bridge assertions
tests/ Unit, contract, fixture, and workflow tests
.github/workflows/ CI, CodeQL, reusable build, and release isolation
--temp-fixes는 런타임 동작을 변경하며 옵트인 방식으로 유지됩니다.--strict-wx는 Android 인젝터의 실행 코드를 쓰기 가능한 데이터 및 스택 페이지와 분리하고, Gum의 영구 RWX 코드 풀을 비활성화하며, GumJS NativeCallback 클로저 코드를 전용 RX 페이지에 배치하면서 libffi 저장소는 RW로 유지하고, 새로 생성된 코드를 RX로 확정합니다. 일치하는 원격 libc를 사용할 수 없는 경우 Android 인젝터는 업스트림 RWX 폴백을 사용하는 대신 폐쇄적으로 실패합니다. 이미 RWX였던 페이지는 보존하며, RWX 메모리에 대한 명시적 사용자 스크립트 요청을 거부하지 않습니다. 런타임 /proc/maps 샘플은 실행 코드가 패치되는 동안 일시적인 RWX 권한 변경이 발생하지 않음을 입증하지 않습니다.frida.Compiler를 사용하며, Frida REPL과 tracer는 자체 번들 브리지를 제공합니다.빌더 코드는 MIT 라이선스입니다. 생성된 바이너리는 업스트림 라이선스를 유지합니다. THIRD_PARTY_NOTICES.md를 참조하세요.