level 12
_GASTER☜_
楼主
我是个非常不喜欢程序被反编译的人。
因此,前段时间我研究了YYC编译,让游戏的代码部分变成了机器码,事实证明确实有效,现在反编译啥都看不到。
......真的什么都看不到吗?并不完全如此。我发现YYC编译的游戏仍然可以通过反编译exe文件以获得游戏中的字符串。虽然也仅限于可获得字符串,但我还是为此大伤脑筋,因为我在游戏中有不少彩蛋都是以字符串的形式埋藏的。
所以我决定做一套最起码能防住非专业人士的文本加密算法。这套加密算法说来倒是也很简单,直接贴代码吧:

我制作了一个脚本,名为“ENCODER”,内容就是上面这张图。基本上讲,我填写的参数,就是需要加密的文本,然后该脚本为我返回加密后的字符串。
此外我还有另一个脚本,名为“DECODER”,内容基本上来讲,就是将这张图的15行变为text[i] -= irandom_range(0,50),再把16行变成text[i] -= 5。
在我制作完这两个脚本后,我决定先试试看我的解密到底是否可还原出原来的文本。所以我执行如此一行代码:
show_message(DECODER(ENCODER("TEST MESSAGE HERE.")));
而show message的结果也确实是加密前的文本。
于是我把我程序中原本的字符串用ENCODER加密后,将原本是明文的位置直接替换成密文。在那之后,我在每一个调用字符串的地方写下DECODER。这就是我的加密流程了。
但是.....在我替换了几个后,我心中总是觉得不安,于是我决定先看看游戏内的实际效果如何。
结果大吃一惊。我通过断点已经确定,我传递的字符串确实是我所加密后的密文,而DECODER也确实执行(也确实只执行了一次),但解密后的文本是完全无法阅读的文字。
我思考,会不会是某种特定的字符是不可加密的?但是并不是,因为在那之后我将我之前测试过的“TEST MESSAGE HERE.”字符串加密后写入,但是依然无法正确地被DECODER解码。
最后我发现,如果我在程序中直接使用这样的代码:text = DECODER(ENCODER(<Some text here>)),则文本就可以解码成功,而如果我去掉程序中的ENCODER,直接输入我ENCODER后的结果,则不行。
我获取我的ENCODER的结果的方式,是在ENCODER脚本结束前添加了一行clipboard_set_text(text_result),难道说这种获取方法是错的吗?
2020年03月28日 03点03分
1
因此,前段时间我研究了YYC编译,让游戏的代码部分变成了机器码,事实证明确实有效,现在反编译啥都看不到。
......真的什么都看不到吗?并不完全如此。我发现YYC编译的游戏仍然可以通过反编译exe文件以获得游戏中的字符串。虽然也仅限于可获得字符串,但我还是为此大伤脑筋,因为我在游戏中有不少彩蛋都是以字符串的形式埋藏的。
所以我决定做一套最起码能防住非专业人士的文本加密算法。这套加密算法说来倒是也很简单,直接贴代码吧:

我制作了一个脚本,名为“ENCODER”,内容就是上面这张图。基本上讲,我填写的参数,就是需要加密的文本,然后该脚本为我返回加密后的字符串。此外我还有另一个脚本,名为“DECODER”,内容基本上来讲,就是将这张图的15行变为text[i] -= irandom_range(0,50),再把16行变成text[i] -= 5。
在我制作完这两个脚本后,我决定先试试看我的解密到底是否可还原出原来的文本。所以我执行如此一行代码:
show_message(DECODER(ENCODER("TEST MESSAGE HERE.")));
而show message的结果也确实是加密前的文本。
于是我把我程序中原本的字符串用ENCODER加密后,将原本是明文的位置直接替换成密文。在那之后,我在每一个调用字符串的地方写下DECODER。这就是我的加密流程了。
但是.....在我替换了几个后,我心中总是觉得不安,于是我决定先看看游戏内的实际效果如何。
结果大吃一惊。我通过断点已经确定,我传递的字符串确实是我所加密后的密文,而DECODER也确实执行(也确实只执行了一次),但解密后的文本是完全无法阅读的文字。
我思考,会不会是某种特定的字符是不可加密的?但是并不是,因为在那之后我将我之前测试过的“TEST MESSAGE HERE.”字符串加密后写入,但是依然无法正确地被DECODER解码。
最后我发现,如果我在程序中直接使用这样的代码:text = DECODER(ENCODER(<Some text here>)),则文本就可以解码成功,而如果我去掉程序中的ENCODER,直接输入我ENCODER后的结果,则不行。
我获取我的ENCODER的结果的方式,是在ENCODER脚本结束前添加了一行clipboard_set_text(text_result),难道说这种获取方法是错的吗?