- 积分
- 36704
- 明经币
- 个
- 注册时间
- 2013-8-16
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
楼主 |
发表于 2018-9-12 19:16:30
|
显示全部楼层
本帖最后由 baitang36 于 2018-9-13 05:50 编辑
研究到现在,似乎遇到瓶颈了。
现在可以猜测出很多指令,可以反编译回去,如 09 01 00 06 0200这样的就是(setq xxx yyy)
但如果用程序来反编译,就会遇到大量的未知指令。
程序是没法自己去猜测的。通过试验来确定某个指令编译后的样子也不太靠谱,因为无法做到写出的源代码能够编译出所有的指令,并且这样做效率也太低。
那怎么办?只能通过研究acad.exe对fas文件的调用、处理过程了。
授人以鱼不如授人以渔,把我的方法写出来,感兴趣者一起研究吧。
我的研究方法如下:
运行AutoCAD2008,打开od,附加acad.exe进程,设置打开文件断点bp CreateFileA,然后设置读文件断点bp ReadFile,按F9让CAD正常运行,然后(load “ttt.fas”)加载ttt.fas,程序运行到CreateFileA断点停下,看一下,确实是打开ttt.fas,再按F9,程序停在readfile断点,可以看到是读取1000个字节到缓冲区。
记下缓冲区地址,按Ctrl+F9执行到返回,看一下缓冲区的内容,确实是文件ttt.fas的内容。然后在缓冲区的解码部分(一般是14 01 01 01 00)设置硬件访问断点,程序读取这个位置会停下,发现是调用了memcopy函数,程序VL会把这段内容复制到另一个地址,在这个地址设置硬件访问断点,程序运行到操作这段代码时暂停。
终于找到关键的地方了。这里的程序反汇编是这样的
mov al,byte ptr ds:[edi+esi];读取一个字节
add esi,ebp ;计数器加一
movzx ecx,al ;字符放到cl中
add ecx,-0x1 ;字符数值减一
cmp ecx,0x69 ;比较字符的值是否大于6AH
ja short vl.0C228932 ;大于6A是非法字符,转错误处理
jmp dword ptr ds:[ecx*4+0xC22A328] ;合法指令,转到对应地址去处理
由这段程序可以看出,fas指令的合法字符是01-6Ah,每个指令对应一段处理程序。程序的入口地址存放在[ecx*4+0xC22A328] 处的一张表中,这里的ecx是指令减一,如指令09 处理程序的入口地址就是【(9-1)*4+0xc22a38h】,这是我跟踪时的地址,不同的电脑可能是不同的。
研究这张表中的所有子程序,就可以知道fas的每一个指令是如何处理的。这样就可以充分地了解fas的106个指令。
这是一件很考验毅力的事情。
|
|