디시인사이드 갤러리

마이너 갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

[공략/팁] 월드플리퍼 에셋/데이터 추출하는법 (클뜯/데이터마이닝) - 1

나솜갤로그로 이동합니다. 2021.12.28 06:20:36
조회 4901 추천 61 댓글 40
														

디코에서 클뜯해주던 사람이 겜을 반쯤 접어서 클뜯하는 사람이 없어진김에


직접 클뜯 해볼건데 이걸 패치때마다 하기에는 내가 글섭을 잘 안해서


클뜯 하고싶은사람 참고하라고 문서로 방법 정리해봄


클뜯 방법상 주기적으로 클뜯하려면 일정 이상의 프로그래밍 지식은 필요한 점 참고


나는 다른 게임 클뜯을 해본 경험이 거의 없어서 아래 클뜯 관련 서술중에는 잘못된 부분이 있을 수 있는 점도 참고



0. 와후리 클뜯 개론


일단 직접 클뜯 하면서 느낀점으로 와후리는 클뜯을 아주 좃같이 만드는 세가지 특징을 가지고 있음


클뜯 방법 설명에 앞서 이 세가지 요소에 대해 먼저 짚고 넘어갈건데 별로 안궁금한 사람은 1번으로 스킵해도 됨


0-1. 독자규격


월플은 플래시 게임


우리가 아는 그 플래시 게임 말하는거 맞냐하면 맞음. SWF 파일 확장자로 사용하는 바로 그 플래시!!!


그러다보니 일반적인 유니티 게임이랑은 데이터 언패킹하는 방식 자체가 완전 다름. 거의 동일한 포맷으로 패킹이 이뤄지는(뇌피셜) 유니티 게임들과 다르게 얘네는 시테일에서 플래시를 갖고 만든 자체 규격으로 모든 데이터를 처리하기 때문..


특히 스프라이트나 애니메이션 등은 완전 자체규격인 flatomo라는 엔진을 사용하기땜시 다른 어디서도 레퍼런스를 찾을 수 없음


그래서 다른 게임 언패킹하다가 온 사람들도 월플 클뜯하는건 좀 난감했을거임 (이거도 뇌피셜)


그렇지만 근본이 플래시인지라 나름 obfuscation한다고 이리저리 데이터를 숨겨놔도 결국 데이터 복호화하는 알고리즘이 swf 파일 안에 담겨 있을 수 밖에 없어서


해당 부분만 잘 캐치할 수 있으면 클뜯하는거 자체가 그리 어렵지는 않음


0-2. 짜증나게 난독화된 에셋


월플은 에셋 데이터로 사용하는 파일들에 2가지 레이어의 난독화를 사용하고 있음..


첫번째는 파일 이름을 임의의 Salt 값(다행히도 고정. 하드코딩 되어 있음)과 함께 SHA-1 해쉬로 저장하는 것


따라서 에셋 파일의 이름만 보고는 이게 어떤 파일인지 절대 알수가 없음. 파일 > 파일 복호화 수순으로 접근하는게 불가능하고, 어딘가에 존재하는 파일의 원 제목을 먼저 찾아서, 해쉬를 생성하는 알고리즘에 넣고 돌려서 나온 해쉬 이름으로 파일을 추적하여 해당 파일의 원래 제목을 알아내야만 함


따라서 에셋 파일의 제목을 복구하는 과정은


어딘가에 저장된 원 파일명을 획득 > 해당 파일명을 정해진 해싱 알고리즘으로 해쉬로 변환 > 해당 해시와 일치하는 파일을 원 파일명으로 복구해 저장


이렇게 됨. 원 파일명을 획득하는 방법은 두가지, 디컴파일한 swf에서 해당 파일이 직접 사용된 스크립트(매핑하여 사용하는 스크립트도 많아서 한계점이 있음)에서 이름을 추출하거나


나중에 설명할 master table이라는 파일 매핑을 담은 일종의 메타데이터 파일을 분석하는 것


거의 모든 파일은 후자를 참고하여 복구하게 됨


두번째는 저런 식으로 획득한 파일 자체도 바이너리 데이터가 변조되어 있는 것


이 변조된 바이너리를 복구하는 방법은 각 파일의 포맷별로 다른데 이는 아래에서 설명할 것임.. 다행히 이건 포맷별로 일정한 메타데이터 부분의 바이너리를 망가뜨려놓는 방식이라 망가진 바이너리를 원래대로 돌려주기만 하면 됨


0-3. 많은 에셋 개수와 일부 알아먹기 힘든 포맷 파일들


근데 이런 식으로 복구해야 하는 파일 갯수가 저번 패치 기준으로 대략 5만개


한번 패치에 업로드되는 png 에셋 개수만해도 수백~천개인데 도트 스프라이트를 적절하게 분리하는데 필요한 atlas3 확장자 파일 등은 귀찮아서 분석도 안해봄..


문제는 이게 2번이랑 맞물려서 업데이트가 될 때 마다


플래시 파일 다시 디컴파일 > 다운로드된 에셋 풀 덤프 이후에


1. 모든 에셋을 다시 추출하거나

2. delta를 비교하는 알고리즘을 짜서 개중에 변환되거나 추가된 값만을 선택적으로 추출하거나

3. 네트워크에 mitm등의 프록시 레이어를 설정하여 업데이트시에 받아오는 데이터 패킷을 스니핑하여 delta만 골라서 추출


이렇게 되야 하는데 셋다 여간 귀찮은 일이 아님.


위 사항들을 염두에 두고, 이 아래 부분 부터는 일정 수준의 프로그래밍 기반 지식은 있어야 향후에도 적용하고 따라할 수 있을거임



1. 준비물


- nox emulator (일섭 패킹이 하고싶으면 에뮬이 안되니 실 기기 필요 + 아래에서 에뮬로 진행하는 부분을 실기기에서 진행할 수 있을 정도의 상식 필요)


녹스 설치법은 다 알거임. 설치하고 루트 권한 켜주고 월플 설치 + 업데이트 전부 진행


- Android sdk platform tools (ADB 사용 위해 필요) https://developer.android.com/studio/releases/platform-tools?hl=ko


환경변수 설정하는거까지 여기서 다 따라해 https://ddbobd.tistory.com/entry/adb%EC%9C%88%EB%8F%84%EC%9A%B0%EC%97%90-adb-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0


- FFDEC (swf decompiler) https://github.com/jindrapetrik/jpexs-decompiler/releases/tag/version15.0.0


들어가서 window installer 다운받고 설치하면 끝



- node.js 혹은 프로그래밍 지식 및 노드가 아닌 특정 언어로 내가 아래에서 작성할 간단한 스크립트를 변환하여 작성할 수 있을 정도의 능력


0번에서 언급했듯이 패킹 규격이 독자 규격이라 언패킹 툴 따위가 존재하지 않기 때문에 우리가 알아낸 정보를 바탕으로 직접 언패킹 스크립트를 작성해 주어야만 함.


강의에서는 node.js를 사용할거임 https://nodejs.org/ko/


2. 안드로이드에서 필요한 파일들 가져오기


클뜯을 위해서는


a. 월드플리퍼 설치 APK 파일


b. 게임 내에서 따로 다운로드하는 에셋 파일들


두 가지가 필요해


a. APK 파일


우선은 APK 파일 추출하는건 녹스에 자체 기능이 있으니


a04424ad2c06782ab47e5a67ee91766dc28af1edd1acc7c0bf11d6c359d2d621570a62de9988264a049ff09c9f81


위처럼 앱 꾹 눌러서 추출 버튼 누르면 알아서 APK 저장된 폴더 열어줄거임. 해당 APK 파일을 어딘가에 복사해서 확장자명을 .zip으로 변경하고 압축 해제


우리가 원하는건 assets 폴더 들어있는 worldflipper_android_release.swf 파일이니 참고


b. 다운로드한 에셋 파일들


adb 연결 할줄 아는 사람들은 그냥 녹스 인스턴스에 adb 연결해서 쉘 접속해 주면 됨


모르면 아래 따라하거나 따라해도 안되면 adb connect nox emulator 등의 키워드로 구글에 검색해서 본인 환경에 맞게 adb shell에 접속해주면 됨


b.1 - 윈도우키 + R 눌러서 실행 창에 cmd 입력


b.2 - 명령 프롬프트에 adb devices 입력, 620xx로 시작하는 포트에 디바이스 연결되어 있을 경우 b.3 건너뛰고 b.4로 진행


b.3 - (발견된 devices가 없을 경우)
adb connect 127.0.0.1:62001

입력

adb connect 127.0.0.1:62025

입력


보통은 위 두가지 중에 하나로 해결될건데 두 포트 모두 연결 안될 경우에는 현재 실행중인 녹스 인스턴스가 어떤 포트로 리스닝중인지 알아내야함. netstat과 pid 적절하게 사용해서 알아서 하면 됨..


b.4 - adb shell 입력


이제 beyond1q:/ # 따위로 시작하는 쉘 프롬프트에 접속될거임. 에셋 파일 경로는 적당히 잘 알아서 확인하면 되는데 나같은 경우는 그냥 알고있는 해시 파일 이름 하나가 있어서 그걸로 서치 돌림. 참고로 에셋 파일들 저장 경로에는 항상 download/production/upload 경로를 가진 파일이 있으니 이런 경로로 서치해서 찾아도 되고 본인 재량껏 찾으면 됨


find . -name "*4d576b424178c5b2b253a2dd5aa3d78fa74ef3*" 입력


주르륵 나오는 결과값중에 아래와 같은 결과가 있을거임

./data/data/com.k@aogames.wdfp/com.k@kao

games.wdfp/Local Store/asset_download/production---latest/download/production/upload/6d/4d576b424178c5b2b253a2dd5aa3d78fa74ef3


여기서

/data/data/com.k@kaogames.wdfp/com.k@kaogames.wdfp/Local Store/asset_download/

가 에셋 최상위 폴더임. 해당 폴더를 녹스의 공유 폴더로 복사해서 피씨로 옮겨주자.


cp -a /data/data/com.k@kaogames.wdfp/com.k@kaogames.wdfp/Local Store/asset_download/. /storage/emulated/0/Pictures/ 입력


(당연히 pull 명령어로 바로 직접 복사해도 상관 없음. 난 이렇게 함)


파일 갯수도 많고 용량도 커서 전부 복사하기까지 시간이 걸리니 다 될때까지 조금 기다려야함


a04424ad2c06782ab47e5a67ee91766dc28af1edd1acc7c0bf11d6c25cd3de21229939339761fcd245177ea30d03


녹스에서 저 두가지 버튼 누르면 파일 탐색기에서 해당 경로가 열림


a04424ad2c06782ab47e5a67ee91766dc28af1edd1acc7c0bf11d6c253d3d42183f40f1cb4178ff91a3d0b2263


이런 폴더가 복사됐으면 성공


3. swf 디컴파일


FFDEC를 실행하여 2.a 에서 추출한 worldflipper_android_release.swf 파일을 열어 줌


용량이 어느정도 되니 reading swf 100%에서 오래 걸려도 기다리면 진행됨


디컴파일이 완료되고 나면 내용물과 FLA를 저장해서 vscode등의 원하는 편집기로 열어도 되고 FFDEC에서 직접 진행해도 됨


어차피 스크립트에 파일 넣고 돌릴거라 파일만 필요하니 일단은 FLA는 어딘가에 저장하도록 함


4. orderedmap (master table) 파일 추출


우선 다른 에셋 파일들을 추출하기 전에 다른 에셋 파일들에 대한 매핑 정보를 담고 있는 master table을 먼저 추출하여 여기에서 다른 파일들의 원 이름을 먼저 알아내도록 할거임.


모든 master table은 boot_ffc6.as에 그 정보가 저장되어 있음


boot_ffc6.as 파일을 열어보면 수천줄의 if / else문 안에


_loc9_ = {

"path":"/shop/star_crumb_exchange",

"clazz":§‑§.§―§.§−§.ー.§㇐§.ᅳ.§—§.§⁃§.§—§.§−§.§㇐§.§⎯§.ー.§⼀§.§⁃§.int

};


위와 같은 형태로 path / clazz의 두가지 인자만을 가지는 오브젝트들이 존재하는데, 여기서 path에 들어가 있는것이 ordermap 파일의 이름임


clazz는 이 오더맵 파일이랑 연관된 class의 class명인데 뜯어보고 싶으면 더 뜯어봐도 되지만 우리가 원하는건 ordermap 파일이니 여기서는 스킵


한번 예시로 위의 path 경로에 위에서 말한 hash 함수를 적용해 변환된 파일명을 알아내 보도록 하자


우선은 path 경로를 그대로 사용하면 안되고 얘네가 마스터 테이블을 해쉬할때 사용하는 prefix와 파일의 확장자명을 알아야 함.


결론적으로

§⎯§.§⎯§.§—§.ᅳ.§㆒§.§⁃§.§⁃§.§⼀§.ー.§‑§.§㇐§.§⎯§.§㆒§.ー.§‑§.int.as

§㇐§.§—§.ー.§㆒§.ー.§㆒§.§㆒§.ー.§—§.ー.§‑§.§⎯§.§㇐§.§–§.§⼀§.int.as


(오류난게 아니라 저게 진짜 파일 경로/이름임. 왜 월플 언패킹이 개졷같은지 알 수 있는 부분.)


위의 두 파일을 통해 파일 규칙을 대충 유추할 수 있는데


path에 적힌 파일명 앞에 master 그리고 뒤에 확장자명인 .orderedmap 을 붙여주면 됨


결과적으로 위 예시에서 우리가 찾고자 하는 파일명은

master/shop/star_crumb_exchange.orderedmap


이걸 SHA-1 해쉬로 변환해 줄 건데 이때 그냥 변환해 주면 안되고

§―§.§⼀§.ー.§‒§.§‑§.§―§.§㆒§.ᅳ.§‑§.ー.§–§.§⼀§.§㇐§.§‒§.§―§.int.as

파일을 보면 알 수 있듯 저 파일 이름 뒤에 "K6R9T9Hz22OpeIGEWB0ui6c6PYFQnJGy"라는 고정된 salt값을 넣어서 해싱해줘야 함


최종적으로 우리가 해싱하고자 하는 값은

"master/shop/star_crumb_exchange.orderedmapK6R9T9Hz22OpeIGEWB0ui6c6PYFQnJGy"


일단은 맛보기로 크롬에서 F12를 누르고 개발자 콘솔을 켜서


digest = (originText) => {
const encoder = new TextEncoder();
const encodedText = encoder.encode(originText);
crypto.subtle.digest('SHA-1', encodedText).then(encoded => Array.from(new Uint8Array(encoded)).map(b => b.toString(16).padStart(2, '0')).join('')).then(hash => console.log(hash));
}

digest('master/shop/star_crumb_exchange.orderedmapK6R9T9Hz22OpeIGEWB0ui6c6PYFQnJGy');


위 내용을 복붙해주면

a04424ad2c06782ab47e5a67ee91766dc28af1edd1acc7c0bf11d5c25ad2d2218fd87af4d2f06f04d56dd72a9afd


6a6bdd729c6fc750e7ca45eab45deaf48a29f80b 라는 값을 얻을 수 있는데


이렇게 나온 해쉬의 앞 2자리가 폴더명, 나머지가 파일명의 형태로 저장을 하고 있음.


예로 위의 값에서 앞의 6a는 디렉토리, 뒤의 6bdd~가 실제 파일명임.


다운로드받은 에셋 파일 폴더의


download/production/upload/로 들어가 보면


6a라는 폴더 안에 6bdd729c6fc750e7ca45eab45deaf48a29f80b라는 파일을 확인할 수 있음


a04424ad2c06782ab47e5a67ee91766dc28af1edd1acc7c0bf11d5c258d1d3212515b6791b5dd6bced0acea8f5


바로 이 파일이 star_crumb_exchange.orderedmap의 원본 파일임


이제 orderedmap 확장자 파일을 열어야 하는데 이걸 열려면 이 파일 포맷 구성을 알아야 함.


이 포맷 구성이 복잡한데


오늘은 여기까지 하고 다음 글에서 마저 쓰도록 하겠음..







자동등록방지

추천 비추천

61

고정닉 26

0

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기
자동등록방지

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 말머리 제목 글쓴이 작성일 조회 추천
3007 설문 실제 모습일지 궁금한 미담 제조기 스타는? 운영자 25/05/05 - -
885305 공지 글섭 미래시 관련 모음 [6] 8도비빔면갤로그로 이동합니다. 23.02.24 24068 13
941103 공지 가챠 한정인지 통상인지 구별하는 법 ㅇㅇ갤로그로 이동합니다. 23.10.06 1870 6
855417 공지 월드 플리퍼 마이너 갤러리 통합 공지 (2023-05-15 수정) [4] 8도비빔면갤로그로 이동합니다. 22.12.15 11184 11
841015 공지 덱 편성을 질문하기 전에 도움이 되는 글 [11] Hanarin갤로그로 이동합니다. 22.11.08 12280 19
931626 공지 캐릭이나 장비정보 와스쿠 가서 봐 [5] 루민갤로그로 이동합니다. 23.08.15 4134 4
767244 공지 [글로벌 서버 월드 플리퍼 공략 및 팁 모음] V1.22 [20] VanGuard갤로그로 이동합니다. 22.08.30 37353 31
906548 공지 호출기 [5] ㅇㅇ(118.235) 23.04.12 6035 12
922349 공지 중국 서버 리세계 구입 반쪽짜리 공략 [18] 메즈스갤로그로 이동합니다. 23.06.03 5720 12
959369 일반 월플 마지막 생존자 중섭 사망 [5] ㅇㅇ(211.235) 11:49 42 0
959368 기우제 와후리 부활 & 디멘션 오픈 기원 286일차 비정상인갤로그로 이동합니다. 09:26 14 0
959367 일반 이제 섀버도 나오면 사이게 신작 예정된거 없지않나 [3] 일플갤로그로 이동합니다. 03:26 50 0
959366 일반 와후리하고싶어서울었어ㅠㅠㅠㅠ [2] 로너갤로그로 이동합니다. 03:13 41 0
959365 일반 외후리는 망했어 [2] 별빛수갤로그로 이동합니다. 03:02 38 0
959364 기우제 와후리 부활 & 디멘션 오픈 기원 285일차 비정상인갤로그로 이동합니다. 05.06 40 0
959363 일반 니네는 아프지마라... [14] ㅇㅇ갤로그로 이동합니다. 05.06 153 5
959360 일반 이사람도 진짜 꾸준하네 [2] 루민갤로그로 이동합니다. 05.05 143 0
959359 농ㅋㅋ [3] 루민갤로그로 이동합니다. 05.05 97 0
959358 기우제 와후리 부활 & 디멘션 오픈 기원 284일차 [1] 비정상인갤로그로 이동합니다. 05.05 59 0
959357 일반 어린이날기념 [2] ㅇㅇ갤로그로 이동합니다. 05.05 114 0
959356 기우제 와후리 부활 & 디멘션 오픈 기원 283일차 비정상인갤로그로 이동합니다. 05.04 56 0
959354 일반 디멘션이란 뭘까 [4] 나루미야유메갤로그로 이동합니다. 05.04 130 0
959353 기우제 와후리 부활 & 디멘션 오픈 기원 282일차 [7] 비정상인갤로그로 이동합니다. 05.03 90 0
959352 일반 일페에 와후리 굿즈는 없나~ [2] ㅇㅇ(119.197) 05.03 93 0
959351 일반 오랜만에 왔는데 갤죽었네 [4] 곰돌이웅녀갤로그로 이동합니다. 05.03 107 0
959350 와 메카메스가키 [3] 루민갤로그로 이동합니다. 05.02 146 0
959349 일반 수술받고왔음 [17] ㅇㅇ갤로그로 이동합니다. 05.02 205 0
959348 일반 트위터 알고리즘은 알다가도 모르겠네 [7] 비정상인갤로그로 이동합니다. 05.02 126 0
959347 일반 완장주셈 [9] 삼석갤로그로 이동합니다. 05.02 140 3
959346 ✏️창 레지스랑싫티,,,,,,,,그림,,팒,,, [2] 개지랄갤로그로 이동합니다. 05.02 176 8
959345 일반 스텔라라는 명칭 볼때마다 자꾸 왖생각이 남 [4] ㅇㅇ갤로그로 이동합니다. 05.02 84 0
959344 기우제 와후리 부활 & 디멘션 오픈 기원 281일차 비정상인갤로그로 이동합니다. 05.02 42 0
959343 ✏️창 그릶판으로,,, 카이유(젓탱이큰 물속 3성)릃 그릲,,,,,,,,,,,, [5] 개지랄갤로그로 이동합니다. 05.02 188 8
959342 간만에 짤줍 [5] 루민갤로그로 이동합니다. 05.01 99 0
959341 일반 입원했우 [12] ㅇㅇ갤로그로 이동합니다. 05.01 150 3
959340 일반 섀버도 신작 나오는데 와후리도 나오겠지? 어썸갤로그로 이동합니다. 05.01 48 0
959339 기우제 와후리 부활 & 디멘션 오픈 기원 280일차 [1] 비정상인갤로그로 이동합니다. 05.01 55 0
959338 일반 와후리 부활 & 디멘션 오픈 기원 [2] 이코리갤로그로 이동합니다. 05.01 73 0
959337 일반 5월 첫글 [1] ㅇㅇ갤로그로 이동합니다. 05.01 70 0
959336 일반 친구 말딸하는데 [3] ㅇㅇ갤로그로 이동합니다. 04.30 131 0
959335 일반 다른겜 재밌게 하고있지만 [2] 이코리갤로그로 이동합니다. 04.30 136 0
959334 일반 Xi 우에가 보고싶구나 [5] 루민갤로그로 이동합니다. 04.30 127 0
959333 기우제 와후리 부활 & 디멘션 오픈 기원 279일차 [6] 비정상인갤로그로 이동합니다. 04.30 63 0
959332 일반 왖붕이 취업함 [10] ㅇㅇ(223.39) 04.30 267 11
959331 일반 살아나거라ㅏ 앵이갤로그로 이동합니다. 04.29 70 0
959330 일반 첫입사 기념 몰래할 세로겜 찾아 복귀하려고 했는데 [2] ㅇㅇ(118.235) 04.29 140 0
959328 일반 갤러리 뒤지다가 발견했어 [3] ㅇㅇ(118.235) 04.29 140 0
959327 ❓질문 시테일도 뒤진거읾? [3] 갈대잎갤로그로 이동합니다. 04.29 171 0
959326 기우제 와후리 부활 & 디멘션 오픈 기원 278일차 [1] 비정상인갤로그로 이동합니다. 04.29 63 0
959325 기우제 디멘션 뜨면 갤에 버거 쏜다 ㅋㅋ [2] 굿라이프갤로그로 이동합니다. 04.29 84 0
959324 일반 갤러리 뒤지다 발견한거 [3] ㅇㅇ갤로그로 이동합니다. 04.29 122 0
뉴스 [차트IS] ‘이혼보험’, 1.1%로 종영…쓸쓸한 마무리 디시트렌드 14:00
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2