springwillow
发表于 2018-9-10 21:51:23
baitang36 发表于 2018-9-10 17:00
有点大,600k左右的文件,工程量巨大。
那可以跟踪一下是如何解释执行的
baitang36
发表于 2018-9-11 06:50:39
springwillow 发表于 2018-9-10 21:51
那可以跟踪一下是如何解释执行的
用od跟踪过的
杜阳
发表于 2018-9-11 21:10:41
主要看看这个lisp代码加密转换成fas格式是怎么个过程
杜阳
发表于 2018-9-11 21:11:29
现在所有代码都开源了研究这样的课题也应该放开了 论坛比较开明了
土木燃
发表于 2018-9-12 08:27:07
楼主真牛逼!!!!!!!!
陨落
发表于 2018-9-12 13:06:43
springwillow 发表于 2018-9-10 08:40
楼主很厉害,支持一下。我以前也看过类似的贴子,是用python解密的,也贴出来供大家研究啊!
代码有问题,有没有原贴地址啊?
baitang36
发表于 2018-9-12 18:36:21
yxp 发表于 2018-9-8 15:20
你的fas解密后可以运行? 我试了一下我解出来的不能运行。
解密程序下载:
我找到能运行的关键位置了,就是key的第一个字节是否为0。
解码完成后,把这个字节改成0,acad会直接加载运行它,不需要再解密一次。
如果这个字节不为零,acad.exe就需要先解密它,然后再运行。
baitang36
发表于 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:;读取一个字节
add esi,ebp ;计数器加一
movzx ecx,al ;字符放到cl中
add ecx,-0x1 ;字符数值减一
cmp ecx,0x69 ;比较字符的值是否大于6AH
ja short vl.0C228932 ;大于6A是非法字符,转错误处理
jmp dword ptr ds: ;合法指令,转到对应地址去处理
由这段程序可以看出,fas指令的合法字符是01-6Ah,每个指令对应一段处理程序。程序的入口地址存放在 处的一张表中,这里的ecx是指令减一,如指令09 处理程序的入口地址就是【(9-1)*4+0xc22a38h】,这是我跟踪时的地址,不同的电脑可能是不同的。
研究这张表中的所有子程序,就可以知道fas的每一个指令是如何处理的。这样就可以充分地了解fas的106个指令。
这是一件很考验毅力的事情。
陨落
发表于 2018-9-13 12:00:07
真正的技术,楼主继续!!
kozmosovia
发表于 2018-9-13 12:02:07
这些函数是基础的LISP函数,有个对应表。早期的研究成果说好像是在FSL文件里面可以找到,当然也可以自己一个个编译找对应,纯粹的体力活。