baitang36 发表于 2019-10-22 08:56:03

FAS程序的加载过程

本帖最后由 baitang36 于 2022-2-24 16:25 编辑

还是以 gys.lsp程序为例:
;改任何实体的颜色 (c)SYZ 1995.3.18
(defun c:gys ()
   (setq ss (ssget))
   (setq tcol (getstring
         "\n输入新颜色(回车为白色,也可以改为其他颜色):<W> "
       )
   )
   (IF (= tcol "")
   (setq tstyle "W")
   )
   (command "change" ss "" "p" "c" tcol "")
)
为叙述方便,程序源码一律用10进制,fas文件内容显示一律用16进制。也就是winhex的显示模式。
在AutoCAD2008下编译成fas文件,解码后内容如下:
Offset      01234567   89ABCDEF
00000000   0D 0A 20 46 41 53 34 2D46 49 4C 45 20 3B 20 44      FAS4-FILE ; D
00000010   6F 20 6E 6F 74 20 63 6861 6E 67 65 20 69 74 21   o not change it!
00000020   0D 0A 31 32 31 0D 0A 3134 20 24 14 00 00 00 00   12114 $   
00000030   35 00 0D 00 03 06 0C 0009 0B 00 35 01 0A 00 03   5          5   
00000040   06 09 00 03 09 00 09 0800 35 02 07 00 03 67 0B            5    g
00000050   00 00 00 09 06 00 06 0500 57 00 00 00 00 09 04            W      
00000060   00 51 01 03 00 01 00 0A03 0C 00 51 01 03 00 01    Q         Q   
00000070   00 0A 09 08 00 51 01 0300 01 00 0A 09 02 00 51      Q         Q
00000080   01 03 00 01 00 0A 09 0100 51 01 03 00 01 00 0A            Q      
00000090   03 09 00 51 01 03 00 0100 0A 09 08 00 51 01 03      Q         Q
000000A0   00 01 00 16 24 0D 0A 3235 30 20 35 20 24 14 01       $250 5 $
000000B0   01 01 00 32 00 32 21 2A39 01 00 56 76 6C 2D 41      2 2!*9Vvl-A
000000C0   43 41 44 2D 64 65 66 756E 00 00 5B 43 3A 47 59   CAD-defun[C:GY
000000D0   53 00 00 01 01 43 00 0004 00 0A 32 00 32 79 2A   S    C   2 2y*
000000E0   39 01 00 55 02 00 01 0063 01 00 70 56 61 64 73   9U    cpVads
000000F0   2D 63 6D 64 00 00 55 0100 06 00 63 68 61 6E 67   -cmdU    chang
00000100   65 5B 54 53 54 59 4C 4500 00 55 01 00 01 00 57   e[TSTYLEU    W
00000110   5B 3D 00 00 55 01 00 0000 5B 54 43 4F 4C 00 47   [=U    [TCOL G
00000120   45 54 53 54 52 49 4E 4700 00 55 01 00 2F 00 0A   ETSTRINGU/
00000130   CA E4 C8 EB D0 C2 D1 D5C9 AB 28 BB D8 B3 B5 CE   输入新颜色(回车?
00000140   AA B0 D7 C9 AB 2C D2 B2BF C9 D2 D4 B8 C4 CE AA   咨?也可以改为
00000150   C6 E4 CB FB D1 D5 C9 AB29 3A 3C 57 3E 20 5B 53   其他颜色):<W> [S
00000160   53 00 53 53 47 45 54 0000 5C 00 00 43 00 00 0E   S SSGET\C   
00000170   00 0A 5C 00 00 32 00 5B43 3A 47 59 53 00 00 3A   \2 :
00000180   01 43 04 00 01 00 1C 1401 00 00 00 09 03 00 0A    C            
00000190   57 00 00 00 00 09 04 0006 02 00 09 02 00 35 01   W             5
000001A0   01 00 01 0A 09 02 00 1618 0 E5 06 22 D2 CC 28            缅 "姨(
000001B0   CC 40 0A 3B 66 61 73 3420 63 72 75 6E 63 68 0A   藹 ;fas4 crunch
000001C0   3B 24 3B 41 39 2F 33 2F31 38                     ;$;A9/3/18
为叙述方便,把代码涂上颜色。
按功能区分可以分成几块,黄色的部分是文件头,绿色的是函数部分,紫色的是资源字符串部分,蓝色的是加载时执行的程序,红色的是密码部分。

程序加载的时候,vl.arx负责把gys.fas读到内存中,先检查是否加密,如果加密了就解密后执行,如果没加密就直接执行。
判断是否加密,是看密码(红色部分)第一个字节是否为0,如果为0,说明已经解密过了,直接执行。如果不是0,需要用密码对紫色部分和蓝色部分进行解密。
然后程序从第二个14处开始执行,第一个指令是14 01 01 01 00,说明这个函数带了一个参数,经过试验,这个参数是#<module>
紫色部分的作用是生成符号表,以后程序运行中的函数名、变量名、字符串都是用这张表中的序号来区分。
蓝色部分的作用是加载时执行的程序,本例中就是(defun c:gys () 这一句。


baitang36 发表于 2020-1-14 16:55:28

mdxcad 发表于 2019-10-25 08:47
有哪些时间还不如写点对工作有帮助的程序!

这个就有帮助啊

baitang36 发表于 2020-2-20 23:13:30

springwillow 发表于 2020-2-20 22:42
解密算法是什么?有没有破出来?

这就是破出来的

baitang36 发表于 2019-10-23 09:01:26

USER2128 发表于 2019-10-23 07:50
楼主厉害!我佩服你!
我支持楼主!

谢谢你的支持

东升铮 发表于 2019-10-22 09:45:21

真皮沙发!!

cable2004 发表于 2019-10-22 15:27:31

精神可嘉!!

flowerson 发表于 2019-10-22 19:58:05

还是看不太懂。

1028695446 发表于 2019-10-22 21:26:35

66666666666666

USER2128 发表于 2019-10-23 07:50:26

楼主厉害!我佩服你!
我支持楼主!

ssyfeng 发表于 2019-10-23 12:01:34

tongdaren 发表于 2019-10-23 12:34:50

分析的很好,基本看懂了

baitang36 发表于 2019-10-23 14:51:34

tongdaren 发表于 2019-10-23 12:34
分析的很好,基本看懂了

不得不说,你很聪明
页: [1] 2
查看完整版本: FAS程序的加载过程