土木在线论坛 \ 建筑结构 \ 武汉老庄结构院 \ CAD源程序文件格式深入探讨

CAD源程序文件格式深入探讨

发布于:2010-04-18 16:44:18 来自:建筑结构/武汉老庄结构院 [复制转发]
先介绍以下几种文件:
1、lsp文件
lsp文件是lisp源程序文件的扩展名,这种文件在运行时需要翻译成中间代码才能在cad上执行,这种中间代码相当于fas的代码,在加载完lisp文件后,lisp文件被翻译成中间

代码,驻留在内存中,这时我们可以在内存中看到这段代码,所以有网友在说lisp文件运行快还是fas文件运行快,运行是差不多的,只是lisp文件在加载的时候需要被翻译成中间

代码,消耗了一点时间,运行完全是和fas文件一样的。
2、fas文件
fas文件称为一种快速加载文件,这种文件省去了加载时的翻译时间,所以相对较快一些,vlx和fas文件是autocad公司自己设计开发的一种文件。由于文件被翻译成中间代码

,也保护了开发者的版权,但是这种文件并不是完全没有漏洞的,fas文件把资源代码加密成不直接可见的代码,但我们想一下,他既然能加密,在调用的时候当然要解密资源,这

一点大家都可以验证一下,用内存工具打开内存可以看到这些代码。
3、关于vlx
vlx相当于lsp、fas等资源文件的打包文件,在打包的时候先判断是否有lsp文件,如果有的话,先编译成fas文件,然后把fas文件和其他资源一起打入包内,vlx也是经过仔细

设计出来的文件,里面包含了很多校验,但是比起fas文件,vlx要容易的多,还想提一点就是vlx的限制:首先就是各个文件的文件名:当然是字符串了,字符串长度不能大于23个

,包含24,中文减半,否则编译的时候会提示你,vlx把资源打入包内省去了路径的设置,方便管理,可以说是大家的好帮手。如果要研究包内的fas文件,首先是要把包内的fas解

包出来,当然这一步不是很难,到时候会仔细介绍这一步。
我想下面要好好准备一下写fas文件格式了,这对我来说很难,因为很多地方我也是一知半解,但希望能开阔大家的思路,fas文件应该是采用了某种文件格式,但是对文件格式

我研究不多,里面的大部分指令都是为了加快cad执行速度的,几乎所有的数据都采用十六进制,当然也有少部分是10进制,所以先给大家介绍一下这些工具,大家先学一下,熟悉

一下工具的使用,到时候大家不要问工具使用方面的问题,大家先看一下这些工具:
1、OllyDbg,一款动态调试软件
2、winhex,一款强大的支持内存编辑的十六进制软件,必须熟悉这个工具,数据的复制,选择等
首先还是熟悉一些基本常识:
1、进制
十进制:123456
十六进制:0x123456
二进制:对于fas我们用不上,不介绍了
通常fas文件里面用到了这两种进制的表示方法,fas文件大部分都是用十六进制表示,是因为十六进制是一种比较高效的表示,一位能存放的最大数是f,相对于十进制的16,

cpu认为十六进制是他本身的表示方法,所以fas为了提高效率也用了这种方法,而对于我们则不方便。
2、数据存储
如果熟悉这方面的朋友可以略过,比如一个大小为三字节的数据:0x01E240,整数为123456,在fas文件内的存放顺序是这样的:0x40 0xE2 0x01 正好相反了,也就是说高位

放在后面,低位放到前面。
3、基本数据类型
字节(Byte)为一个字节,占用两位、字(Word,占两个字节,占4位)和双字(Dword,四个字节,占8位),Word和Dword相当于无符号的整型和无符号长整型。
4、下面介绍fas文件结构
首先我们在vlide中敲入如下代码:
(alert "hello world")
然后保存为first,编译,然后用winhex打开这个文件,得到如下:
首先把winhex设置为10进制表示偏移显示:
Offset 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
00000000 0D 0A 20 46 41 53 34 2D 46 49 4C 45 20 3B 20 44
00000016 6F 20 6E 6F 74 20 63 68 61 6E 67 65 20 69 74 21
00000032 0D 0A 31 0D 0A 31 20 24 20 24 0D 0A 38 32 20 34
00000048 20 24 13 FF 73 54 E7 4B 31 6F 15 38 7E 15 43 4A
00000064 4B 52 49 4E 28 64 3F 58 CF 43 55 E7 2C 30 5D 0F
00000080 12 26 67 27 77 66 68 69 6D 63 30 32 07 FE 76 55
00000096 ED 78 6D 5D 07 51 47 14 42 11 0D 1A 4E 0F 62 31
00000112 71 1B EA 73 55 E7 79 38 5E 07 18 4E 16 43 24 06
00000128 1A 0D 08 74 15 4A 4D B3 C1 94 73 0A 3B 66 61 73
00000144 34 20 63 72 75 6E 63 68 0A 3B 24 3B 41 31 2F 34
00000160 2F 30 37
首先文件头是一个标志:FAS4-FILE,确保是fas文件,Do not change it!提示不要修改他,前两行解决了。
下面看第三行:
..1..1 $ $..82 4
第一个1是用户自定义函数代码的长度,第二个是字符串个数,如果都是1的话代表没有定义函数,由于刚才我们只写了一句代码,所以没有自定义函数,如果有defun语句的出

现,这里就不是1了。
82:代表包括字符串在内的所有初始化代码的长度,包括这一句(alert "hello world"),注意这里是十进制表示。
4:代表字符串的个数,很奇怪,我只有三个字符串,而他确显示4个,如果有研究过的能否指出是否正确,注意这里是十进制表示。
下面解读第四行:
00000048 20 24 13 FF 73 54 E7 4B 31 6F 15 38 7E 15 43 4A
第一个字节是20,表示流的开始(流的概念我也说的不是很清楚,感觉这样表述比较贴切,也就是说一段代码的开始),后面是我们需要的代码,而现在看起来什么都看不出

来,不急,我们待会再来讲怎么解码的。那么这段代码有多长呢?刚才在第三行我们看到了:82是代码的长度,所以这段代码的长度是82个字节,我们从00000050开始选择82个字

节长度的区域,复制下来得到如下:
Offset 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
00000048 13 FF 73 54 E7 4B 31 6F 15 38 7E 15 43 4A
00000064 4B 52 49 4E 28 64 3F 58 CF 43 55 E7 2C 30 5D 0F
00000080 12 26 67 27 77 66 68 69 6D 63 30 32 07 FE 76 55
00000096 ED 78 6D 5D 07 51 47 14 42 11 0D 1A 4E 0F 62 31
00000112 71 1B EA 73 55 E7 79 38 5E 07 18 4E 16 43 24 06
00000128 1A 0D 08 74
最后一个字节是74,看一下后面跟的是:字节15 ,注意这里是16进制表示,0x15=21(整数),这个表示解码密码的长度,也就是说后面长度0x15的流是密码,得到如下(用

来解码刚才那82个字节长度的流):
4A4DB3C194730A3B66617334206372756E63680A3B
后面$是一个结束标志,十六进制为24,然后跟的是fas文件编译的年月日。
有一点要说明一下:这个密码是随机的,大家编译得到的和我的略有不同,所以被加密后的代码上可能和我的不同,这不妨碍我们研究。

全部回复(2 )

只看楼主 我来说两句抢地板
  • method1984
    method1984 沙发
    知道一点了,至少看了作者的文章知道那些文件时怎么用的了
    2010-04-18 22:57:18

    回复 举报
    赞同0
  • reinforced
    reinforced 板凳
    相当佩服楼主 对编程序如此在行
    2010-04-18 22:33:18

    回复 举报
    赞同0
这个家伙什么也没有留下。。。

武汉老庄结构院

返回版块

10.49 万条内容 · 521 人订阅

猜你喜欢

阅读下一篇

新人请教!

刚入设计院!应该做什么准备啊?

回帖成功

经验值 +10