Petschko / RPG-Maker-MV-Decrypter

You can decrypt RPG-Maker-MV Resource Files with this project ~ If you don't wanna download it, you can use the Script on my HP:
https://petschko.org/tools/mv_decrypter/
MIT License
645 stars 107 forks source link

how can I find the Decrypt-Code if it's not in System.json #25

Closed frostylight closed 5 years ago

frostylight commented 5 years ago

it told me that "Please try to select the rpg_core(.js) file and try again" but it also told me that "Error: File-Content was invalid (Was not a JSON-File)"

frostylight commented 5 years ago

it seems that the Decrypt-Code isn't in rpg_core.js either

Petschko commented 5 years ago

It can vary from game to game... Please provide more information about the game such as name etc and send these both files, so we can ensure its not just a bug in my System.

Please Provide:

frostylight commented 5 years ago

I read your scripts,and it's not a bug in your System. I just download a game that used different way to encrypt. I will try different methods later. Thanks for your reply,I am sorry to bother you

Now I know that the maker has hidden the key in a puzzle :)427 lines of codes

Petschko commented 5 years ago

If you want, you can give me the game and I debug this game for you, should be 2min then you get the key^^

I wonder why they put in so much effort to protect the files, since it's JavaScript its ultra easy to get the key anyway ^^

frostylight commented 5 years ago

I aslo wonder why this maker protect the files which he/she found on the Internet and consider
them as his/her own works. To my surprise,it seems that each file has different key. Look this

Decrypter.decryptImg = function(url, bitmap) {
    url = this.extToEncryptExt(url);
//Now,url=img/xxx/xxxx.rpgmvp
    var requestFile = new XMLHttpRequest();
    requestFile.open("GET", url);
    requestFile.responseType = "arraybuffer";
    requestFile.send();

    requestFile.onload = function () {
        if(this.status < Decrypter._xhrOk) {
            var arrayBuffer = Decrypter.decryptArrayBuffer(requestFile.response);
//For each file,the ArrayBuffer is different.
            bitmap._image.src = Decrypter.createBlobUrl(arrayBuffer);           
            bitmap._image.onload = Bitmap.prototype._onLoad.bind(bitmap);
            bitmap._image.onerror = Bitmap.prototype._onError.bind(bitmap);
        }
    };
};

Maybe I should learn JavaScript later

Petschko commented 5 years ago

Thats the normal decryption method (from RPG-Maker)

If you like me to check let me know the Name of the Game~ If you want to have it private you can also write me a E-Mail to peter@petschko.org ^^

//For each file,the ArrayBuffer is different.

Yes the Array-Buffer is the file content, its natural that it is different for each file =)

frostylight commented 5 years ago
Decrypter.decryptArrayBuffer = function(arrayBuffer) {
    if (!arrayBuffer) return null;
    var header = new Uint8Array(arrayBuffer, 0, this._headerlength);

    var i;
    var ref = this.SIGNATURE + this.VER + this.REMAIN;
    var refBytes = new Uint8Array(16);
    for (i = 0; i < this._headerlength; i++) {
        refBytes[i] = parseInt("0x" + ref.substr(i * 2, 2), 16);
    }
    for (i = 0; i < this._headerlength; i++) {
        if (header[i] !== refBytes[i]) {
            throw new Error("Header is wrong");
        }
    }

    arrayBuffer = this.cutArrayHeader(arrayBuffer, Decrypter._headerlength);
    var view = new DataView(arrayBuffer);

    if (arrayBuffer) {
this.f_DRILLup(view,arrayBuffer);
this.f_dRillUp(view,arrayBuffer);
this.f_dRilLup(view,arrayBuffer);
this.f_dRiLluP(view,arrayBuffer);
this.f_DriLLuP(view,arrayBuffer);
this.f_drIlLUp(view,arrayBuffer);
this.f_DRiLlUp(view,arrayBuffer);
this.f_DrILlup(view,arrayBuffer);
this.f_dRIllup(view,arrayBuffer);
this.f_DrilLup(view,arrayBuffer);
this.f_drilLup(view,arrayBuffer);
this.f_DrIllUp(view,arrayBuffer);
this.f_dRILLUp(view,arrayBuffer);
this.f_drillup(view,arrayBuffer);
this.f_dRiLLuP(view,arrayBuffer);
this.f_dRIlLup(view,arrayBuffer);
this.f_DrILluP(view,arrayBuffer);
this.f_DRiLLUp(view,arrayBuffer);
this.f_driLLUp(view,arrayBuffer);
this.f_DRilLup(view,arrayBuffer);
this.f_DrillUp(view,arrayBuffer);
this.f_drIlluP(view,arrayBuffer);
this.f_dRIlLUp(view,arrayBuffer);
this.f_DRiLLuP(view,arrayBuffer);
this.f_dRiLLUp(view,arrayBuffer);
this.f_drILLuP(view,arrayBuffer);
this.f_DRIlluP(view,arrayBuffer);
this.f_DRILlup(view,arrayBuffer);
this.f_dRiLLup(view,arrayBuffer);
this.f_driLlup(view,arrayBuffer);
this.f_drILLup(view,arrayBuffer);
this.f_DRiLluP(view,arrayBuffer);
this.f_driLLup(view,arrayBuffer);
this.f_drIllUp(view,arrayBuffer);
this.f_DRilluP(view,arrayBuffer);
this.f_DrILlUp(view,arrayBuffer);
this.f_DRIlLUp(view,arrayBuffer);
this.f_drillUp(view,arrayBuffer);
this.f_DrIllup(view,arrayBuffer);
this.f_DrILLUp(view,arrayBuffer);
this.f_DRIllup(view,arrayBuffer);
this.f_drIlLup(view,arrayBuffer);
this.f_dRILlup(view,arrayBuffer);
this.f_DrIlLuP(view,arrayBuffer);
this.f_drilLuP(view,arrayBuffer);
this.f_drIllup(view,arrayBuffer);
this.f_DrIlLUp(view,arrayBuffer);
this.f_DRiLlup(view,arrayBuffer);
this.f_DRilLUp(view,arrayBuffer);
this.f_dRIllUp(view,arrayBuffer);
this.f_dRiLlUp(view,arrayBuffer);
this.f_DrILLup(view,arrayBuffer);
this.f_DrilluP(view,arrayBuffer);
this.f_dRIlluP(view,arrayBuffer);
this.f_dRIlLuP(view,arrayBuffer);
this.f_drILluP(view,arrayBuffer);
this.f_DRiLLup(view,arrayBuffer);
this.f_DRILluP(view,arrayBuffer);
this.f_DrillUP(view,arrayBuffer);
this.f_DrILLuP(view,arrayBuffer);
this.f_DRILLUp(view,arrayBuffer);
this.f_Drillup(view,arrayBuffer);
this.f_drilluP(view,arrayBuffer);
this.f_dRillup(view,arrayBuffer);
this.f_DriLluP(view,arrayBuffer);
this.f_DriLLUp(view,arrayBuffer);
this.f_drIlLuP(view,arrayBuffer);
this.f_driLlUp(view,arrayBuffer);
this.f_DRillUP(view,arrayBuffer);
this.f_DrilLuP(view,arrayBuffer);
this.f_dRILlUp(view,arrayBuffer);
this.f_DRilLuP(view,arrayBuffer);
this.f_dRiLlup(view,arrayBuffer);
this.f_dRilLUp(view,arrayBuffer);
this.f_DrIlluP(view,arrayBuffer);
this.f_DRillup(view,arrayBuffer);
this.f_DRillUp(view,arrayBuffer);
this.f_DRIllUp(view,arrayBuffer);
this.f_dRILLuP(view,arrayBuffer);
this.f_drILLUp(view,arrayBuffer);
this.f_dRILluP(view,arrayBuffer);
this.f_driLLuP(view,arrayBuffer);
this.f_dRILLup(view,arrayBuffer);
this.f_DRIlLuP(view,arrayBuffer);
this.f_dRillUP(view,arrayBuffer);
this.f_DRILlUp(view,arrayBuffer);
this.f_DRILLuP(view,arrayBuffer);
this.f_DriLlup(view,arrayBuffer);
this.f_DriLLup(view,arrayBuffer);
this.f_DrilLUp(view,arrayBuffer);
this.f_dRilLuP(view,arrayBuffer);
this.f_dRilluP(view,arrayBuffer);
this.f_DrIlLup(view,arrayBuffer);
this.f_drillUP(view,arrayBuffer);
this.f_drILlUp(view,arrayBuffer);
this.f_drilLUp(view,arrayBuffer);
this.f_DRIlLup(view,arrayBuffer);
this.f_drILlup(view,arrayBuffer);
this.f_driLluP(view,arrayBuffer);
this.f_DriLlUp(view,arrayBuffer);

    }
    return arrayBuffer;
};

just like a puzzle

frostylight commented 5 years ago

For some difficult encrypt files,we could copy the function from rpg_core.js(game) to Decrypter.js. But it takes too long to decrypt files in each folders

Petschko commented 5 years ago

I cant help here since i dont have the game^^

frostylight commented 5 years ago

I cant help here since i dont have the game^^

I solve the problem by myself , just copy the funtion from the game but can we decrypt all files in different folders ? so that it would be more convenient

Petschko commented 5 years ago

You cant do this, a Website/HTML-Document doesn't have access to your File-System. You can only select multiple Files inside a Folder but can't process a File-Tree.

frostylight commented 5 years ago

what a pity. all in all ,thanks a lot.

david12345-code commented 4 years ago

hey can you decrypt this game for me? https://www.dropbox.com/s/itpz8bkupvzhlfz/STV_MonsterCards-DEMO.rar?dl=0&file_subpath=%2FSTV_MonsterCards-DEMO%2FMonsterCards+DEMO

frostylight commented 4 years ago

hey can you decrypt this game for me? https://www.dropbox.com/s/itpz8bkupvzhlfz/STV_MonsterCards-DEMO.rar?dl=0&file_subpath=%2FSTV_MonsterCards-DEMO%2FMonsterCards+DEMO

I can't visit the website because it's limited in my country,sorry maybe you should open a new issues or just send it to Petschko

Petschko commented 4 years ago

Please try the "No-Key" solution in my Website, if you are only interested in the images:

https://petschko.org/tools/mv_decrypter/#restore-images

If you can't visit my Website due to GEO-Restriction, you can also Download this Project and use it offline on your PC, it also has the No-Key solution (Images only)