快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14
) { 100. builder.Append( c ); 101. } 102. 103. return builder.ToString( ); 104. } 105. 106. static readonly byte[ ] zeros 107. = new byte[ ] { 0, 0, 0 }; 108. } 109. 110. struct Entry 111. { 112. public long position; 113. public string line; 114. public byte opcode; 115. public byte lastOpcode; 116. 117. public override string ToString( ) { 118. return string.Format( "0x{0:X} 0x{1:X} 0x{2:X} {3}", 119. this.position, this.lastOpcode, this.opcode, this.line ); 120. } 121. } 122.}

Quartett!的二进制脚本分析(3)

时间:2011-10-28 javaeye RednaxelaFX

这段代码本身没什么稀奇,只有第57行到62行的内容有点诡异:居然把变量赋值给自己了?

不不,再怎么说我也不可能犯这种错误。这其实是C# 3.0里的一个有趣语法,initializer。可以通过 initializer,在使用new关键字构造新实例的时候指定其中一些字段的值;等号左边的是字段名,右边则 是字面量或者变量名(或者表达式)。编译器能够正确识别出看似是同名字的token之间的区别,因而能 够正确赋值。好吧我承认这不是好的编程习惯,大家看到了千万不要学,要引以为戒……

另外,那个if里一大堆对currentByte的判断后来也重构到外面一个单独的MatchOpcode()方法里去了 。像上面这样写实在太恶心……也要引以为戒哦

虽然没什么稀奇,还是说下这个文件里的流程:

1、检查作为参数文件是否存在,并且是否后缀为tkn。检查不通过则退出程序。

2、获取一个Shift-JIS和一个UTF-16LE字符集的Encoding实例,并使用它们创建Shift-JIS的输入流和 UTF-16LE的输出流。

3、校验脚本文件的特征码(signature)。这里假设头12个字节都是特征码。

4、校验成功后,给输出流写出一个字节序标记(BOM,Byte Order Mark)。这本来应该不需要手工做 的,但我一直没弄清楚为什么我明明在创建utf16le时指定要BOM系统却不帮我自动做……

5、创建一个队列来记录最近的三个字节。使用一个变量(lastOpcode)来记录最近的第四个字节。

6、扫描文件直到遇到文件结束。如果遇到了连续的3个00,则读入其后的一个字节,并判断是否在 [0x80, 0x88]的范围内;满足的话则读入一个C string并输出记录。

7、程序结束。

于是我得到了更新版的记录:

(格式与前面相同)

Java代码

0x15 0xC 0x85 #
0x1C 0xC 0x81 base_path
0x2B 0xC 0x83 ../
0x34 0x16 0x85 #
0x3B 0x16 0x81 include
0x48 0x16 0x83 Script/BaseInstruction.txt
0x68 0x20 0x81 motion
0x74 0x20 0x81 Main

Quartett!的二进制脚本分析(4)

时间:2011-10-28 javaeye RednaxelaFX

于是我恍然大悟:那“奇怪的数字”居然是脚本源文件行号!而被认为是操作码或者类型的那个字节 ,则用于指定后面字符串的类型:可以是符号、十进制数字、十六进制数字、标识符、字符串、符号等。

但位于脚本的0xC到0xF的那个数字(上图紫色部分)是什么意思还让我伤了下脑筋。观察了一下,发 现从0a69b4afebd6d64527a21e3f1aa993f9.tkn提取出来的“东西”一共有1237个,而那意义不明的数字是 0x876 = 2166,还差了不少。但总觉得它们应该有关系。突然想起我前面是用了个很糟糕的办法来提取记 录,有连续的3个00字节才满足条件。但假如行号超过了0xFF = 255行的话这个条件就不成立了。赶紧把 程序修改为第三版,按照新的理解去读入“行号”和“类型”两个数据,确认那个数字确实就是文件里总 的token数。

然后我才理解了signature里那TOKENSET的含义……这看似是二进制的脚本其实根本没有编译过的二进

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号