A introduction to the Experience of Antivirus Coding

总结下初学windows API编程杀毒的经历

Abstract:On the way of fighting with computer virus, I learned much. At the beginning, I used software tools wrote by others to kill virus manually, then I tried shell command to auto execute. At last, I learned to use windows api to help me to do this, it was effecient. In this blog, I will introduce to the antivirus windows api programming.

刚接触windowsAPI编程,就是缘于反病毒。由于学校内打印机是公用的,有个病毒一度爆发,病毒行为是自我复制到除系统盘以外的分区根目录(包含U盘,也正因如此,病毒在优盘根目录下写入了autorun.inf信息,当插入优盘,而系统又正好开启了硬件自动播放功能,就会自动执行病毒,导致了广泛传播),将原始文件夹全部设置为系统属性和隐藏属性,因而原始文件夹不可见,然后病毒伪装成原始文件夹,虽然没观察到有进一步恶意行为,但是对于没有开启隐藏文件夹可见的童鞋,还以为自己文件丢失了,着急忙慌的找人修。我细细看了下,病毒没怎么注意自我保护,只开启了双进程保护,进程名叫安全卫士.exe和ppsap.exe,哈哈哈,所以还比较好处理,用内核级反病毒神器xuetr同时杀两个进程(单独杀一个,会被另一个进程再次启动),删除注册表,清除根目录病毒文件,还原原始文件夹属性,就搞定了,但是帮几个同学手动杀了之后就开始想自动化的办法。首先是用批处理的方法:

核心指令 attrib –s –h “filename”

那么封装一下逻辑,先结束进程,然后判断是否有拖入批处理程序的文件或文件夹,没有报错,如果是文件,弹出操作提示,如果是文件夹,再弹出是否处理子目录及递归子目录。

用这个批处理确实大大提高了清楚病毒的效率,就只需要手动清楚下注册表启动项(不清楚也没关系,哈哈),然后挨个磁盘拖到批处理就搞定了。

不过,正好接触了window API编程,这个清除病毒的过程正好涉及进程、注册表、文件这几大块,那就写个程序拿这个病毒练练手呗。

代码注释还算详细,所以就不多说,其中判断病毒文件用了文件大小的方法,其实蛮愚蠢的,也可能误杀,但是效率确实特别高,读取文件系统的属性可比磁盘IO快很多,不过为以防万一,后面还是写了个基于md5散列检测的查杀方法,可以先根据文件大小,然后计算散列值,再杀,如此误杀概率几乎为0。

由于这里只是我演示了下根据md5签名扫描病毒的技术,并没有实际使用,所有没有处理交互逻辑,处理某个病毒只需要改searchSignature里的那个数组。其实可以用来寻找病毒隐藏的母本,但前提是母本和病毒是相同的文件。

代码下载:

https://github.com/atp798/BlogStraka/tree/master/AntiVirusSimple

发表评论