快速业务通道

Quartett!的二进制脚本分析 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14
制脚本之魂。

编译的前端至少有两部,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

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号