English · 简体中文
Capabilities · Structure · Install · Requirements · Failure catalogue · Scope · Maintenance · Disclaimer
apk-reverse
Android APK 리버스 엔지니어링, 디블로팅, 광고 제거, 정밀 dex 패칭, 리패킹, 런타임/서버 분석을 위한 Agent Skill입니다.
이것은 스킬이지 튜토리얼이 아닙니다: 에이전트(Claude Code, Codex, 또는 Agent Skills 형식을 지원하는 모든 하네스)가 작업하는 동안 로드하도록 작성되었기 때문에 점진적 공개를 위해 구성되어 있습니다 — 짧고 의사결정 중심의 SKILL.md, 특정 단계에서 필요할 때만 로드되는 상세 참조 문서, 그리고 직접 실행할 수 있는 매개변수화된 스크립트입니다.
에이전트가 이것을 어떻게 소비해야 하는가
SKILL.md는 조언이 아니라 게이트가 있는 절차로 의도적으로 작성되었습니다. 관찰된 실패 양상은 무지가 아니라 — 모델이 전체를 읽고, 이에 동의한 다음, 어쨌든 제1원리로부터 추론하는 것이기 때문입니다.
따라서 본문에는 읽는 것이 아니라 행동으로 옮겨야 하는 네 가지가 있습니다:
- 네 가지 재정의 규칙 (R1–R4). 현재 계획과 충돌할 경우, 증거가 이를 뒤집을 때까지 이 규칙이 우선합니다.
- 증상 색인. 각 행은 이미 대가를 치른 실패입니다. 일치하는 행은 정지 신호입니다: 몇 번 더 시도한 후가 아니라, 다른 명령을 실행하기 전에 해당 파일을 로드하십시오. 알려진 증상을 지나쳐 추론하는 것이 바로 같은 시간을 두 번 쓰는 방식입니다.
- 네 가지 게이트 (G1–G4), 각각 통과 기준이 있는 행동입니다. "개념을 이해했다"는 게이트를 통과하지 못합니다. 이들은 분류, 환경 진실, 그리고 대조 빌드가 첫 번째 패치 전에 일어나도록 존재하며, 세 번째 실패 후가 아닙니다.
- 2회 실패 규칙과 정지 조건. 같은 형태의 실패가 두 번이면 모델이 잘못된 것이지 매개변수가 잘못된 것이 아닙니다. 이미 두 번 실패한 가설의 세 번째 변형은 라운드가 죽는 곳입니다.
그리고 마지막에 보류해야 하는 한 가지: **"완료"**에는 정의(여섯 항목)가 있습니다. 깨끗한 로그는 그중 하나가 아닙니다. 여섯 가지 모두에 미치지 못하는 것은 체크포인트이며, 남은 것이 무엇인지와 함께 체크포인트로 보고해야 합니다.
만약 당신이 이것을 읽고 있는 에이전트라면: 가장 저렴한 첫 번째 명령은
python skills/apk-reverse/scripts/doctor.py입니다. 이것은 여기에 어떤 도구가 존재하는지, 어떤 스크립트가 실제로 실행될 수 있는지, 그리고 환경의 무언가가 이미 당신의 측정을 오염시키고 있는지 알려줍니다.
잘하는 것
- 서버에 의해 강제되는 페이월에 몇 시간을 태우는 대신, 요청이 클라이언트 측에서 애초에 달성 가능한지 빠르게 판단합니다.
- 작업을 시작하기 전에 산출물이 어떤 형태여야 하는지 결정합니다 — 루팅되지 않은 자체 포함 아티팩트는 "이 머신에서 작동하게 만들기"와는 다른 문제이며, 이 둘을 혼동하는 것이 이 영역에서 가장 비용이 큰 표류입니다.
- 주어진 변경에 대해 가장 안전한 패치 계층을 선택하고, 앱을 망가뜨리는 계층을 피합니다.
- 성공처럼 보이는 리패킹 실패를 잡아냅니다: 앱이 설치되고, 실행되고, 완벽하게 렌더링되지만 모든 서명된 요청이 거부되는 경우 — 클라이언트가 자체 서명 인증서에서 요청 서명 키를 도출하기 때문입니다.
- 당신 자신의 실수와 앱 또는 서버의 문제를 분리합니다 — 기능 범위의 실패(로그인, 등록, 결제)는 종종 방금 만든 패치의 결과가 아니라 하나의 코드 경로에서의 TLS/인증서 문제입니다. 기기 상태, 죽은 기기 서버, 시계 드리프트도 같은 방식으로 위장합니다.
- 매니페스트가 제공하는 것 또는 기기가 주장하는 것을 신뢰하는 대신, 어떤 아키텍처와 어떤 라이브러리가 실제로 실행되고 있는지 확립합니다.
- 패킹/하드닝된 대상을 처리합니다: 패커 식별, 언패킹, 그리고 메모리 덤프를 다시 패치된 설치 가능한 APK로 변환합니다.
- 의도적으로 프로세스를 종료하는 하드닝된 라이브러리를 처리합니다 — 평범한 널 역참조 버그처럼 보이는 의도적 크래시 형태(
fault addr 0x4)와, 수정이 작동하는지 아니면 원인과 전혀 닮지 않은 방식으로 전체 앱을 멈추게 하는지를 결정하는 "무력화하되, 절대 반환하지 않게 만들어서는 안 된다" 규칙을 포함합니다.
- 어떤 도구를 사용해야 하고 각각이 어디에서 거짓말하는지 파악합니다 — GUI로만 존재하는 도구를 포함하여, 더 약한 방법으로 조용히 대체하는 대신 사람을 요청합니다.
- 패치된 빌드가 패치된 상태로 유지되게 합니다: 버전 검사, 강제 업그레이드 대화상자, 자체 업데이트 설치 프로그램을 무력화하여 작업이 원격으로 꺼지지 않도록 — 그리고 버전 변경 없이 조용히 이를 되돌릴 수 있는 핫 업데이트/원격 구성 채널을 인식합니다.
- 클라이언트 측 로그인 게이트(패치 가능)와 계정 범위 리소스(서버가 응답할 것이 없어 비어 있음)를 분리하고, 세션을 위조하는 것이 로그아웃된 것보다 더 나쁜 상태를 만든다는 것을 압니다.
- 장기 작업을 정직하게 유지합니다: 실시간 기록, 등급이 매겨진 결론, 보정된 타임아웃, 제한된 대기 — 진행 상황이 손실되지 않고 같은 실수가 두 번 반복되지 않도록 합니다.
- 완벽하게 빌드되고 런타임에 죽는 APK를 만들어내는 특정 실수를 피합니다.
- APK가 선택지가 아닐 때 산출물이 무엇이어야 하는지 결정합니다 — 여러 독립적 검사에 의해 거부된 리패킹은 비용이 많이 드는 것이 아니라 차단된 것이며, 대체 사다리는 시스템 수준 모듈, 로컬 RPC 서비스, 또는 경계가 명시된 정직한 보고서입니다.
- 실제 메모리 덤프와 추출 셸 골격을 구별하고, 어떤 복구 경로가 적용되는지 압니다 —
frida 자체가 거부될 때의 루트 측 덤프를 포함합니다. 측정이 무엇을 볼 수 있고 볼 수 없는지는 skills/apk-reverse/references/advanced-unpacking.md에 있습니다.
- 리버싱이 호출보다 더 많은 비용이 들 때 리버싱 대신 루틴을 호출합니다: 호스트에서의 에뮬레이션 실행, 또는 Frida RPC를 통해 서비스화된 라이브 함수.
- OLLVM에 의해 네이티브 함수가 상태 머신으로 평탄화되었을 때 명령어 수준 실행 증거를 읽습니다 — 실제 기기에서 Stalker가 역효과를 낸 것으로 측정된 두 가지 방식을 포함합니다.
- 사용자 공간 후킹이 검사에 전혀 도달할 수 없을 때(원시
svc 시스템 콜, init_array 초기 감지)를 인식하고, 위아래 다음 계층이 실제로 무엇을 할 수 있는지, 그리고 에스컬레이션이 잘못된 답인 경우를 압니다.
- REST가 아닌 프로토콜 — 스키마 없는 protobuf, gRPC, QUIC/HTTP3 — 과 시스템 신뢰 저장소를 무시하는 네이티브 측 인증서 피닝을 다룹니다.
- 폰 자체에서 작업합니다: MT Manager의 편집/리패킹/서명 흐름과 APK MCP 표면, LSPosed Manager, 온디바이스 데이터 검사 — PC 툴체인을 대신하는 것이 아니라 그와 함께 사용합니다.
- 프로세스 수명 중 어느 시점에도 존재하지 않는 복호화된 DEX를 찾아 몇 시간을 허비하기 전에 Java2C와 추출 셸을 구별합니다 — 코드는
.so로 컴파일되었습니다.
- 분할 APK / App Bundle 세트로 도착하는 빌드를 처리합니다: 기기에서 세트를 읽고,
pm install-multiple을 위해 모든 멤버에 하나의 키스토어로 서명하거나, 합법적일 때 코드/네이티브 멤버를 독립 실행형 APK로 병합합니다.
- 알려진 평문 차분을 사용하여 실제 Dex VMP를 다룹니다 — 어떤 링크가 자동화될 수 있고 어떤 것이 안 되는지, 컴파일된 픽스처가 무엇에 도달할 수 있고 없는지, 그리고 파생된 프라이빗 옵코드 테이블을 주장하는 대신 어떻게 증명하는지.
- 대상을 게시하지 않고 배운 것을 게시합니다 — 컨텍스트와 함께 아이덴티티 형태를 보고하는 스캐너, 반드시 삭제해서는 안 되는 것들의 명시적 목록(도구, 라이브러리, 프로토콜 필드, CVE, 하드닝 제품, 공개 크랙미) — 그것들을 삭제하면 재사용 가능한 부분이 파괴되기 때문입니다 — 그리고 커밋을 게이트하는 종료 코드.
- 이 저장소가 이미 수렴한 작업을 반복하기 전에 선례를 읽습니다: 기록의 긍정적인 절반, 막다른 길을 포함한 경로, 모든 주장에 대한 등급, 그리고 사례가 다시 작성하라고 말하는 파일들.
구조