
TRANSFORMERS: Forged to Fight는 트랜스포머 유니버스에서 바로 나온 가장 카리스마 넘치는 전사들을 조종할 수 있는 3D 전투 게임입니다. 옵티머스 프라임, 메가트론, 범블비, 래칫, 사운드웨이브, 그라인더와 같은 큰 이름들이죠–그 이상도 아닙니다. 네, 제대로 읽으셨습니다. 어떤 트랜스포머 시리즈에서든 여러분이 좋아하는 캐릭터들
이 패키지는 Transformers: Forged to Fight의 작동하는 오프라인 부팅과 함께, 그 과정에 사용된 모든 도구, 패치, 리버스 엔지니어링 노트를 포함합니다. 이는 시간과 에너지를 들여 다음이자 훨씬 더 큰 단계인 게임 서버 측 콘텐츠를 처음부터 다시 구축하려는 사람을 위해 준비되었습니다. 여기에 있는 모든 것은 문서화되어 있어 제가 했던 것처럼 처음부터 시작할 필요가 없도록 했습니다.
무엇이든 건드리기 전에 이 파일 전체를 읽으십시오. 특히 "Gotchas" 섹션은 며칠을 절약해 줄 것입니다.
게임은 완전히 오프라인으로 부팅되며, 라이브 서버 없이 실제 대화형 홈 화면에 도달합니다. 홈 화면에서 메뉴는 충돌 없이 탐색됩니다: 기지, 봇 로스터(계정에 소유한 봇이 있음), 전투 모드 선택, 크리스탈 화면, 일반적인 팝업 및 팁. 전체 로그인 흐름이 완료되고, 모든 온라인 하위 시스템이 연결되며, 첫 경험 및 튜토리얼 게이트가 통과됩니다. 스크립트된 인트로 전투(Optimus 대 Starscream)는 전투 로딩을 시작하기에 충분히 진행되며, 3D 캐릭터 모델이 렌더링되고 애니메이션됩니다.
이것이 어려운 부분이었고 해결되었습니다. 클라이언트 자체가 오프라인에서 다시 살아났습니다.
실제 게임플레이는 작동하지 않습니다. 스토리에 미션이 표시되지 않으며, 전투가 완전히 로드되지 않습니다. 이것은 버그가 아니며 패치로 고칠 수 있는 것이 아닙니다.
Forged to Fight는 완전히 서버 주도적이었습니다. 휴대폰의 앱은 기본적으로 컨트롤이 있는 화면이었습니다. 게임에 관한 거의 모든 것이 앱 안에 있지 않았습니다. 모든 미션, 모든 전투, 모든 적 라인업, 전체 로스터의 능력치와 스킬, 경제, 모든 밸런스는 Kabam의 서버에 살아 있었고 세션마다 기기로 스트리밍되었습니다. 2020년 초 서버가 종료되었을 때 그 콘텐츠 데이터베이스도 함께 사라졌으며, 제가 도달할 수 있는 곳에 공개적으로 보관되지 않았습니다.
따라서 상황은 깔끔하게 두 가지로 나뉩니다. 아트와 오디오는 살아남았습니다. 왜냐하면 그것들은 앱 내부에 포함되어 있기 때문입니다(re_notes/ASSET_INVENTORY.txt 참조). 모든 캐릭터는 모델, 텍스처, 리그, 애니메이션 클립, 애니메이터 컨트롤러, 이펙트, 오디오를 담고 있는 완전한 Unity 에셋 번들입니다. 환경, 건물, UI, 초상화, 컷신, 대화도 모두 있습니다. 살아남지 못한 것은 게임에 어떤 에셋을 사용할지, 그것들을 전투나 미션으로 조립하는 방법, 그리고 각 봇의 수치가 실제로 무엇인지를 알려주는 데이터입니다. 모든 조각은 존재합니다. 그것들을 어떻게 조합해야 하는지 아는 것이 남아 있지 않을 뿐입니다. 그것을 재구축하는 것이 남은 전체 작업입니다.
네 가지 움직이는 부분이 있습니다. 함께 작동하여 수정되지 않은 게임이 Kabam과 통신하고 있다고 생각하게 만듭니다.
네이티브 바이너리 패치. 게임은 Unity IL2CPP이므로 로직은 편집 가능한 스크립트 파일이 아닌 컴파일된 ARM 라이브러리 libil2cpp.so에 있습니다. patches/patch_il2cpp.py는 해당 라이브러리의 여섯 가지 함수를 다시 작성하여 죽은 서버 검사를 우회합니다: 두 개의 인증서 고정 경로를 무력화하여 자체 TLS 인증서가 허용되도록 하고, 라이브 구성이 null임에도 매니저 등록 블록이 실행되도록 강제하며, 로컬 장치 세션으로 로그인이 성공하도록 하고, 그렇지 않으면 "로그인 실패" 대화상자를 표시할 하위 시스템 치명적 오류를 무음 처리합니다. 또한 단일 종속성 항목을 다시 주입하여( Gotchas 섹션 참조) 런타임 훅이 실제로 로드되도록 합니다. 출력은 libil2cpp.patched.so입니다.
가짜 Sparx 서버. server/fakeserver.py는 Kabam의 백엔드를 대신합니다. TLS 443 및 일반 HTTP 80에서 수신 대기하며 게임의 API 호출에 응답합니다. 캔 응답은 server/responses/에 있으며, 엔드포인트당 하나의 파일로, 메서드와 경로로 이름이 지정됩니다(예: GET__account_data.json). 몇몇 엔드포인트는 파일이 아닌 코드에서 동적으로 응답합니다. 게임이 요청의 값을 에코할 것으로 예상하기 때문입니다(튜토리얼 엔드포인트 및 영웅 상세 엔드포인트). 응답 봉투는 {"error":null,"result": ...}입니다. Sparx 오류 페이로드 내부에서 필드는 err로 철자되며 error가 아닙니다. 이 세부 사항은 중요하며 놓치기 쉽습니다.
네이티브 런타임 훅. tools/nativehook/는 libdothook.so를 빌드합니다. 이는 게임 시작 시 로드되어 게임이 읽는 모든 데이터 키와 몇 가지 대상 동작 미세 조정을 기록하는 작은 라이브러리입니다. 이것은 다른 모든 것을 가능하게 만든 피드백 루프입니다: 게임이 정확히 무엇을 요청하는지 알려주어 응답을 합성하고 확인할 수 있게 합니다. 실행 전에 설치된 순수 바이트 덮어쓰기 인라인 훅입니다. 일반적인 도구(Frida)는 에뮬레이터의 ARM 변환 계층 아래에서 충돌하기 때문입니다.
런타임 데이터 흐름은 다음과 같습니다: 게임이 Kabam 도메인에 HTTPS 호출을 하고, 호스트 파일이 이를 PC로 보내며, 가짜 서버가 server/responses/의 응답으로 응답하고, 패치된 라이브러리가 인증서와 응답을 수락하며, 훅이 읽은 내용을 기록합니다. 이 루프를 통해 이 빌드의 모든 화면이 올라왔습니다.
README.md 이 파일
TECHNICAL_NOTES.md 더 깊은 기술 참조: 패치, 복구된 데이터 형태, 발견 사항
patches/
patch_il2cpp.py 여섯 가지 네이티브 패치 + 종속성 재주입
disasm_fn.py 도우미: 오프셋에서 함수 분해
find_callers.py 도우미: 함수 호출자 찾기
find_str_ref.py 도우미: 문자열 참조 찾기
server/
fakeserver.py 가짜 Sparx 서버
gen_certs.sh TLS 인증서 및 CA 재생성 (실행, 아래 참조)
setup_device.sh 기기 측 네트워크 및 신뢰 설정 참조
iterate.sh 빠른 재시작 및 캡처 루프
responses/ 게임이 호출하는 엔드포인트당 하나의 JSON 파일
tools/
provision_ldplayer.sh 에뮬레이터를 작업 상태로 한 번에 재프로비저닝
setup_arm64.sh 툴체인 설정 노트
decompile_targets.py 선택된 오프셋에서 Ghidra 헤드리스 디컴파일러 구동
find_xrefs.py 바이너리 전체 교차 참조 검색
apply_labels.py IL2CPP 심볼 레이블 적용
light_analyze.py 경량 정적 분석 도우미
frida_attach.py Frida 도우미 (참고용 보관, libnb 참고 참조)
frida_run.py
hook_dot.js
nativehook/
hook.c libdothook.so의 소스, 런타임 훅
libdothook.so 사전 빌드된 훅, arm64
deploy.sh 훅 빌드 및 배포
relaunch_and_capture.sh 게임 재실행 및 로그 캡처
hook/dothook.c 이전 훅 변형, 참고용 보관
re_notes/
dump.cs 전체 IL2CPP 덤프: 게임의 모든 클래스, 메서드, 필드
decomp_out.c 주요 함수의 디컴파일된 본문
decompile_targets.txt 디컴파일할 가치가 있는 오프셋
ASSET_INVENTORY.txt 앱 내에 이미 포함된 아트 및 오디오 목록
re_notes/dump.cs는 남은 작업을 위해 가장 가치 있는 단일 파일입니다. 이는 게임의 완전한 타입 모델입니다: 모든 클래스, 모든 메서드, 그리고 결정적으로 클라이언트가 서버에서 읽는 모든 데이터 필드. 이는 전체 백엔드 API의 지도입니다. 응답의 형태가 무엇이어야 하는지 알아야 할 때, 답은 여기에 있습니다.
다음은 의도적으로 제외되었습니다. 크기가 크거나, 저작권이 있거나, 비밀이거나, 직접 생성해야 하기 때문입니다.
com.kabam.bigrobot, 버전 9.2.0). 약 800 MB입니다. 자신의 사본을 구하십시오. 패키지 이름과 버전은 TECHNICAL_NOTES.md에 있습니다.libil2cpp.so 및 게임 에셋. 둘 다 APK에서 직접 추출됩니다. APK의 압축을 풀면 라이브러리는 lib/arm64-v8a/ 아래에, 에셋은 assets/ 아래에 있습니다.server/gen_certs.sh를 실행하여 자신의 쌍을 만든 다음 기기 신뢰 저장소를 새 CA로 지정하십시오.libil2cpp.so에 대해 patches/patch_il2cpp.py를 실행하십시오.re_notes/dump.cs를 생성한 도구입니다.ARM 변환 가능 에뮬레이터(LDPlayer 9 사용, 루트 및 쓰기 가능한 시스템 필요)에 APK가 설치되어 있고, PC에 Python이 있으며, 위 섹션의 항목들이 필요합니다.
bash server/gen_certs.sh.python patches/patch_il2cpp.py path/to/original/libil2cpp.so --apply.tools/nativehook/deploy.sh 참조.python server/fakeserver.py. 에뮬레이터에서 포트 443 및 80에 접근 가능해야 합니다.bash tools/provision_ldplayer.sh <your-PC-LAN-IP>. 에뮬레이터 재부팅 후 매번 다시 실행하십시오.로그인에서 멈추면 Gotchas 섹션의 첫 번째 항목을 먼저 확인하십시오.
이것들은 저에게 시간을 소모하게 만든 것들입니다. 여러분도 같은 일을 겪지 않도록 기록해 둡니다.
libdothook.so를 참조하는지입니다. 정확한 바이트와 오프셋은 패치 스크립트와 TECHNICAL_NOTES.md에 문서화되어 있습니다.provision_ldplayer.sh를 다시 실행하지 않으면 아무것도 연결되지 않습니다.err이며 error가 아닙니다. 잘못된 것을 사용하면 클라이언트가 조용히 무시하거나 잘못 처리하는 응답이 생성됩니다.이것이 진짜 작업이며 규모가 큽니다. 그 형태와 시작점은 다음과 같습니다.
목표는 이전에 클라이언트로 스트리밍되던 서버 측 콘텐츠를 수동으로 재생성하는 것입니다: 퀘스트와 미션, 맵과 적 라인업, 각 봇의 능력치와 스킬이 포함된 전체 로스터, 전투 공식, 경제. 이 중 어느 것도 더 이상 존재하지 않으므로, 모든 것이 클라이언트가 예상하는 정확한 형태로 새롭게 작성되어야 합니다.
작동하는 방법은 이 프로젝트가 기반으로 하는 루프입니다. 훅이 연결된 상태로 게임을 실행하십시오. 훅은 클라이언트가 읽는 모든 키를 기록합니다. 클라이언트가 제공하지 않은 것을 요청하면 정확히 무엇을 원했는지 볼 수 있습니다. 그런 다음 올바른 형태의 응답을 합성하여 server/responses/에 넣거나 fakeserver.py의 동적 핸들러에 추가하고, 다시 시작한 후 클라이언트가 이를 수락하고 진행하는지 확인하십시오. 반복하십시오. 현재 빌드의 모든 화면이 정확히 이 방식으로 올라왔습니다. re_notes/dump.cs는 실행 전에 각 구조의 형태를 알려줍니다. 클라이언트가 읽는 모든 필드를 나열하기 때문입니다.
공격하기에 합리적인 순서:
decompile_targets.py 사용) 정확한 필드를 읽어내십시오.ASSET_INVENTORY.txt에 나열된 번들에 존재하므로, 숫자와 스킬 정의만 작성하면 되고 에셋은 필요하지 않습니다.TECHNICAL_NOTES.md를 참조하십시오.규모에 대해 현실적이어야 합니다. 팬들이 종료 전에 라이브 서버 데이터를 저장한 게임조차도 개인 서버를 세우는 것은 긴 프로젝트입니다. 여기에는 시작할 저장된 데이터가 없으므로, 모든 숫자와 모든 스킬은 조사되거나 재발명된 후 클라이언트에 대해 검증되어야 합니다. 진정한 게임을 목표로 한다면 이것은 여러 명이 여러 해 동안 해야 하는 작업입니다. 하지만 길은 더 이상 미스터리가 아닙니다. 부팅은 해결되었고, 피드백 루프가 존재하며, 타입 모델은 덤프되었고, 에셋은 온전합니다. 남은 것은 매우 많은 양의 신중한 데이터 재구성일 뿐, 더 이상 알려지지 않은 리버스 엔지니어링이 아닙니다.
TECHNICAL_NOTES.md부터 시작하십시오. 이 README보다 더 자세한 정확한 패치, 복구된 데이터 형태, 특정 발견 사항이 담긴 더 깊은 기술 참조입니다. 그런 다음 루프를 실행하십시오.
행운을 빕니다. 이제 진짜 기계입니다. 콘텐츠가 재구축되기만 하면 됩니다.
기기 배선. 에뮬레이터는 Kabam의 도메인을 PC로 보내고 가짜 인증서를 신뢰해야 합니다. tools/provision_ldplayer.sh는 한 번에 이 작업을 수행합니다: 패치된 라이브러리와 훅을 푸시하고, 호스트 파일을 통해 Kabam 호스트 이름을 PC의 LAN 주소로 리디렉션하며, 가짜 CA를 시스템 신뢰 저장소에 마운트하고 SELinux를 완화합니다. 에뮬레이터를 다시 시작할 때마다 실행하십시오. 이러한 마운트는 재부팅 후에도 유지되지 않기 때문입니다.