Table of contents:I. What is an obfuscator?II. What was the purpose of this project?III. I'm having problems with this! It messes up my game completely!IV. Who made this program, and what language was it written in?V. How do I use this program?VI. "When I open the ZIP all I see is .class files. How do I run the program?"VII. ScreenshotsVIII. DownloadIX. AcknowledgementsX. Bugs & SuggestionsXI. Licensing and terms of useXII. Final words

I. What is an obfuscator?An obfuscator is a software program that will rewrite source code of a program to make it as unreadable as possible to human agents, often to prevent people from decompiling/reverse engineering the program and exploiting the code and resources in it. This project is such a program - specifically, it will take a :GM5:/>, :GM6:/>, :GM7:/> or :GM8: and spit out a new source with the code, resources and variables completely unreadable and in-understandable. An option even makes sprite and background obfuscation possible, with some limitations.

II. What was the purpose of this project?This project was originally designed to provide an immediate solution to imminent issues Game Maker executables had with decompilation, but has more recently taken on other tasks. Being tremendously more powerful than its predecessor, and much more accurate in preserving code logic, as well as its support for newer Game Maker versions completes what its predecessor had problems with. Remember, this program does not make your games undecompilable. Additionally, this program was NOT designed to specifically counter the decompilation project, as I respect the work put into it a lot. The program's original purpose, and largely its current purpose was respectively is to hinder "noobs" who used the decompiler to understand the game source structure and code. As its obfuscation horizons have expanded greatly, even expert users will have trouble reverting the code back to an understandable format now.

III. I'm having problems with this! It messes up my game completely!Here are a few pointers.

Try obfuscating again. Because of the obfuscator's innate randomness, although very unlikely now, re-obfuscation might eliminate an unlikely random error.

Using an extension package? Because of their nature, you are expected to add all functions and references to the extension package to the Do Not Modify list, as the obfuscator cannot automatically tell what is an extension function and what isn't.

Use the debug check box. The obfuscator will then insert the original names as comments, allowing you to find the part which Game Maker cannot compile and edit it back to its original state.

Uncheck "Nasty Obfuscation" and see if the state improves. If so, please contact me and describe the differences.

Make sure you are not using deprecated functions, such as image_single, move_contact, make_color, external_call0, external_call1, image_single, image_single, image_single or the like. If you are, simply add the deprecated function (without the parenthesis) to the "Do Not Modify" list.

If you think a particular function or variable is the cause, try adding it to the Do Not Modify list.

If the problem remains unfixed, uncheck "Rename resources", obfuscate and try to run the obfuscated copy. Once you get an error, take a look in which script or piece of code the error occurs in. Then post the un-obfuscated script or code here. It will most likely be a problem like the ones above, but in the circumstance it isn't, I will see if I can fix other types of problems.

If all else fails, please e-mail me at axiomates@gmail.com.

IV. Who made this program, and what language was it written in?The program was made solely by me, Schreib. I've received much Java help from others, including the person going unnamed who made the decompiler. I want to sincerely thank ISMAvatar for providing such excellent Game Maker editable file format documentation, and xot for assisting greatly in developing clever image obfuscation algorithms.The program was written in Java using the open-source development platform Eclipse, utilizing JavaX Swing components to make the GUI.

V. How do I use this program?To run the program under Windows, usually, given that you have Java 6.0 or later installed, all you have to do is double-click the .jar file and it should launch momentarily.

If you're under another operating system and/or this method does not work, try using the following command in a terminal/command window:

Using program is rather straightforward. Simply select your .gmd (for GM5), .gm6 (for GM6), .gmk (for GM7 or GM8.0) or .gm81 (for GM8.1) file (don't forget to read the license!), specify your settings and process your Game Maker editable to a new location. If you wonder what a certain setting does, hover your cursor over it and a tooltip will appear explaining what it does. Take this final file, open it and create an executable out of it. That's it, your game functions just as well as before, but when decompiled is quite difficult to understand.

If you've used the Sprite Obfuscation option, you may have to take additional steps before creating your final executable. This is explained, however, when you attempt to run your game directly after obfuscation.

VI. "When I open the ZIP all I see is .class files. How do I run the program?"Internet Explorer tends to think that a downloaded .jar file is actually a .zip file (which it is, in one sense). This rarely happens on later editions, however. Simply make sure that it has the .jar extension.

VII. ScreenshotsHere are few screenshots GM project that have been obfuscated.More screenshots:

IX. AcknowledgementsAgain, my biggest thanks go to ISMAvatar, for her excellent Game Maker editable file format documentations and GMK encryption documentation and to xot for his invaluable help with image obfuscation algorithms. Thanks to YellowAfterLife for concieving an interesting obfuscation strategy and piluke for being helpful with testing.

X. Bugs & SuggestionsThis program has been thoroughly tested on my own and others' GMD's, GM6's, GMK's and GM81's, including a lot of variety such as Drag and Drop, code styling variations and so on. Earlier, this program was slightly prone to some styles of coding, but should be much less so now. Despite this, I still disclaim myself from the possibility that your coding style may cause problems. The program was written in mind with the default Java coding & indentation standard. If it still fails, it will report with an error of the script/code/object in question, Even if it is successful, there is no guarantee that your game will be syntax-error free. Please, PLEASE contact me if your code causes an error.If you want to report a bug, send me a PM or e-mail me at axiomates@gmail.com with the ORIGINAL file and the script/code the obfuscator couldn't obfuscate. If you have any suggestions, please let me know.

Redistribution and use of this software are permittedprovided that the following conditions are met:

- No modifications whatsoever must have been made to the original package.This includes modifications to the above copyright notice, this list ofconditions and the following disclaimers, which must all be retained atall times in the software.

- No commercial profit, whether abstract or concrete, must be made whenredistributing the original package.

In addition, this software must never be reverse engineered, decompiled ordisassembled in any way.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; DAMAGES INFERRED FROM POTENTIAL LICENSE INFRINGEMENTS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

XII. Final wordsWell, this is it, again, after many months of work. I am truly happy that I have been able to contribute to helping the community create, and more specifically, secure their games.

Unlike the previous non-solutions to the decompiler. This project has a tremendous amount of potential. As Shreib describes, this does not prevent decompiling, but renders the decompiled output almost useless.

This is the type of solution that Java, and other decompilable languages uses.

The initial file will be about a meg higher, from a lazy me. It's actually about a meg of null bytes in the end of the file, but GM ignores those anyway. When you've processed the file, open the processed one and resave it to yet another file. That rids the null bytes, and the final file will be... i'd say 5 kb larger than the original, since it renames variables and names to larger ones.

uhm aren't there a mega number of bugs with such a tool? - Renaming resource names would potentially remove a lot of functionality (things like "if (object_get_name(OBJECT) = BLALBLA)" don't work.. Neither does the function "Variable_exists()" work anymore! Or does it look inside strings too?

uhm aren't there a mega number of bugs with such a tool? - Renaming resource names would potentially remove a lot of functionality (things like "if (object_get_name(OBJECT) = BLALBLA)" don't work.. Neither does the function "Variable_exists()" work anymore! Or does it look inside strings too?

Nope. It doesn't mess with functions, and when it changes a name it changes everything about the name. if's aren't messed with.

Of course, LateralGM, whilst conveniently written in Java, is (as are the files within) covered under the GNU GPL 3+, which mandates open source, so it would be incompatible with your closed-source obfuscater, but one could write similar ones from scratch, once they have obtained the knowledge needed from the files.

You mean, you don't care if x years of your blood, sweat, tears, (and passion) of making a commercial game gets hacked, and some one steals the idea?

no games are worth decompiling anyway.

Call our Game Maker Creations' worthless all you want, our work still continues.

and if u decompile a game ur not a noob.

Maybe not nooby, just illegal.

and u WONT be making it for GMKs.

I don't see you trying to help him, so, why complain?

as usual, useless stuff flooding the GMC.

I could tell from your horrible grammar, badly thought out post content, and of course, the order that it was all posted in..

You couldn't make anything better.

You proved that the saying still lives on...Schreib, this is pretty cool, perhaps, you could contact YYG and maybe... Work, for them? I mean seriously, this could make you a lot of money (from them funding you somehow). Don't ever be "lazy". Just finish that lazy part you were talking about, and listen to the (constructive) feedback that people give you. Apparently you mentioned NPT not liking these types of programs, well, now he likes yours .P.S: Don't use curse words in the first post, they will generate flame! (try replacing the F-word, with the word "chicken" .) (Also, sorry this post was so long! )

Apparently you mentioned NPT not liking these types of programs, well, now he likes yours .

Apparently, you misunderstood, what Schreib said. A program like this for GM has never been released publicly before. My dislike for previous "decompiler solutions" were not because they attempted to solve the problem, it was because they didn't solve anything. I also disliked how the promoters never disclosed the the shortcomings.

Schreib's obfuscator is a completely different type of solution, and his topic is candid and honest regarding it's capabilities.

I commented specifically on obfuscation and decompiling before I was aware that Schreib was working on one.

[link removed]

Some ideas for future versions of Game Maker.

Change the exe format, with some deliberate obfuscation designed to inhibit decompiling.

Allow variable and resource names to be obfuscated. Yes, this could possibly break execute_string() and execute_file().

Make obfuscation an option, conditional that execute_*() commands canâ€™t be used. This will also help protect exes from techniques that force open the interactive debugger.

Assuming variable and resource obfuscation is implemented. Give every resource an obfuscate option, create a keyword volatile, for variables. During traditional compile and runs, no obfuscation occurs. This way the debugger still works. When a release exe is being generated, then the obfuscation option gets selected, all resources and variables are obfuscated except resources without the obfuscation option, and variables defined as volatile. This way execute_*() could still be used with those.

uhm aren't there a mega number of bugs with such a tool? - Renaming resource names would potentially remove a lot of functionality (things like "if (object_get_name(OBJECT) = BLALBLA)" don't work.. Neither does the function "Variable_exists()" work anymore! Or does it look inside strings too?

Nope. It doesn't mess with functions, and when it changes a name it changes everything about the name. if's aren't messed with.

So what happens if I have this variable named "team"..

now in the creation event I do:

if (!variable_local_exists("team"))
{
team=0
}

If I put in the creation code of objects in the room event, which executed before the creation event, "team=1", what will happen? - Cause I mean, if a name got changed checking for the existance of "team" is pretty useless..

paul23, the easiest way to understand this is by thinking of it as a search and replace tool. It looks for a resource name and then changes that to a random string. Then goes and finds other locations of that resource name changing it to the same random string.

Thats why this tool won't work if for some reason you need to have your (eg, sprite and object) resources named the same (btw, the tool does warn you about this if it finds dupe resource names).

Gamma6, you might want to PM him about that. Your post could be over looked.

Huh. The other day I was wondering if anyone would make an obfuscation program for Game Maker files - guess this is the answer, mm?
Anyway, for anyone who's not really sure what this does, it takes your gm6 files, looks through them, and renames everything so that none of the resource and variable names make any sense. It's harder to figure out what your code is supposed to do when it uses variable names like Fd3_37Q, yes?

As for what Chronic said about duplicate resource names, I think any Game Maker user who makes those sort of mistakes isn't really in a position to be worried about people wanting to decompile their game anyway.

Huh. The other day I was wondering if anyone would make an obfuscation program for Game Maker files - guess this is the answer, mm?Anyway, for anyone who's not really sure what this does, it takes your gm6 files, looks through them, and renames everything so that none of the resource and variable names make any sense. It's harder to figure out what your code is supposed to do when it uses variable names like Fd3_37Q, yes?

@last sentenceWhich is exactly why you should use this right before you compile the exe.

WOW, that is really neat; you should definitely make a GMK compatible version.
EDIT:
also, if it is possible, you should make it rename the sub folders to further confuse hackers/decompilers.
EDIT2:
if you are using D&D with things like the show message it will Obfuscate them as well.

Thank you! I've been waiting for this. If it worked with GM7 then it would be perfect.

As a note to other users, running a gmk through LGM to get the gm6 will cause this program to error unless you open the gm6 in GM and save it again.

Also, it seems to mess up with case statements that contain a default case (it replaces the "default" keyword).

Thank you. These are the kinds of posts I need. I'll have this fixed right away.

also, if it is possible, you should make it rename the sub folders to further confuse hackers/decompilers.

This is not required, because GM discards the resource tree when compiling. That means that when you decompile an exe, all resources will lie in a big clump and will not be organized as before. I had that in plan before I discovered this.

Report who? At least one local moderator (myself), and an Administrator (Chronic), already replied to this topic. If anything, staff might get upset about you filing a false report, and calling this project a 'decompiler'. READ.

Report who? At least one local moderator (myself), and an Administrator (Chronic), already replied to this topic. If anything, staff might get upset about you filing a false report, and calling this project a 'decompiler'. READ.

He's mistaking that changes a GameMaker file for good, for a GameMaker file for bad. He probably messed up his file, and now is made cause he doesn't have his old one anymore. And he can't tell what each variable is.

Exelent job Schreib! This is just what i talked about when the pested decompiler was released. I sugested manual Obfuscation of the files before release (biiig job:), but this is neat. Just important to remember the limitation for inside strings.
A list over gm-functions that need to be avoided is needed.
Alone the posibillity to remove all comments is valuable. ...a feature that really ought to be implicite in the gm-build to exe process.. pfuii yyg.. pfyiii.. +booo

Seriously though, this looks like a pretty good program for protecting you're games from being stolen/edited, too bad it doesn't work on GMK. Does this stuff up resources like sprites, etc. and if so, how does the program recognise them?

It does stuff their names up if you choose that option. The program runs through all code and arguments to find anywhere where those names need to be replaced, so it's not a problem. Otherwise there would be no point with renaming them.

A list over gm-functions that need to be avoided is needed.Alone the posibillity to remove all comments is valuable. ...a feature that really ought to be implicite in the gm-build to exe process.. pfuii yyg.. pfyiii.. +booo

There's no plausible way for an obfuscator to avoid breaking code like the above, unless it decides not to obfuscate "some_variable". But if it can't decipher the name of the variable to begin with, it won't know not to obfuscate it.

This is a good idea, I have thought also about manually changing things which is a large job.
I did consider just using long weird names ect from the start, yet that makes it harder for the programmer.
9.99/10... Cause nothing is perfect

Good Work.

0

I have left the GMC, and my domain is no longer registered to me.All previous links will not work, for any information/links please PM me, and I may be able to help you