如何用 ruby 分析二进制文件,有可能不知道里面的数据结构!
先用弄清里面存的的是啥东东,知道结构的情况下,就好继续往下分析。 比如说,你要分析一个 ELF 文件,你必须先把 ELF 格式本身要了解吧。然后在此基础上对这个文件再进行进一步的分析。
ruby 对二进制数据分析的能力差一些,但是也是能分析的,就是麻烦,好像没有现成的库。这块 C 比较顺手。。。。 ruby 要用到内置的一个比较恶心,难懂的函数。。。我忘记是什么了。。。。-_-####
通过 FFI 调用系统 API 及分析二进制数据是很方便的。
还有一个是我写的一个 FFI 和 CStruct 联用的例子:
https://github.com/skandhas/cstruct/wiki/FFI-and-CStruct--%5Bwin32-example%5D
#15 楼 @stephen CStruct 的地址: https://github.com/skandhas/cstruct/ 你可以直接 gem install CStruct 的 align 目前支持 1 种,后续会增加其它的支持。 FFI 现在发展的很不错了。我个人觉得 FFI::Struct 描述结构体不是很直观。可以 FFI 和 CStruct 联用。像上面的例子。FFI 的功能十分强大,是 Ruby 调用 native 代码,分析二进制代码的利器,十分推荐使用。
想起来了:@skandhas @stephen 我当初用的是这个: http://rubygems.org/gems/bit-struct
写了点代码,能够将 C 的.h 文件自动转化为 bit-struct 的格式供 ruby 使用。一般的结构体都能解析。鉴于为公司做的,不敢开源。。。
#19 楼 @jinleileiking 恩,我以前也用 bit-struct. bit-struct 支持的功能很多,只是觉得它对 struct 的写法不是很直观,当时又不没找到合适的 gem,就自己又造了一个轮子,写了个 cstruct :( <也许我有心理强迫症> 哈哈
#17 楼 @hhuai http://hhuai.90tian.com/ 这个是不是不用了?改用http://github.com/hhuai 了?
@skandhas 有点问题请教 如果里面有 c++ 的类型呢?__time32_t
对于c++来说直接用__time32_t类型直接出来就是日期(vs2005中,这个代表32位时间类型值,在vc6中直接用time_t即可【vc2005中time_t代表64位时间值】)
起止地址 数据内容 数据含义 数据类型
18 - 21 31 41 30 30 30...FF 证券代码 Char[10]
22 - 25 B0 09 00 00 日线记录数 Integer
26 - 57 16 00 17 00...FF FF 记录块号 Word[25]
struct INDEX_DATA
{
char code[10];
int dayrecordnum;
unsigned short int reocrd[25];
};
我用 cstruct 代码如下
class INDEXDATA < CStruct
char :codes, [10] #18 - 21 31 41 30 30 30...FF 证券代码 Char[10]
int32 :dayrecordnum #22 - 25 B0 09 00 00 日线记录数 Integer
uint16 :records, [25] #26 - 57 16 00 17 00...FF FF 记录块号 Word[25]
end
读取后,这个 codes 要怎样输出呢,
#36 楼 @stephen 这样吧,如果不涉及商业机密的话,你可以把格式说明及这个 dat 文件发给我吗?我帮你看看。我对 Ruby 二进制解析比较感兴趣。我的 mail:[email protected]
@skandhas @jinleileiking http://blog.macd.cn/2149104/viewspace-49051 别人研究的数据结构,大智慧的日线文件太大了,或者请前辈们安装一个大智慧!