acaddoc.lsp病毒破防
定义:
acaddoc.lsp病毒,其实不够资格叫病毒,只能说是利用程序自动加载的特点的恶意代码。其感染其他lisp文件一般设置开头标识,采用追加方式(算是业界良心了)。
破点:
acaddoc.lsp是lisp源码文本文件,故其是可解析破解的(当然这要有多无聊才做的事情)。而其升级版本是用fas保存源码,但在acaddoc.lsp至少存在加载语句。(做lisp恶意代码也是要多无聊才做的事情)
防点:
一般代码,避免无限次复制自己,都设置了标识。利用这个标识,可以作为代码欺骗防止感染。
我是有多无聊——还写贴说破防
粗暴做法一,全盘扫描,查杀之,但对于在服务器上画图,且有读写权限设置的情况下,是会次次感染的。
粗暴做法二,对感染目标文件设置只读属性。程序不写入文件,也写入了内存。治标之策而已。
精确破防:
本人恰好遇到两个acaddoc.lsp病毒,花了些时间破解了。病毒文件不会上传的。
不细说,直接上代码- ;解决病毒一
- ;此处插入删除当前目录下的acad.fas,acaddoc.lsp
- (if (and acaddocpath (setq virus-file (findfile (strcat acaddocpath "\\acad.fas"))))
- (progn (attset virus-file 0)
- (if (vl-file-delete virus-file) (princ (strcat virus-file "删除\n")));先删除acad.fas
- ));if
-
- (if (and acaddocpath (setq virus-file (findfile (strcat acaddocpath "\\acaddoc.lsp"))))
- (progn (attset virus-file 0)
- (if (vl-file-delete virus-file) (princ (strcat virus-file "删除\n")));先删除acad.fas
- ));if
-
- ;删除临时文件夹里acaddoc.lsp 和 menuname所定位置的acad.mnl acaddoc.lsp
- (setq mnlpth (getvar "menuname"))
- (setq dwgpre (getvar "dwgprefix"))
-
- (if (setq virus-file (findfile (strcat dwgpre "acaddoc.lsp")))
- (progn (attset virus-file 0)
- (if (vl-file-delete virus-file) (princ (strcat virus-file "删除\n")));先删除acaddoc.lsp
- ));if
-
- (if (setq virus-file (findfile (strcat mnlpth ".mnl")))
- (progn (attset virus-file 0)
- (if (vl-file-delete virus-file) (princ (strcat virus-file "删除\n")));先删除acaddoc.lsp
- ));if
-
- (if (setq virus-file (findfile (strcat mnlpth "doc.lsp")))
- (progn (attset virus-file 0)
- (if (vl-file-delete virus-file) (princ (strcat virus-file "删除\n")));先删除acaddoc.lsp
- ));if
其中函数 attset 是病毒自带的(还写错了),设置文件属性作用——利用文件系统对象,本人修正,奉上- (defun attset (fp code / fp1 )
- (if (and fp (/= "" fp) code)
- (progn (vl-load-com)
- (vlax-put-property
- (setq fp1 (vlax-invoke-method
- (vlax-create-object "Scripting.FileSystemObject")
- 'GetFile
- fp
- )
- )
- 'Attributes
- code
- )
- (vlax-release-object fp1);源代码此句放置在if外,逻辑错误
- );progn
- );if
- );defun
需要这个属性设置函数将要删的文件属性设置为0.
同时,给一个attget函数,获取文件属性值。用于设置只读的文件需要追加标识的时候。- (defun attget (fp / fp1 attr)
- (if (and fp (/= "" fp) )
- (progn (vl-load-com)
- (setq attr (vlax-get-property
- (setq fp1 (vlax-invoke-method
- (vlax-create-object "Scripting.FileSystemObject")
- 'GetFile
- fp
- )
- )
- 'Attributes
- ));setq attr
- (vlax-release-object fp1)
- )
- )
- attr
- );defun
解决病毒一里提供的目录都是根据病毒源文件调整的,是精确破杀。此文其同时解决了病毒二的源文件
接下来是设置防毒标识
子程序 app(target bz) 源代码详见附件
1,根据标识代码,检查目标文件target,如果有标识,且其后还有多行代码,则说明此中毒已深,修复之。否则提示已经修复。
2,如果没有标识,则设置标识。在追加方式打开target之前,读取其文件的属性,不判断,直接设置属性为0,追加后,再将属性改回去。
主程序 killvirus
根据病毒源代码的感染方式,主要是获取其感染目录,进行防毒。- (setq bz "(setq flagx t)") ;bz为标识,为病毒开头
- (if (setq acadmnl (findfile "acad.mnl"));寻找acad.mnl
- (progn
- (setq acadmnlpath (vl-filename-directory acadmnl))
- (setq mnlfilelist (vl-directory-files acadmnlpath "*.mnl"));取得该文件下的所有mnl文件。生成文件名列表,存为mnlfilelist中。
- (setq mnlnum (length mnlfilelist));mnlnum为mnl文件个数。
- ));if
- (setq acadexe (findfile "acad.exe"))
- (setq acadpath (vl-filename-directory acadexe))
- (setq support (strcat acadpath "\\support"));在acad.exe目录下进入support文件夹
- (setq lspfilelist (vl-directory-files support "*.lsp"))
- ;(setq lspfilelist (append lspfilelist (list "acaddoc.lsp")))
- (setq lspnum (length lspfilelist));lspnum为support文件夹下lsp文件个数。
- (if dwgpath
- (progn
-
- (if mnlnum
- (progn
- (setq mnln 0);mnln为序数,对上述mnl路径下的所有mnl进行感染操作。
- (while (< mnln mnlnum)
- (setq mnlfilename (strcat acadmnlpath "\" (nth mnln mnlfilelist)));mnlfilename为感染目标,全名。
-
- (app mnlfilename bz);
- (setq mnln (1+ mnln))
- );while
- (princ (strcat "\n检查mnl文件数:" (itoa mnlnum)));退出循环时,输出检查文件数
- ));if mnlnum
- (if lspnum
- (progn
- (setq lspn 0)
- (while (< lspn lspnum)
- (setq lspfilename (strcat support "\" (nth lspn lspfilelist)))
-
- (app lspfilename bz)
- (setq lspn (1+ lspn))
- );while
- (princ (strcat "\n检查lsp文件数:" (itoa lspnum)));退出循环时,输出检查文件数
- ));if lspnum
-
- );progn
- );if
- (princ)
结果:本代码成功通过测试。详附图。
结论:
AutoCAD2014已经设置acaddoc.lsp自动加载的控制变量。
鉴于acaddoc.lsp加载次序在acad20xxdoc.lsp之后,可以设置自动加载(load "killvirus.lsp"),由于其精确破防,增加的加载时间,是可以忽略的。
|