制脚本之魂。
编译的前端至少有两部,scan和parse。Scan阶段处理词法分析,会把源文件切分成一个个token,而 parse阶段处理文法分析,会根据上下文无关文法来尝试“理解”这些token,构造语法树(进而构造抽象 语法树)。但这里我所看到的脚本只对脚本源文件做了scan,然后直接把scan的结果保存成“二进制脚本 ”了。真够OTL的。
简单点说,这个“二进制脚本”完整保留了脚本源文件的文本信息,而且还多加了些行号、类型等信 息进去。缺少的是被去除了的注释。
那就很好办了不是么。于是把所谓的反编译程序写了出来:
ScriptDecompiler.cs
C#代码
1.// ScriptDecompiler.cs, 2007/12/18
2.// by RednaxelaFX
3.
4./*
5. * Copyright (c) 2007 着作权由RednaxelaFX所有。着作权人保留一切权利。
6. *
7. * 这份授权 条款,在使用者符合以下三条件的情形下,授予使用者使用及再散播本
8. * 软件包装原始码及二进 位可执行形式的权利,无论此包装是否经改作皆然:
9. *
10. * * 对于本软件源代码的再散播, 必须保留上述的版权宣告、此三条件表列,以
11. * 及下述的免责声明。
12. * * 对于本套件 二进位可执行形式的再散播,必须连带以文件以及/或者其他附
13. * 于散播包装中的媒介方式, 重制上述之版权宣告、此三条件表列,以及下述
14. * 的免责声明。
15. * * 未获事前取得书 面许可,不得使用RednaxelaFX之名称,
16. * 来为本软件之衍生物做任何表示支持、认可或推广 、促销之行为。
17. *
18. * 免责声明:本软件是由RednaxelaFX以现状("as is") 提供,
19. * 本软件包装不负任何明示或默示之担保责任,包括但不限于就适售性以及特定目
20. * 的的适用性为默示性担保。RednaxelaFX无论任何条件、
21. * 无论成因或任何责任主义 、无论此责任为因合约关系、无过失责任主义或因非违
22. * 约之侵权(包括过失或其他原因等)而 起,对于任何因使用本软件包装所产生的
23. * 任何直接性、间接性、偶发性、特殊性、惩罚性或任 何结果的损害(包括但不限
24. * 于替代商品或劳务之购用、使用损失、资料损失、利益损失、业务 中断等等),
25. * 不负任何责任,即在该种使用已获事前告知可能会造成此类损害的情形下亦然。
26. */
27.
28.using System;
29.using System.Collections.Generic;
30.using System.IO;
31.using System.Text;
32.
33.namespace FFDSystemAnalysis
34.{
35. enum TokenType
36. {
37. Decimal = 0x080,
38. Identifier = 0x081,
39. Hexadecimal = 0x082,
40. String = 0x083,
41. Operator = 0x085
42. }
43.
44. sealed class ScriptDecompiler
45. {
46. private static readonly byte[ ] SIGNATURE = {
47. ( byte ) 0x54, ( byte )0x4F, ( byte )0x4B, ( byte )0x45,
48. ( byte )0x4E, ( byte ) 0x53, ( byte )0x45, ( byte )0x54,
49. ( byte )0x64, ( byte )0x0, ( byte )0x0, ( byte )0x0
50. };
51.
52. static void Main( string[ ] args ) {
53. if ( !args[ 0 ].EndsWith( ".tkn" ) ) return;
54. if ( !File.Exists( args[ 0 ] ) ) return;
55.
56. string infile = args[ 0 ];
57. string outfile = Path.GetFileNameWithoutExtension( infile ) + ".txt";
58.
59. Encoding utf16le = new UnicodeEncoding( false, true );
60. Encoding jis = Encoding.GetEncoding( 932 );
61.
62. using ( BinaryReader reader = new BinaryReader( File.OpenRead( infile ), jis ) ) {
63. using ( BinaryWriter writer = new BinaryWriter( File.Create( outfile ), utf16le ) ) {
64. byte[ ] sig = reader.ReadBytes( SIG
|