1

我正在尝试编写一个与 Advent Axys、财务规划师软件等集成的程序。该产品的网站在这里: http: //www.advent.com/solutions/asset-managers-software/axys-platform

我需要将新条目写入价格文件,但其中大部分是二进制的。我在网上四处查看并没有找到太多,我通过电子邮件发送了他们的支持,但我怀疑它会有所帮助。

我有一个简短的虚拟文件和程序提供给所述文件的打印输出。我通过一个 ruby​​ 脚本运行文件,如果它是单词字符或符号,则打印字符,否则打印 ASCII val。这是 Ruby 脚本:

pri = File.read '062109_dummy.pri'
pri.each_byte do |char|
  print char.chr =~ /[\w!@#\$%\^&\*\(\)\-\\\/\+\.]/ ? char.chr : ' ' + char.to_s + ' '
end

并输出:


pri1.001 254  250  251  252  29  0  0  2 adusnok 0  0  0  0  0  0  0  0  0 33333s7@ 1  254  250  251  252  29  0  0  2 csusxom 0  0  0  0  0  0  0  0  0 H 225 z 20  174 GA@ 1  254  250  251  252  29  0  0  2 etusvv 0  0  0  0  0  0  0  0  0  0  246 (\ 143  194  213 F@ 1  254  250  251  252  29  0  0  2 fdusoakbx 0  0  0  0  0  0  0  174 G 225 z 20  174 (@ 1  254  250  251  252  29  0  0  2 oousfidde09 0  0  0  0  0  154  153  153  153  153  185 S@ 1  254  250251  252  29  0  0  2 qpusfid_eqix 0  0  0  0  164 p 61  10  215 cL@ 1  254  250  251  252  29  0  0  2 vausvg_sc 0  0  0  0  0  0  0 )\ 143  194  245  248 P@ 1 

请注意,如果数字周围有空格,则表示它是字节的值,如果没有,则字节的值是该数字的 ASCII 表示。

我知道字母串(如“adusnok”)是股票等的表示。然后是 0-ed 位,因为符号的空间是固定大小的(这就是为什么在较长的符号之后有较少的 0 的原因)。这个序列@ 1 254 250 251 252 29 0 0 2似乎意味着一个记录的结束,就在新记录的符号之前。或者,其中一些可能表示所有这些都相同的东西,但似乎没有多少相同。在那之后,我基本上什么都不知道了。我确实有程序认为映射到什么的打印输出。每列用 3 个空格分隔,即:

adus   nok   23.45   NOKIA CORP ADR   0.393  05/30/2008
csus   xom   34.56   EXXON MOBIL CORPORATION COM   1.68   06/10/2009
etus   vv    45.67   VANGUARD LRG CAP ETF US PRIME MKT 750   1.04   3/31/2009

还有更多,但这应该给你一个很好的主意。我认为描述和其他可能的东西很可能存储在其他文件中并且只是查找。但我知道价格在那个文件中,因为这些是价格文件,这就是重点。所以:

33333s7 => 23.45 H225 z 20 174 GA => 34.56 246 (\ 143 194 213 F => 45.67

请注意,将 3 和 7 保存在第一个中,所有数字都有字节的值,而不是值的 ASCII 表示。另请注意,这些值可能不仅仅代表价格,但它们绝对代表价格。

有任何想法吗?我不熟悉常见的二进制编码,但如果他们使用相当常见的方法,我不会感到惊讶。

4

1 回答 1

3

如果您要发布逆向工程编解码器,则逆向工程二进制格式是危险的。他们可能会在没有警告的情况下更改文件格式。但是,如果您有义务并决心这样做:

您可以做的一件事是查看 IEEE 浮点数的格式:

http://steve.hollasch.net/cgindex/coding/ieeefloat.html

然后,从文件的第一个字节开始,读取 4 或 8 个字节的数据。将这两个集合(4 字节和 8 字节)转换为浮点值和双精度值。检查它们是否与您知道的文件中的值匹配。如果是这样,您可能已经找到了价格的偏移量。打印出来,加上偏移量。如果不是,请将您的搜索增加一个字节,然后重试。

如果您可以通过这种方式找到所有值,那么您可以通过执行类似的操作在运行时安全地修补二进制文件:查找您知道的价格,然后在正确的位置修改价格值。

这根本不是万无一失的,因为随机的数据序列有时会匹配。如果您注意到偏移量之间有一定的距离,或者某些标记始终存在,或者甚至更好,如果您可以在文件中找到这些偏移值,那么您可能会有一些适度稳定的东西。

于 2009-06-25T20:15:53.083 回答