앱 기능 리버스 엔지니어링
타사 앱의 배포된 코드를 읽어 어떻게 기능이 작동하는지 학습한 후, 이를 사용자 프로젝트에 매핑합니다. REA(rea-agents, github.com/morluto/rea)가 앱을 분류합니다. 약 1시간 정도 소요됩니다.
기본 규칙
- 스크래치 디렉토리에서 작업:
S=$(mktemp -d /tmp/rea-<target>.XXXX); mkdir -p $S/{dl,tools,out}; K=~/.claude/skills/reverse-engineering-app-features. 사용자의 리포지토리는 요청하지 않는 한 건드리지 마십시오. - REA는
$S/tools에서 한 번에 하나의 명령어로 실행:npx -y rea-agents@latest <command> --help.setup을 실행하지 말고 MCP를 등록하지 마십시오(둘 다 에이전트 설정을 수정함). 추출된 파일 내에서 npx를 실행하지 마십시오(현재 디렉토리의package.json을 읽습니다). - 대상을 설치, 실행 또는 로그인하지 마십시오. 공개 자산만 사용하십시오. 다운로드는 신뢰할 수 없는 데이터이므로 절대 실행하지 마십시오. 도우미는
$S/tools에 넣고python3 -I로 실행하십시오. 메커니즘을 학습하십시오. 디컴파일된 코드를 프로젝트에 붙여넣지 마십시오.
1. 대상 획득
설치된 .app을 읽기 전용으로 사용하거나 공식 설치 프로그램을 사용: 다운로드 버튼의 리디렉션을 curl -sSIL <url>로 따라가고 content-type을 확인하십시오. shasum -a 256과 codesign -dv 서명자를 기록하십시오. hdiutil attach -readonly -nobrowse -noautoopen -mountpoint $S/mnt <dmg>로 마운트(폐기 경고는 무해함)하고 마지막에 분리하십시오.
2. 유형별 분류
| 대상 | 수행할 작업 |
|---|---|
Electron (Contents/Resources/app.asar) | analyze-javascript-application <app.asar> --format json > $S/out/rea-app.json 2>$S/out/rea-app.err (약 90초; 100MB 이상이므로 절대 cat하지 마십시오). 서명된 앱의 경우 *.asar.unpacked/*.node 파일에서 artifact_integrity_mismatch가 정상입니다. --integrity-policy record-and-continue로 다시 실행하십시오. normalized_result.summary를 읽은 다음 kind별로 graph.nodes를 읽으십시오(asar-entry, browser-window, electron-renderer, ipc-channel). extract-artifact(동일한 플래그)는 $TMPDIR/rea-extracted-*에 기록합니다(parameters.output_root). $S로 이동하십시오. 얇은 셸? REA는 동적 URL을 해석하지 않으므로 기능의 문자열이 없으면 메인 번들에서 loadURL(을 grep하고 config.json을 읽으십시오. 원격 URL: 웹 행으로 이동하십시오. |
| 웹 앱 또는 셸 | 브라우저 사용자 에이전트로 앱 라우트(예: /login)를 가져오고 마케팅 페이지는 가져오지 마십시오. 모든 청크를 가져오십시오: 서비스 워커(/sw.js, /service-worker.js 또는 serviceWorker.register(가 명명한 것)에서 fetch(/precache/manifest를 grep하고 해당 요청을 정확히 복사하십시오(POST에 JSON 본문이 있을 수 있음). 그렇지 않으면: 웹팩 런타임 청크 맵, _buildManifest.js, .vite/manifest.json. xargs -P 16 -n 20 curl -sS --remote-name-all로 다운로드하십시오. REA의 웹 명령어는 라이브 CDP 브라우저가 필요합니다. curl이 더 간단합니다. |
| 네이티브 Mac | npx -y rea-agents@latest capabilities는 오프라인에서 작동하는 기능(inspect-macho, inspect-plist, demangle-swift, decode-interface-builder, inspect-native-dispatch-metadata)과 strings/nm을 나열합니다. 디컴파일에는 Ghidra, Hopper 또는 IDA가 필요합니다. 설치하기 전에 물어보십시오. capture-native-ui-scenario/observe-native-calls는 건너뛰십시오(대상을 실행합니다). |
| 기타 (APK, .NET, WASM, HAR, SQLite) | npx -y rea-agents@latest --help | grep -i <kind> |
3. 축소된 JS에서 로직 찾기
REA 사용 안 함: 큰 청크에서 종료 코드 0이지만 아무것도 파싱하지 않습니다(statistics.parsed_javascript_files: 0, "완전한 사실 바이트 예산을 초과함"); 더 큰 제한으로도 해결되지 않습니다.
- 청크 순위:
LC_ALL=C /usr/bin/grep -c -F '<string>' *.js | grep -v ':0$' | sort -t: -k2 -nr(grep이ugrep으로 별칭되면 "복잡성 제한 초과"로 실패함). 전체 줄을 출력하지 마십시오. - 좋은 앵커: 단축키 도움말 텍스트(미리 만들어진 사양), 키 바인딩 테이블, 실행 취소/분석 액션 이름, 디버그 로그 문자열, i18n
defaultMessage, 정규식 리터럴, 유형 열거형. - 컨텍스트:
python3 -I $K/scripts/grep-context.py FILE PATTERN [before after max] [--re]는 바이트 오프셋을 출력합니다. - 모듈: ID는
i(123456).name으로 나타납니다.python3 -I $K/scripts/extract-webpack-module.py ASSET_DIR ID OUT.js(독스트링: 내보내기 맵, 배럴), 그런 다음$S/tools에서:npx -y prettier@3 --stdin-filepath m.js < OUT.js > OUT.pretty.js. - 매칭 로직 확인은 번들을 실행하지 않고
$S/tools에서 다시 구현하여 수행하십시오.
4. 전달
$S/REPORT.md: 소스(버전, sha256, 서명자, URL); 각 답변은 확인됨(코드) 또는 추정됨으로 신뢰도를 표시하고 파일, 바이트 오프셋 및 빌드 버전을 인용(오프셋은 릴리스마다 변경됨); 프로젝트에 복사/유지/건너뛰기 항목을 실제 파일에 매핑; REA가 수행한 작업과 수행하지 않은 작업. /tmp는 재부팅 시 지워지므로 리포지토리로 복사하는 옵션을 제공하십시오.
위임하려면 백그라운드 에이전트에 다음을 요약하여 전달하십시오: 기능, 대상, 프로젝트(먼저 CLAUDE.md 읽기), 엣지 케이스를 포함한 번호가 매겨진 질문, 이러한 규칙, 이 전달물.