본문 바로가기
Tips

RPG Maker MV 게임에서 소스 코드를 보호해보자 - RPG Maker MV

by biud436 2018. 11. 7.



소개

핵심 코어 스크립트 파일과 게임 실행에 필요한 플러그인 파일을 단 하나의 파일로 통합하여 게임을 샌드박스 모드에서 실행합니다. 


외부에서 개발자 도구로 전역 변수 값 조작을 시도해도 보호된 영역에 있으므로 전역 변수 값을 찾을 수 없게 됩니다.


이렇게 해도 개발자 도구에서 접근 가능하게 수정하면 접근 가능한 상태가 되기 때문에 바이너리 코드로 컴파일을 꼭 해야 합니다.


또한 이 모듈은 게임 배포 시 자바스크립트 파일을 바이너리 파일로 컴파일 하기 좋은 상태로 만들게 됩니다.


특징


- 유저들이 게임을 테스트 플레이 모드에서 돌렸을 때, 개발자 도구로 전역 변수를 수정할 수 없게 됩니다. 모든 소스 코드가 보호된 스코프 영역에 들어가기 때문에 외부에서 전역 변수를 수정할 수 없게 됩니다. 


게임을 테스트 플레이로 돌리는 방법은 많습니다. 예를 들면, 최근에 나온 마녀의 집 MV의 경우 스팀에서 어떤 옵션을 주면 테스트 플레이 모드로 돌릴 수 있게 됩니다. 로컬 웹 서버로 돌리는 방법도 있습니다. 유저들이 벽을 뚫고, 개발자 도구로 모든 상황을 통제할 수 있는 상황은 개발자 입장에서 썩 유쾌한 상황이 아닐 것입니다.


(단, 치트 엔진을 통한 치팅 행위까진 막을 수 없습니다.)


사용법


우선 개인적으로 쓰려고 만든 것이라 어떤 용도로 사용해야 하는 지 설명하겠습니다.


먼저, 게임을 배포하기 전에 플러그인을 js/plugins에 넣으시고, 플러그인 관리자에 RS_UnifyAllPlugins.js 파일을 설정합니다.


그 후 게임을 실행하면 js 폴더에 core.js 파일이 생기게 됩니다. 게임 폴더에 core.js를 로드하는 index_test.html 파일도 생깁니다.


게임 배포 파일을 만들면 www 폴더에 index.html 파일이 있습니다. 이 파일을 삭제하고, index_test.html 파일을 그 자리에 복사해서 붙여 넣고 index.html로 이름을 바꿉니다.


그 후, RPG Maker MV Cook Tool 또는 버전에 맞는 nwjc를 이용하여 모든 자바스크립트 파일을 바이너리 파일로 만들면 NWJS 0.22.x 이상에서 돌릴 경우, 속도 저하 없이 소스 코드를 보호하는 효과를 보게 됩니다.


파일이 합쳐지는 방식은 다음과 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
(function() {
 
    // rpg_core.js
    // rpg_managers.js (수정된 것)
    // rpg_objects.js
    // rpg_scenes.js
    // rpg_sprites.js
    // rpg_windows.js
    // convert_rpg_managers.js (플러그인 로더)
    // plugins.js
    // (플러그인 매개변수 설정)
    // main.js 
    // 플러그인 파일 1
    // 플러그인 파일 2
    // 플러그인 파일 3....
    // ...
    // (플러그인 매개변수 설정)
 
})();
cs


위와 같이 샌드박스 형식으로 만들면 개발자 도구로 전역 변수 값을 수정하는 것을 방지할 수 있습니다.


*.bin(바이너리) 파일 로드 방법


nwjs v0.33.4 SDK 버전으로 모든 자바스크립트 파일을 *.bin 파일로 컴파일하였습니다. 바이너리 파일을 로드하려면 다음과 같이 하면 됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <meta name="apple-mobile-web-app-capable" content="yes">
        <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
        <meta name="viewport" content="user-scalable=no">
        <link rel="icon" href="icon/icon.png" type="image/png">
        <link rel="apple-touch-icon" href="icon/icon.png">
        <link rel="stylesheet" type="text/css" href="fonts/gamefont.css">
        <title>Game Title</title>
    </head>
    <body style="background-color: black">
        <script type="text/javascript" >
        (function() {
            var path = require('path');
            var mainPath = path.join(process.mainModule.filename, "..");
            nw.Window.get().evalNWBin(null, path.join(mainPath, 'js/libs/pixi.bin'));
            nw.Window.get().evalNWBin(null, path.join(mainPath, 'js/libs/pixi-tilemap.bin'));
            nw.Window.get().evalNWBin(null, path.join(mainPath, 'js/libs/pixi-picture.bin'));
            nw.Window.get().evalNWBin(null, path.join(mainPath, 'js/libs/fpsmeter.bin'));
            nw.Window.get().evalNWBin(null, path.join(mainPath, 'js/libs/lz-string.bin'));
            nw.Window.get().evalNWBin(null, path.join(mainPath, 'js/libs/iphone-inline-video.browser.bin'));
            nw.Window.get().evalNWBin(null, path.join(mainPath, 'js/core.bin'));        
        })();            
        </script>
    </body>
</html>
cs


그 후, 게임을 실행하면 소스 코드가 개발자 도구에서도 안 보이게 됩니다. 소스 코드는 네이티브 코드로 취급됩니다.


PIXI.Sprite에 접근하면 [native code]라고 나옵니다. 게다가 소스 파일에는 js 폴더 자체가 안 보이게 됩니다.


다운 로드


다른 이름으로 링크 저장 기능을 사용하여 파일로 저장하세요.


Windows Only - https://github.com/biud436/MV/raw/master/RS_UnifyAllPlugins.js



버전 로그

2018.11.02 (v1.0.0) - First Release.