写一个小程序:
(defun C:TTT() (SETQ A 8)(PRINC "TTT"))
(defun C:AAA() (PRINC "AA"))
(defun C:ccc() (PRINC "c"))
编译后解码:
Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F
00000000   0D 0A 20 46 41 53 34 2D  46 49 4C 45 20 3B 20 44      FAS4-FILE ; D
00000010   6F 20 6E 6F 74 20 63 68  61 6E 67 65 20 69 74 21   o not change it!
00000020   0D 0A 34 37 0D 0A 36 20  24 14 00 00 00 00 32 08     47  6 $     2
00000030   06 05 00 09 04 00 35 01  03 00 03 16 14 00 00 00         5         
00000040   00 09 02 00 35 01 03 00  03 16 14 00 00 00 00 09       5           
00000050   01 00 35 01 03 00 03 16  24 0D 0A 32 34 36 20 39     5     $  246 9
00000060   20 24 14 01 01 01 00 32  00 32 51 2A 39 01 00 5B    $     2 2Q*9  [
00000070   43 3A 43 43 43 00 43 3A  41 41 41 00 00 56 76 6C   C:CCC C:AAA  Vvl
00000080   2D 41 43 41 44 2D 64 65  66 75 6E 00 00 5B 43 3A   -ACAD-defun  [C:
00000090   54 54 54 00 00 01 01 43  00 00 06 00 0A 32 21 32   TTT    C     2!2
000000A0   2F 2A 32 13 32 21 2A 32  00 32 13 2A 39 03 00 55   /*2 2!*2 2 *9  U
000000B0   02 00 01 00 63 02 00 41  41 5B 50 52 49 4E 43 00       c  AA[PRINC
000000C0   00 55 01 00 03 00 54 54  54 5B 41 00 00 5C 00 00    U    TTT[A  \  
000000D0   43 00 00 06 00 0A 5C 00  00 32 21 5B 43 3A 43 43   C     \  2![C:CC
000000E0   43 00 00 3A 5C 00 00 32  13 5B 43 3A 41 41 41 00   C  :\  2 [C:AAA
000000F0   00 3A 5C 00 00 32 00 5B  43 3A 54 54 54 00 00 3A    :\  2 [C:TTT  :
00000100   01 43 06 00 03 00 1C 14  01 00 00 00 09 05 00 0A    C              
00000110   57 00 00 00 00 09 08 00  06 04 00 09 04 00 35 01   W             5
00000120   03 00 01 0A 09 04 00 0A  57 00 00 00 00 09 07 00           W      
00000130   06 02 00 09 02 00 35 01  03 00 01 0A 09 02 00 0A         5         
00000140   57 00 00 00 00 09 06 00  06 01 00 09 01 00 35 01   W             5
00000150   03 00 01 0A 09 01 00 16  15 00 0A 58 3D EF 83 0A              X=飪
00000160   3B 66 61 73 34 20 63 72  75 6E 63 68 0A 3B 24 3B   ;fas4 crunch ;$;
00000170   41 31 32 2F 36 2F 31 38                            A12/6/18
可以看出这三个自定义函数的代码如下:
14 00 00 00 00 32 08 06 05 00 09 04 00 35 01 03 00 03 16
14 00 00 00 00 09 02 00 35 01 03 00 03 16
14 00 00 00 00 09 01 00 35 01 03 00 03 16

在cad2008下加载,然后用感叹号获取函数的编号
命令: !c:ttt
#<SUBR @165644ec C:TTT>
命令: !c:aaa
#<SUBR @165644d8 C:AAA>
命令: !c:ccc
#<SUBR @165644c4 C:CCC>
用od查看从165644c4开始的内存,很明显是个链表:
165644C4  04 62 C1 0F 00 00 00 00 20 35 55 16 F8 D7 EA 10  b?.... 5U?
165644D4  21 00 00 00 04 62 C1 0F 00 00 00 00 68 12 83 15  !...b?....h?
165644E4  F8 D7 EA 10 13 00 00 00 04 62 C1 0F 00 00 00 00  ?...b?....
165644F4  80 12 83 15 F8 D7 EA 10 00 00 00 00   
可以看出每个函数占用20个字节,对齐了看
c:ccc函数是:
165644C4:  04 62 C1 0F 00 00 00 00 20 35 55 16 F8 D7 EA 10 21 00 00 00
c:aaa函数:                                    
165644D8:  04 62 C1 0F 00 00 00 00 68 12 83 15 F8 D7 EA 10 13 00 00 00
c:ttt函数:                                    
165644EC:  04 62 C1 0F 00 00 00 00 80 12 83 15 F8 D7 EA 10 00 00 00 00
                                     ....
第一个字04 62 C1 0F是相同的,能找到好多个,远多于我们的函数个数3,应该是链表指针,和单个fas无关。
第二个字 00 00 00 00都是0,不研究
第三个字20 35 55 16 各不相同,推测可能存放的是函数名,实验中也找到了C:CCC,证明推测是对的。
第四个字F8 D7 EA 10只有三个是相同的,本程序定义了三个函数,这个字应该是和fas相关的,重点研究它。
第五个字21 00 00 00是函数代码的偏移值,调用函数时会访问到这个地址。
用od看一下第四个字指向的内存地址,发现还是个链表:
10EAD7F8:  F0 43 C1 0F 00 00 00 00 00 A4 62 16 47 00 00 00 06 00 00 00
第一个字F0 43 C1 0F应该是链表指针,不管它。
第二个字是0,也不管
第三个字是00 A4 62 16有点意思,重点研究
第四个字是47 00 00 00,很小,应该表示的是某个偏移、大小
第五个字是06 00 00 00,它是本函数前面的字数,乘以四再加上第三个字就是本函数的开始地址。
0x1662A400+6*4=0x1662A418,就是函数开始地址。一个文件中有多个函数时,还要加上第一个链表中的第五个字才是函数开始地址。
用od看第三个字指向的内存地址:
1662A400  C8 C9 5A 16 98 DF 55 16 A8 DF 55 16 58 79 7F 15  壬Z樳UㄟUXy
1662A410  B8 DF 55 16 98 12 83 15 14 00 00 00 00 32 08 06  高U??....2
1662A420  05 00 09 04 00 35 01 03 00 03 16 14 00 00 00 00  ...5.....
1662A430  09 02 00 35 01 03 00 03 16 14 00 00 00 00 09 01  ..5......
1662A440  00 35 01 03 00 03 16 00 00 00 00 00 00 00 00 00  .5..........
1662A450  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
1662A460  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
1662A470  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
1662A480  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
1662A490  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
1662A4A0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
1662A4B0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
1662A4C0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
1662A4D0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
1662A4E0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
1662A4F0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
1662A500  68 C9 5A 16 20 35 55 16 68 12 83 15 E8 4F E4 10  h蒢 5Uh?鐿?
1662A510  80 12 83 15 00 00 00 00 C4 44 56 16 D8 44 56 16  
1662A520  EC 44 56 16 14 01 01 01 00 32 00 32 51 2A 39 01  霥V.2.2Q*9
1662A530  00 5B 43 3A 43 43 43 00 43 3A 41 41 41 00 00 56  .[C:CCC.C:AAA..V
1662A540  76 6C 2D 41 43 41 44 2D 64 65 66 75 6E 00 00 5B  vl-ACAD-defun..[
1662A550  43 3A 54 54 54 00 00 01 01 43 00 00 06 00 0A 32  C:TTT..C....2
1662A560  21 32 2F 2A 32 13 32 21 2A 32 00 32 13 2A 39 03  !2/*22!*2.2*9
1662A570  00 55 02 00 01 00 63 02 00 41 41 5B 50 52 49 4E  .U..c.AA[PRIN
1662A580  43 00 00 55 01 00 03 00 54 54 54 5B 41 00 00 5C  C..U..TTT[A..\
1662A590  00 00 43 00 00 06 00 0A 5C 00 00 32 21 5B 43 3A  ..C....\..2![C:
1662A5A0  43 43 43 00 00 3A 5C 00 00 32 13 5B 43 3A 41 41  CCC..:\..2[C:AA
1662A5B0  41 00 00 3A 5C 00 00 32 00 5B 43 3A 54 54 54 00  A..:\..2.[C:TTT.
1662A5C0  00 3A 01 43 06 00 03 00 1C 14 01 00 00 00 09 05  .:C......
1662A5D0  00 0A 57 00 00 00 00 09 08 00 06 04 00 09 04 00  ..W.........
1662A5E0  35 01 03 00 01 0A 09 04 00 0A 57 00 00 00 00 09  5.....W.....
1662A5F0  07 00 06 02 00 09 02 00 35 01 03 00 01 0A 09 02  ....5...
1662A600  00 0A 57 00 00 00 00 09 06 00 06 01 00 09 01 00  ..W.........
1662A610  35 01 03 00 01 0A 09 01 00 16                    5....

在这里看到我们熟悉的东西,但代码前面多了很多莫名其妙的数据,蓝色的部分是我们的程序中没有的。
再来看看lsp的情况:
建立一个小程序ttt.lsp
内容如下:
(defun C:TTT() (SETQ A 8)(PRINC "TTT")) (defun C:AAA() (PRINC "AA")) (defun C:ccc() (PRINC "c"))
用(load "ttt.lsp")加载
执行命令 !c:ttt
显示#<SUBR @10bebc44 C:TTT>
查看0x10bebc44这个内存地址,内容如下:
10BEBC44:04 62 93 10    00 00 00 00     50 8B BF 0F    44 D2 AA 10    00 00 00 00  
查看这张表的第四项是0x10AAD244
10AAD244:F0 43 93 10    00 00 00 00     00 85 B2 10    2A 00 00 00    05 00 00 00                                 
查看这张表的第三项是0x10B28500,第五项是05
10B28500  18 EE C1 0F 00 00 00 00 68 8B BF 0F 68 21 C0 0F  
10B28510  F8 28 AF 10 17 01 00 32 08 0B 06 02 00 0A 09 03  
10B28520  00 09 04 00 34 01 03 21 00                     
C:TTT函数的开始地址是:
0x10B28500+5*4=0x10B28514
查看0x10B28514这个地址的内容:
10B28514:17 01 00 32 08 0B 06 02 00 0A 09 03   00 09 04 00 34 01 03 21  
32 08 0B 06 02 00 0A就是(SETQ A 8)
09 03 00 09 04 00 34 01 03 21 00就是(PRINC "TTT")
再试验一个,!c:aaa
#<SUBR @10bebc6c C:AAA>
第一张表
10BEBC6C:04 62 93 10  00 00 00 00  B0 8B BF 0F 6C D2 AA 10  00 00 00 00                                    
第二张表
10AAD26C:  F0 43 93 10  00 00 00 00  00 FA AD 10   1F 00 00 00   04 00 00 00  
函数开始地址:                                    
0x10adfa00+4*4=0x10adfa10
10ADFA00  68 D2 C1 0F  00 00 00 00  A8 21 C0 0F  F8 28 AF 10  
10ADFA10  17 01 00 09 02 00 09 03 00 34 01 03 21 00        
看来函数的代码都是17开头的,09 02 00 09 03 00 34 01 03 21 00是(PRINC "AA")

研究了几天内存,得出如下结论:
1.lsp程序在加载以后是按函数分散的内存中的,同一个lsp文件的函数并不挨在一起,不存在完整的lsp文件
2.fas文件所有的函数都挨在一起,可以一次挖出来反编译。
3.lsp在内存中存放的不是源码,是经过编译的代码,这种代码用来更多的指令,因此比fas反编译难度要高。

转载于:https://www.cnblogs.com/dianziguan/p/10239957.html

内存中的fas和lsp相关推荐

  1. cad自动运行dvb lisp_CAD-如何自动加载dvb、vlx、fas、lsp、arx文件

    CAD如何自动加载dvb.vlx.fas.lsp.arx文件 1.先把要加载的dvb.vlx.fas.lsp.arx文件复制到support目录下,然后在support目录下的acad200x.lsp ...

  2. python slice是共享内存吗_在共享内存中使用numpy数组进行多处理

    在共享内存中使用numpy数组进行多处理 我希望在共享内存中使用numpy数组,以便与多处理模块一起使用.困难之处在于它像一个numpy数组一样使用,而不仅仅是作为一个ctype数组使用.from m ...

  3. 整数中内存中的保存方式:大端、小端

    一个数在计算机内存中的保存方式是大端法表示还是小端法表示? 首先C++当中并没有规定我们这个内存中,整数在内存中是采用大端法还是小端法表示.所以在编写程序的时候这一点并不是很重要. 但是如果编写一个程 ...

  4. C:内存中供用户使用的存储空间

    内存中供用户使用的存储空间可分为: 代码区:存代码的地方. 常量区:存常量的地方. 静态存储区:存变量的地方. 动态存储区:存变量的地方. 存变量的分为静态存储和动态存储两个区: "静态&q ...

  5. OpenCV中图像以Mat类型保存时各通道数据在内存中的组织形式及python代码访问各通道数据的简要方式...

    OpenCV中图像以Mat类型保存时各通道数据在内存中的组织形式及python代码访问各通道数据的简要方式 以最简单的4 x 5三通道图像为例,其在内存中Mat类型的数据组织形式如下: 每一行的每一列 ...

  6. 程序在内存中运行的奥秘

    简介 当丰富多彩的应用程序在计算机上运行,为你每天的工作和生活带来便利时,你是否知道它们是如何在计算机中工作呢?本文用形象的图表与生动的解释,揭示了程序在计算机中运行的奥秘. 内存管理是操作系统的核心 ...

  7. 突然挂了!Redis缓存都在内存中,这下完了!

    我是Redis,一个叫Antirez的男人把我带到了这个世界上. "快醒醒!快醒醒!",隐隐约约,我听到有人在叫我. 慢慢睁开眼睛,原来旁边是MySQL大哥. "我怎么睡 ...

  8. 20 亿个数字在 4G 内存中如何去重排序:快来试一试 BitMap

    作者 l 会点代码的大叔(CodeDaShu) 有一道流传广泛的面试题: 给你一台 4G 内存的机器,一组 20 亿个无序正整数,如何快速地判断一个正整数 N 是否在这组数字中?或者如何快速地对这组数 ...

  9. 补码还原为原码c语言,C语言知识汇总 | 12-整数(有、无符号数)在内存中的存储——原码、反码与补码...

    加法和减法是计算机中最基本的运算,计算机时时刻刻都离不开它们,所以它们由硬件直接支持.为了提高加减法的运算效率,硬件电路要设计得尽量简单. 对于有符号数,内存要区分符号位和数值位,对于人脑来说,很容易 ...

最新文章

  1. rundll32.exe文件详解
  2. 7-21 求前缀表达式的值
  3. Memory与Merge特性
  4. java url参数转换:_提示:通过URL激活并发送参数
  5. Python 练习册,每天一个小程序
  6. 功放音量调节原理_玩汽车音响,功放和喇叭,应该如何做好匹配?
  7. myEtherWallet在线钱包的使用
  8. c语言发牌小游戏,大家想想怎么用c实现我们经常玩的斗地主游戏的发牌过程呢?...
  9. python读音-原来Python应该这么念,怪不得总被嘲笑~
  10. Machine Learning(Andrew)Week6(上)
  11. HDU-1212-Big Number【大数】
  12. U盘插到电脑上显示设备和打印机
  13. python方向键 ubuntu,ubuntu|linux下 如何用python 模拟按键
  14. python 方差_python 方差_python 方差齐性检验_方差 python - 云+社区 - 腾讯云
  15. VBS 对IBM Notes的常规操作
  16. 实现游戏的读档和存档
  17. 2018NOIOJ网站入门题表(大礼包汇总,更新ing)
  18. cmake 添加asan功能
  19. python假期培训班
  20. excel 序号下拉不能够自动(递增)排序

热门文章

  1. linux安装java路径_Linux环境中查看java的安装路径,设置环境变量
  2. 支付宝mysql集群_支付宝支撑2135亿成交额的数据库架构原理
  3. Oracle 备份shell,oracle数据库shell备份脚本
  4. kali没有arpspoof命令_windows环境下使用python3命令
  5. axios传递数据到java_axios 传输与springboot后台接收数据
  6. php 转义md5 和java 转译的区别_CTF|PHP中的命令参数注入
  7. php自定义函数表格,自定义函数table()
  8. python函数参数冒号_Python3 - 参数中的冒号和箭头
  9. android fota解决方案,Android智能终端FOTA方案的制作方法
  10. 双链表(线性表的链式存储)---C语言版