2006年05月09日

1. 开始-运行-控制面板-声音、语音和音频设备,进入后把将音量图标放入任务栏勾打上。

2.从其它机器上拷贝一个文件c:\windows\system32\sndvol32.exe。

3.利用安装盘

   光驱提示符:
   CD i386
   expand sndvol32.ex_ c:\windows\system32\sndvol32.exe

1.重新启动电脑按F8进入带命令提示行的安全模式

2.执行命令 assoc .exe=exefile(注意:assoc与.exe之间有一空格),屏幕显示 .exe=exefile

3. 重新启动

2005年06月02日

Anti-debug
用指令预取反跟踪


CPU的执行时并不是执行到哪一句再到内存中去取那一句, 而是先读入到
CPU的Cache中,如果指令已经到了Cache中, 再将它修改也没有用了,如
果用跟踪程序的话,CPU的Cache中就不会是跟正常执行时的指令相同,
所以可以改动下几条指令,当然是故意改错,如果没有跟踪,程序还回照
常执行,有跟踪的话,那就…

汇编编程示例:
code segment
 assume cs:code,ds:code
 org 100h
start:
 jmp install
d1 db ‘OK, passed …’,0dh,0ah,24h
install:
 mov word ptr _code,20cdh
_code:
 nop ;如果跟踪一下,就会发现下一条指令是
      INT 20H,返回 DOS 了
 nop
 mov si,offset _code1
 mov di,si
 cld
 mov ax,20cdh
 stosw
 lodsw
_code1:
 nop
 nop
 mov ah,9
 ;now ax=20cdh
 mov dx,offset d1
 int 21h
 int 20h
code ends
 end start    

关于启发扫描的反病毒技术

        虚拟机,其作用是让病毒受控地虚拟运行。而所谓“启发扫描”就是在病毒运行 /动态分析基础上进行判定的具体方案。

启发式代码扫描技术
─────────

  病毒和正常程序的区别可以体现在许多方面,比较常见的如通常一个速应用程序在最初的指令是检查命令行输入有无参数项,清屏和保存原来屏幕显示等,而病毒程序则从来有会这样做,它通常最初的指令是直接写盘操作、解码指令,或搜索某路径下的可执行程序等相关操作指令序列。这些显著的不同之处,一个熟练的程序员在调试状态下只需一瞥便可一目了然。启发式代码扫描技术实际上就是把这种经验和知识移植到一个查病毒软件中的具体程序体现。

  因此,在这里,启发式指的“自我发现的能力”或“运用某种方式或方法去判定事物的知识和技能。”一个运用启发式扫描技术的病毒检测软件,实际上就是以特定方式实现的动态高度器或反编译器,通过对有关指令序列的反编译逐步理解和确定其蕴藏的真正动机。例如,如果一段程序以如下序列开始:MOV AH ,5/INT,13h,即调用格式化盘操作的BIOS指令功能,那么这段程序就高度可疑值得引起警觉,尤其是假如这段指令之前不存在取得命令行关于执行的参数选项,又没有要求用户交互性输入继续进行的操作指令时,可以有把握地认为这是一个病毒或恶意破坏的程序。

可疑的程序功能
───────

  在具体实现上,启发式扫描技术是相当复杂的。通常这类病毒检测软件要能够识别并探测许多可疑的程序代码指令序列,如格式化磁盘类操作,搜索和定位各种可执行程序的操作,实现驻留内存的操作,发现非常的或未公开的系统功能调用的操作,等等,所有上述功能操作将被按照安全和可疑的等级可以排序,根据病毒可能使用和具备的特点而授以不同的加权值。

  随便举个例子,格式化磁盘的功能操作几乎从不出现在正常的应用程序中,而病毒程序中则出现的几率极高,于是这类操作指令序列可获得较高的加权值,而驻留内存的功能不仅病毒要使用,很多应用程序也要使用,于是应当给予较低的加权值。如果对于一个程序的加权值的总和超过一个事先定义的阀值,那么,病毒检测程序就可以声称“发现病毒!”仅仅一项可疑的
功能操作远不足以触发“病毒报警”的装置,如果不打算上演“狼来了”的谎报和虚报来故意吓人,最好把多种可疑功能操作同时并发的情况定为发现病毒的报警标准。

==================================================================

启发式扫描通常应设立的标志
─────────────

  为了方便用户或研究人员直观地检测被测试程序中可疑功能调用的存在情况,病毒检测程序可以显示为不同的可疑功能调用设置标志。
  例如,TbScan这一病毒检测软件就为每一项它定义的可疑病毒功能调用赋予一个旗标,如F,R,A……,这样以来可以直观地帮助我们对被检测程序进行是否染毒的主观判断。

各标志的含义
──────

F= 具有可疑的文件操作或能。有可疑进行感染的操作。
R= 重定项功能。程序将以可疑的方式进行重定向操作。
A= 可疑的内存分配操作。程序使用可疑的方式进行内存申请和分配操作。
N= 错误的文件扩展名。扩展名预期程序结构与当前程序相矛盾。
S= 包含搜索定位可执行程序(如EXE或COM)的例程。
#= 发现解码指令例程。这在病毒和加密程序中都是经常会出现的。
E= 灵活无常的程序入口。程序被蓄意设计成可编入宿主程序的任何部分,
   病毒极频繁使用的技术。
L= 程序截获其它软件的加载和装入。有可能是病毒为了感染被加载程序。
D= 直接写盘动作。程序不通过常规的DOS功能调用而进行直接写盘动作。
M= 内存驻留程序。该程序被设计成具有驻留内存的能力。
I= 无效操作指令。非8088指令等。
T= 不合逻辑的错误的时间标贴。有的病毒借此进行感染标记。
J= 可疑的跳转结构。使用了连续的或间接跳转指令。这种情况在正常程序
   中少见但在病毒中却很平常。
?= 不相配的EXE文件。可能是病毒,也可能是程序设计失误导致。
G= 废操作指令。包含无实际用处,仅仅用来实现加密变换或逃避扫描检查
   的代码序列。
U= 未公开的中断/DOS功能调用。也许是程序被故意设计成具有某种隐蔽
   性,也有可能是病毒使用一种非常规手法检测自身存在性。
O= 发现用于在内存在搬移或改写程序的代码序列。
Z= EXE/COM辨认程序。病毒为了实现感染过程通常需要进行此项操作。
B= 这回程序入口。包括 可疑的代码序列,在完成对原程序入口处开始的
   代码修改之后重新指向修改前的程序入口病毒极常见。
K= 非正常堆栈。程序含有可疑的或名其妙的堆栈。

例如对于以下病毒,TbScan将点亮以下不同标志。

   Jerusalum/PLO(耶路撒冷病毒)  FRLMUZ
   Backfont/ 后体病毒           FRALDMUZK
   mINSK-gHOST                  FELDTGUZB
   Murphy                       FSLDMTUZO
   Ninja                        FEDMTUZOBK
   Tolbuhin                     ASEDMUOB
   Yankee-Doodle                FN#ELMUZB

   对于某个文件来说,被点亮的标志愈多,染毒的可能性就愈大。常规干净程序甚至很少会点亮一个标志旗,但如果要作为可疑病毒报警的话,则至少要点亮两个以上标志旗。如果再给不同的标志旗赋以不同的加权值,情况还要复杂得多。


关于虚警(谎报)
────────

   正如任何其他的通用检测技术一样,启发式扫描技术有时也会把一个本无病毒的程序指证为染毒程序,这就是所谓的查毒程序虚警或谎报现象。原因很简单。被检测程序中含有病毒所使用或含有的可疑功能。例如,QEMM所提供的一个LOADHI.COM程序就会含有以下可疑功能调用。

A= 可疑的内存分配操作。程序使用可疑的方式进行内存申请和分配操作。
N= 错误的文件扩展名。扩展名预期程序结构与当前程序相矛盾。
S= 包含搜索定位可执行程序(如EXE或COM)的例程。
#= 发现解码指令例程。这在病毒和加密程序中都是经常会出现的。
E= 灵活无常的程序入口。程序被蓄意设计成可边入宿主程序的任何部痊,
   病毒极频繁使用的技
M= 内存驻留程序。该程序被设计成具有驻留内存的能力。
U= 未公开的中断/DOS功能调用。也许是程序被故意设计成具有某种隐蔽
   性,也有可能是病毒使
O= 发现用于在内存在搬移或改写程序的代码序列。
Z= EXE/COM辨认程序。病毒为了实现感染过程通常需要进行此项操作。

   LoadHi程序中确实含有以上功能调用,而这些功能调用足以触发检毒程序的报警装置。因为LoadHi的作用就是为了分配高端内存,将驻留程序(通常如设备驱动程序等等)装入内存,然后移入高端内存,等等……,所有这些功能调用都可以找到一个合理的解释和确认,然而,检毒程序并不能分辨这些功能调用的真正用意,况且这些功能调用又常常被应用在病毒程序中,
因此,可怜的检测程序只能判定Load Hi程序为“可能是病毒程序”。

虚警(谎报)的后果有多严重
─────────────

   如果某个基于上述启发式代码扫描技术的病毒检测程序在检测到某个文件时弹出报警窗口“该程序可以格式化磁盘且驻留内存”而你自己确切地知道当前被检测的程序是一个驻留式格式化磁盘工具软件,这算不算虚警谎报呢?

   因为一个这样的工具软件显然应当具备格式化盘以及驻留内存的能力。启发式代码检测程序的判断显然正确无误,这可算做虚警,但不能算做谎报(误报)。问题在于这个报警是否是“发现病毒”,  如果报警窗口只是说“该程序具备格式化盘和驻留功能”,好,100%正确,但它如果说“发现病毒”,那么显然是100%的错了。关键是我们片怎样看待和理解它真正的报警的含义。检测程序的使命在于发现和阐述程序内部代码执行的真正动机,到底这个程序会进行哪些操作,关于这些操作是否预期或合法,尚需要用户方面的判断。不幸的是,对于一个一的新手来说,要做出这样的判断仍然是有困难的。

如何避免虚警和误报
─────────

   不管是虚警也好,误报或谎报也好,抛开具体的名称叫法不谈,我们决不希望在每次扫描检测的时候我们的检测程序无缘由地狂喊“狼来了”,我们要尽力减少和避免这种人为的紧张状况,那么如何实现呢?必须努力做好以下几点:

1、 对于病毒行为的准确把握而给定的关于可疑功能调用集合的精确的定义。
除非满足两个以上的病毒重要特征,否则不予报警。

2、 对于常规的佥程序代码的和识别能力。某些编译器提供运行时实时解压或解码的功能及服务例程,而这些情形往往是导致检测时误报警的原因,应当在检测程序中加入认知和识别这些情状的功能模块,以避免再次误报。

3、 对于特定程序的识别能力。如上面涉及到的LoadHi及驻留式格式化工具软件等等。

4、 类似“无罪假定”的功能,首先假定程序和电脑是不含病毒的。许多启发式代码分析检毒软件具有自学习功能,能够记信那些并非病毒的文件并在以后的检测过程中避免再报警。


如何处理虚警谎报
────────

   不管采用什么样的措施,虚警谎报现象总是要存在的。因此不可避免地用户要在某些报警信息出现时作出自已的抉择:是真正病毒还是误报?也许会有人说:“我怎么知道被报警的程序到底是病毒还是属于无辜误报?”大多数人在问及这个问题的第一反应,是“谁也无法证明和判断。”事实上是有办法作出最终判决的,但是这还要取决于应用启发式代码分析检测技术的
查病毒程序的具体解释。

   假如检测软件仅仅给出“发现可疑病毒功能调用”这样简单的警告,信息而没有更多的辅助信息,对于用户来说几乎没有什么可资判断是否真正病毒的实际帮助价值,换个说法,“可能是病毒”似乎永远没错,不必担负任何责任,而用户不希望得到这样模棱两可的解释。

   相反地,如果检测软件把更为具体和实际的信息报告给用户,比如“警告,当前被检测程序含有驻留内存和格式化软硬盘的功能”,类似的情况更能帮助用户扩清楚到底会发生什么?该采取怎样应对措施。比如这种报警是出现在一个字处理编辑软件中,那么用户几乎可以断定这是一个病毒。当然如果这种报警是出现在一个驻留格式化盘工具软件上,用户大可不必紧张万
分了。这样以来,报警的可疑病毒常用功能调用都能得到合理的解释,因而也会得到圆满正确的处理结果。

   自然地, 需要一个有经验的用户从同样的报警信息中推理出一个 “染毒”还是“无毒”的,结论并非每一个用机者可以完全胜任的。因此,如果把这类软件设计成有某种学习记忆的能力,在第一次扫描时由有经验的用户逐一对有疑问的报警信息作好“是”与“非”的判断,而在以后的各次扫描检测时,由于软件学习并记忆了第一次检测时处理结果,将不再出现同样的
烦人的提示警报。因为不论在什么情况下,偶尔请教一下某个有经验的“高手”并不,难难堪的是每次就同样的问题去麻烦别人。

   不管怎样的缺点和不足,和其它的扫描识别技术相比起来,启发式代码分析扫描技术几乎总能提供足够的辅助判断,信息让我们最终判定被检测的目标对象是染毒的,亦或是干净的。启发式代码分析检测技术的实用应用效果如何?启发式扫描技术仍然是一种正在发展和不断完善中的新技术,但已经在大量优秀的反病毒软件中得到迅速的推广和应用。按照最保守的估计,
一个精心设计的算法支持的启发式扫描软件,在不依赖任何对病毒预先的学习和了解的辅助,信息如特征代码,指纹字串,校验和等等的支持下,可以毫不费力地检查出90%以上的对它来说是完全未知的新病毒。 可能会出现一些个虚报、谎报的情况,适当加以控制,这种误报的概率可以很容易地被降低在0.1%以下。

    例如以下是TbScan(6.02)在对由Vesselin Bontchev 提供的测试用真实病毒样本扫描处理的结果。

扫描的技术      从总数7210个样本中检出病毒的个数    检测的检出概率

传统基于手工分析和特征值        7056                97.86%
启发式代码分析                  6465                89.67%

误报率测试是必要的,但实施起来则要困难得多,因此这里没有提供。

传统扫描技术与启发式代码分析扫描技术的结合运用
───────────────────────

   前面论述了簋多启发式代码分析技术的优点和长处,会不会引起某些人的误解,以为传统的检测扫描技术就可以丢弃了呢?情况当然不是这样。从实际应用的效果看来,传统的手法由于基于对已知病毒的分析和研究,在检测时能够更准确,减少误报;但如果是对待此前根本没有见过的新病毒,由于传统手段的知识库并不存在该类(种)病毒的特征数据,则有可能毫无瓜,
产生漏报的严重后果。而这时基于规则和定义的启发式代码分析技术则正好可以大显身手,使这类新病毒不至成为漏网之鱼。传统与启发式技术的结合支用,可以使病毒检测软件的检出率提高到前所未有的水平,而另一方面,又大大降低了总的误报率。详见以下测试实验结果对比数据:

         启发式判定结果    传统式判定结果    可能的真正结果

           干净              干净              非常可能就是干净的
           干净              有毒              很可能误报
           有毒              干净              很可能有毒
           有毒              有毒              极有可能确实染毒

                                               三种技术结合使用
虚报率      10%               1%                1%
漏报率      0.1%              0.001%            0.00001%

   某种病毒能够同时逃脱传统和启发式扫描分析的可能性是小的,如果两种分析的结论相一,致那么真实的结果往往就如同其判断结论一样砍无,疑两种不同技术对同一检测样分析的结果不一致的情况比较少见,这种情形下需借助另外的分析去得出最后结论。

   仍然以 TbScan 6.02为测试举例,下面是分别使用不同技术和结合应用的测试结果:

测试用技术      总数为7210个样本的病毒检出数    检出率
传统的                      7056                97.86%
启发式                      6465                89.67%
结合应用                    7194                99.78%


启发式反毒技术的未来展望
────────────

   研究的逐步深入,使技术发展不断进步。一方面绝大多数反病毒厂家的产品中还未能引入一个较为成功和可靠的启发式检测技术的内核,另一方面,即使是在少数依靠的知名反病毒产品中这项技术的运用也还需要经受不断的完善和发展。任何改良的努力都会有不同程度的质量提高,但是不能企望在没有虚报为代价的前提下使检出率达到100%,或者反过来说,大约在相当长
的时间里虚报和漏报的概率不可能达到0%。

   这听上去或许有些不可思议,其实不难理解。100%正确的检测结果只所以不存在,是因为有相当一部分程序(或代码)介乎于病毒与非病毒之间,即便对于人脑来说,合乎逻辑又合乎病毒定义的结论往往会截然相反。随便举一个例子,如果依据广为接受的病毒的定义:“病毒,就是复制自身的拷贝或改良的复本的一些程序。” 那么,众所周知的磁盘复制程序 DiskCopy
岂不是也落入病毒的分类中了吗?但是,情况显然并非如此……

   病毒技术与反病毒技术恰如“道”与“魔”的关系,也许用“道高一尺,魔高一丈”来形容这对矛盾的斗争和发展进程再为恰当不过了。当反病毒技术的专家学者在研究启发式代码分析技术对传统的特征代码扫描法查毒技术进行改革的时候,也确实收到了很显著的效果,甚至可以说,相对于病毒技术的加密变换(Mutation),尤其是多形、无定形病毒技术(Polymorphsm) 对
于传统反毒技术的沉重打击,杀了一个漂亮的回马枪。但是,反毒技术的进步也会从另一方面激发和促使那些丧心病狂的病毒制作者的不断研制出更新的病毒,具有某种反启发式扫描技术功能,可以逃避这类检测技术的新型病毒。但是,值得庆幸的是,即便能够写出具有这种能力的病毒,它所需要的技术水准和编程能力要复杂得多,绝不可能象对搞传统的基于特征值扫描技
术的反毒软件,那么容易,任何一个程序的新手只要将原有的病毒稍加改动,哪怕只是一个字节,只要恰 好改变了所谓“特征字节”, 就可使这种旧病毒的新变种从未经升级的传统查毒软件的眼皮底下逃之夭夭。

结论
──
   抛开启发式代码分析技术实现的具体细节和不同手法不谈,这种代表着未来反病毒技术发展的必然趋势具备某种人工智能特点的反毒技术,向我们展示了一种通用的、不需升级(较省需要升级或不依赖于升级)的病毒检测技术和产品的可能性,由于诸多传统技术无法企及的强大优势,必将得到普遍的应用和迅速的发展。资料显示,目前国际上最著名的排名在前五名的反
病毒软件产品均声称应用了这项技术,从来自不同机构和出处的评测结果来看,纯粹的启发式代码分析技术的应用(不借助任何事先的对于被测目标病毒样本的研究和了解),已能达到80%以上的病毒检出率, 而其误报率极易控制在0.1%之下,这对于仅仅使用传统的基于对已知病毒的研究而抽取“特征字串”的特征扫描技术的查毒软件来说,是不可想象的,一次质的飞跃。
在新病毒,新变种层出不穷,病毒数量不断激增的今天,这种新技术的产生和应用更具有特殊的重要意义。

  几周之前,我隐约记得好象哪里有一篇文章,顺便找人去试试看能否要来。不想今天下午从E-mail里面收到了。文章显然是译文,有很多用词的习惯可能不一样。我大致看了一遍。整理一下就POST上来了。

  总的来说,这篇文章和前面的虚拟机一文正好互相补充。虚拟机为启发式扫描的实现提供一个基础,而启发扫描是以虚拟机的分析为基础进行病毒判定的具体手段。可以说,这基本上是目前比较先进的技术了。但是我们也看到,启发式扫描对病毒的判定同样不是使用以病毒定义出发的直接标准,而是一系列间接的准则──甚至可以说是使用的统计方法。正如我们在模式
识别工作中的过程类似,虚拟机解码病毒并提供特征素材,而启发式扫描方法是进行特征的分类(如前面所说的各种“标志”,最后要进行权衡分析(特别象模式识别中的距离计算)。

  可以看出,我们在处理很多问题上都是采用的类似直接与间接方法相配合的手段。汉字/图象识别、声音识别、病毒处理……, 当直接准则不易于实现时,往往就采用间接准则。经常还是基于统计的间接准则。从反病毒角度看,我们当然希望存在一种技术,它能够使用与病毒的定义准则更加接近的标准。同时,我们在以MS-DOS文件病毒为例进行分析时,别忘了不断新生
的新的病毒,包括Windows病毒、宏病毒等等……

   希望有兴趣的虫虫能把自己的体会多多地说出来。不必担心说错,更不必保守。大家一起探讨。


Coding program

花指令加密法
 
用‘花指令’来进行静态加密是很有效的,这会使解密者无法一眼看到全部指令,杜绝了先把程序打印下来再慢慢分析的做法。我们知道,一条指令的长度是不等长的,假使有一条指令为
3 字节长,然后你从它的第二个字节开始反汇编,你照样会看到一条面目全非的指令,‘花指令’就是在指令流中插入很多‘垃圾’,使静态反汇编无法进行,如何实现你把以下程序编译出来用
Debug 的 U 指令看一下,跟踪一下就能理解了。
汇编编程示例:
XX1 MACRO
local _next1
 jmp short
_next1
 db 0e8h
_next1:
 ENDM
;————————————–
XX2 MACRO
local _next2
 jmp short
_next2
 db 0e9h
_next2:
 ENDM
;————————————–
XX3 MACRO
local _next3
 jmp short
_next3
 db 09ah
 db 0e8h
_next3:
 ENDM
;————————————–
XX4 MACRO
local _next4
 jmp short
_next4
 db 09ah
 db 0e8h
_next4:
 ENDM
;————————————–
.286
CODE SEGMENT
 ASSUME CS:CODE,DS:CODE
 ORG 100H
start:
 db 20 dup (90h)
 
 xx3
 mov ax,0201h
 xx3
 mov bx,0200h
 xx3
 mov cx,0001h
 xx3
 mov dx,0080h
 xx2
 int 13h
 xx2
 int 20h
CODE ENDS
 END START
     

Using clock to anti-debug
用时间差反跟踪
概述:
 如果关掉中断,不仅仅是键盘不动了,时钟也不会走,所以可以利用时间差来反跟踪,具体方法是:先关掉中断, 再用当前时间作 key 加密,在执行一大堆指令后,偷偷地再用当前时间解密, 如果为了解密跳过关中断指令, 时间就会变化, 解密结果就会不对,然后…当然是死机啦 !
汇编编程示例:
code segment
 assume cs:code,ds:code
 org 100h
start:
 jmp install
d1 db ‘OK, passed …’,0dh,0ah,24h
install:
 xor ax,ax
 mov es,ax
 mov ax,es:[046ch]
 ;系统时间计数
 xor word ptr _code,ax
 ;把 _CODE 处的指令加密
 mov ah,0ffh
 in al,21h
 xchg ah,al
 out 21h,al
 ;关掉中断,并保存原中断开关情况到
AH
 
 mov cx,100
 ;这儿是延时语句,模拟其他程序的执行时间
lop1:
 push cx
 xor cx,cx
lop2:
 loop lop2
 pop cx
 loop lop1
 
 mov bx,es:[046ch]
 ;再把时间取回来解密
 xor word ptr _code,bx
 xchg ah,al
 ;记得把中断复原
 out 21h,al
_code:
 nop
 nop
 mov ah,9
 mov dx,offset d1
 int 21h
 int 20h
code ends
 end start
     

国际上对病毒命名的惯例

国际上对病毒命名的一般惯例为前缀+病毒名+后缀。前缀表示该病毒发作的操作平台或者病毒的类型,而DOS下的病毒一般是没有前缀的;病毒名为该病毒的名称及其家族;后缀一般可以不要的,只是以此区别在该病毒家族中各病毒的不同,可以为字母,或者为数字以说明此病毒的大小。

例如:WM.Cap.A,A表示在Cap病毒家族中的一个变种,WM表示该病毒是一个Word宏病毒

==前缀==

WM: Word宏病毒,可以在Word6.0和Word95(Word7.0)下传播发作,也可以在Word97(Word8.0)或以上的Word下传播发作,但该病毒不是在Word97制作完成的。

W97M: Word97宏病毒,这些是在Word97下制作完成,并只在Word97或以上版本的或以上的Word传播发作。

XM: Excel宏病毒在Excel5.0和Excel95下制作完成并传播发作,同样,此种病毒也可以在Excel97或以上版本传播发作。

X97M: 在Excel97下制作完成的Excel宏病毒,此类病毒也可以在Excel5.0和Excel97下传播发作。

XF: Excel程式(Excel formula)病毒,此类病毒是用Excel4.0把程序片断植入新的Excel文档中的。

AM: 在Access95下制作完成并传播发作的Access的宏病毒。

A97M: 在Access97下制作完成并传播发作的Access的宏病毒。

        O2KM: Office2000宏病毒,可能感染各种类型的Office2000文档。

        O97M: Office97宏病毒,可能感染各种类型的Office97文档。

W95: 顾名思义,这类是Windows95病毒,运行在Windows95操作系统下,当然也可以运行在Windows98下。

Win: Windows3.x病毒,感染Windows3.x操作系统的文件。

W32: 32位Windows病毒,感染所有的32位Widnows平台。

WNT: 同样是32位Windows病毒,但只感染Windows NT操作系统。

        UNIX: 在任何基于UNIX的操作系统下运行的病毒。

        Linux: 以Linux操作系统为目标的病毒。

        Palm: 设计成在特定的Palm操作系统下运行的病毒

HLLC: 高级语言同伴(High Level Language Companion)病毒,他们通常是DOS病毒,通过新建一个附加的文件(同伴文件)来传播。

HLLP: 高级语言寄生(High Level Language Parasitic)病毒,这些通常也是DOS病毒,寄生在主文件中。

HLLO: 高级语言改写(High Level Language Overwriting)病毒,通常是DOS病毒,以病毒代码改写主文件。

       HLLW: 用高级语言编译的蠕虫。(注意:这个修饰语通常不是前缀,只有在DOS高级
语言蠕虫里它才是前缀。如果一个蠕虫是Win32文件,命名将会是W32.HLLW。  
 
       BAT: 批处理文件病毒。
   
       HTML: 以HTML文件为目标的病毒。

       IRC: 以IRC应用为目标的病毒。

       VBS: 用Visual Basic Script程序语言编写的病毒。

      JS: 用JavaScript编程语言编写的病毒。

  JAVA: 用JAVA程序语言编写的病毒。

       PWSTEAL: 窃取密码等信息的木马。
  
       AOL: 美国在线(AOL)环境下特殊的木马,其目的通常位窃取AOL的密码等信息

  Trojan/Troj: 这并不是病毒,只是特洛伊木马,通常装扮成有用的程序,但通常 
          有恶意代码,特洛伊木马并不会复制传染。

       DDos: 分布式拒绝服务(Distributed Denial of Service)病毒。分布式拒绝服  
          务是利用被控制的电脑对一个Internet网站进行进行攻击。

       DoS: 拒绝服务(Denial of Service)病毒。不要跟DOS病毒混淆了,DOS病毒是没
         有前缀的。

    == 后缀 ==

    @m: 表明该病毒或蠕虫是通过电子邮件传播的,例如Happy99(W32.ska),它只在你
           (用户)发送电子邮件时随着邮件一同将自身发送。

    @mm: 表明该病毒或蠕虫通过群发电子邮件传播,例如Melissa,它将会给你信箱中
         的每一个邮件地址发送附带病毒的信息。

    Cli: 木马程序的客户端。客户端亦即控制端(由控制者使用)。

    dam: 表明文件被病毒破坏或者包括非活动的病毒残余后,该文件将不能正确执行 
         或不能得到正确的运行结果。

    dr: 表明查出的文件是另一个病毒的投载工具。这是一个将病毒或蠕虫植入受害人

    enc: 指被加密或编码的文件。例如,使用 MIME 编码创建自身复本的蠕虫会被检
         测到具有 .enc 后缀。

    Family: 表明基于病毒特征的属于一个特殊家族的病毒。

    Gen: 表明基于病毒特征的属于一个特殊类型的病毒。

    Int: 表明是故意的病毒,即是有意传播而不是由于病毒代码的漏洞或错误的。

    Worm: 表明是蠕虫,而不是病毒。蠕虫通过网络、电子邮件或其他传播机制复制自身

2005年02月17日

DOS下可执行文件的加载过程

一    COM文件的加载

COM文件格式的历史可以追溯到CP/M时代,被沿用至今,所有的Windows系统都支持此格式。
COM文件包含程序的一个绝对映象――就是说,为了运行程序准确的处理器指令和内存中的数据,MS-DOS通过直接把该映象从文件拷贝到内存而加载COM程序,而不作任何改变。
加载过程如下:
1  分配内存
   因为COM程序必须位于一个64K的段中,所以COM文件的大小不能超过65,278(65,536减去用于PSP(程序段前缀)的256字节和用于一个起始堆栈的至少2字节)。如果MS-DOS不能为程序、一个PSP、一个起始堆栈分配足够内存,分配尝试失败。否则,MS-DOS分配尽可能多的内存(直至所有保留内存),即使COM程序本身不能大于64K。在试图运行另一个程序或分配另外的内存之前,大部分COM程序释放任何不需要的内存。
2  设置PSP
   分配内存后,MS-DOS在该内存的头256字节建立一个PSP,如果PSP中的第一个FCB含有一个有效驱动器标识符,则置AL为00h,否则为0FFh。MS-DOS还置AH为00h或0FFh,这依赖于第二个FCB是否含有一个有效驱动器标识符。
3  加载COM程序
   建造PSP后,MS-DOS在PSP后立即开始(偏移100h)加载COM文件
4  设置寄存器
   它置CS,SS,DS和ES为PSP的段地址,接着创建一个堆栈。为创建一个堆栈,MS-DOS置SP为0000h,若已分配了至少64K内存;否则,它置寄存器为比所分配的字节总数大2的值。最后,它把0000h推进栈(这是为了保证与在早期MS-DOS版本上设计的程序的兼容性)。MS-DOS通过把控制传递给偏移100h处的指令而启动程序。程序设计者必须保证COM文件的第一条指令是程序的入口点。注意,因为程序是在偏移100h处加载,因此所有代码和数据偏移也必须相对于100h。汇编语言程序设计者可通过置程序的初值为100h而保证这一点(例如通过在原程序的开始使用语句org 100h)。
由于COM文件没有任何标志,所以识别COM文件的时候有些难度。

二    EXE文件的加载
EXE文件不同于COM文件,由于它可以跨段执行,大大扩展了内存的使用。它有一个文件头,来提供文件有关信息。EXE文件是由文件头和加载模块(Loader Module)线性组成。
文件头格式如下:

00-01 e_magic; // 文件特征,为0×5A4D(MZ)或者0×4D5A(ZM)
02-03 e_cblp; // 文件最后页的字节数(为0说明这个块或者是页全被使用)
               //如果为4,应当视作0处理,这是由MS-Linker决定的。
04-05 e_cp;  // 文件页数(包含最后没有写满的页)每页512字节。
              //用于计算DOSEXE文件长度
             //File_length=(e_cp-1)×0×200+e_cblp,均为16进制
06-07 e_crlc; // 重定位项个数,很可能是0
08-09 e_cparhdr; // 文件头结构节数,对于DOSEXE来说,就是头结构大小,头     
                  //结构结束处就是文件开始加载的地方;
0A-0B  e_minalloc; // 所需的最小内存
0C-0D  e_maxalloc; // 所需的最大内存
0E-0F  e_ss; // 初始的相对SS值,用程序装入处的段地址加上此值来初始化SS
10-11  e_sp; // SP寄存器的初始值
12-13  e_csum; // 字校验和。一般不用,如果设置正确的话,文件所有字节相加为0
14-15  e_ip; // IP寄存器的初始值
16-17  e_cs; // CS寄存器的初始值
18-19  e_lfarlc; // 重定位表偏移量。程序加载的时候起始段地址加上它来重定位
1A-1B  e_ovno; // 可覆盖的数目,常为0,即不可覆盖

程序入口EP=初始IP+(初始CS+文件头结构的节数)×0×10 (均为16进制计算)

加载过程如下:
1  根据从头结构中计算所需的内存大小来申请内存
   OS将PSP大小+文件映象大小【文件头后面的部分】+【0C-0D  e_maxalloc所需的最大内存】后得到的值和可得到的内存相比较,满足则加载,且返回起始段地址,否则返回错误。
2  加载加载模块(Loader Module)到起始段地址。如果exMinAlloc域和exMaxAlloc域中的值都为零,则MS-DOS把映象尽可能地加载到内存最高端。

否则,它把映象加载到紧挨着PSP域之上
3  按照可重定位项数【06-07 e_crlc】和【18-19  e_lfarlc】来重定位。
   解释一下重定位。
   mov dx,ds
   当此语句加载到不同的段时,ds时不同的。所以当程序编制好后,linker程序将这样的位置记下来,也就是将此位置距离加载模块起始位置的偏移(PPP)存入可重定位表(4B的结构数组),并在e_lfarlc处设置一个指针来指向第一个可重定位项。执行的时候将起始段地址加上PPP即可找到要重定位的地方。
4  构造PSP
5  设置寄存器
   ds,es指向PSP首地址。
6  设置CS和IP来指向程序入口

摘录的

程序映象,包含处理器代码和程序的初始数据,紧接在文件头之后。它的大小以字节为单位,等于.EXE文件的大小减去文件头的大小,也等于exHeaderSize的域的值乘以16。MS-DOS通过把该映象直接从文件拷贝到内存加载.EXE程序然后调整定位表中说明的可重定位段地址。
定位表是一个重定位指针数组,每个指向程序映象中的可重定位段地址。文件头中的exRelocItems域说明了数组中指针的个数,exRelocTable域说明了分配表的起始文件偏移量。每个重定位指针由两个16位值组成:偏移量和段值。 为加载.EXE程序,MS-DOS首先读文件头以确定.EXE标志并计算程序映象的大小。然后它试图申请内存。首先,它计算程序映象文件的大小加上PSP的大小再加上EXEHEADER结构中的exMinAlloc域说明的内存大小这三者之和,如果总和超过最大可用内存块的大小。则MS-DOS停止加载程序并返回一个出错值。否则面,它计算程序映象的大小加上PSP的大小再加上EXEHEADER结构中exMaxAlloc域说明的内存大小之和,如果第二个总和小于最大可用内存块的大小,则MS-DOS 分配计算得到的内存量。否则,它分配最大可用内存块。分配完内存后,MS-DOS确定段地址,也称为起始段地址,MS-DOS从此处加载程序映象。如果exMinAlloc域和exMaxAlloc域中的值都为零,则MS-DOS把映象尽可能地加载到内存最高端。否则,它把映象加载到紧挨着PSP域之上。接下来,MS-DOS读取重定位表中的项目调整所有由可重定位指针说明的段地址。对于重定位表中的每个指针,MS-DOS寻找程序映象中相应的可重定位段地址,并把起始段地址加到它之上。一旦调整完毕,段地址便指向了内存中被加载程序的代码和数据段。 MS-DOS在所分配内存的最低部分建造256字节的PSP,把AL和AH设置为加载 .COM程序时所设置的值。MS-DOS使用文件头中的值设置SP与SS,调整SS初始值,把起始地址加到它之上。MS-DOS还把ES和DS设置为PSP的段地址.最后,MS-DOS从程序文件头读取CS和IP的初始值,把起始段地址加到CS之 上,把控制转移到位于调整后地址处的程序。

三    MCB结构

Flag(1BYTES)    所有者的PSP(2B)   内存块的节数(2B)   保留(3B)    所有者名称(8B)

如果是M(4D)      若为8表示                            
不是最后一块    为系统占有                            
若是Z(5A)
是最后一块                                            
                                                      


四    PSP结构

 偏移        大小(Byte)                 说 明
 
0000h        02      中断20H
 
0002h        02                 已分配内存的高端地址,用节计算,相当于 
                                段地址(利用这个可看出是否感染引导型病毒)
0004h        01   保留
 
0005h      05   至DOS的长调用
 
000Ah       02   INT 22H(终止地址,当前程序结束后应转向的程序地址)
     入口 IP
000Ch        02   INT 22H 入口 CS
 
000Eh        02   INT 23H(CTTL+C或者ctrl+break)入口 IP
 
0010h        02   INT 23H 入口 CS
 
0012h        02   INT 24H(严重错误处理程序) 入口 IP
 
0014h        02   INT 24H 入口 CS
 
0016h        02   父进程的PSP段值(可测知是否被跟踪)
 
0018h        14   存放20个SOFT号
 
002Ch        02   环境块段地址(从中可获知执行的程序名)
 
002Eh      04   存放用户栈地址指针
 
0032h      1E   保留
 
0050h        03     DOS调用(INT 21H / RETF)
 
0053h      02   保留
 
0055h      07       扩展的FCB头
 
005Ch      10   格式化的FCB1
 
006Ch      10    格式化的FCB2
 
007Ch        04   保留
 
0080h        80   命令行参数长度
 
0081h        127    命令行参数

2004年12月14日

        已经沉沦了许久,似乎也该做点什么了,没有那么多精力去管那么多的乱七八糟的事情,还是早点专心学点东西为将来做打算吧,至少还是要把自己说过的话实现吧?
        来个计划:
        1.    写下自己20多年的心路历程,纪念也好,见证也罢,希望以后不会犯同样的错误。
        2.    写一本关于病毒的入门小书,带上点加密解密的小知识,可惜自己懂的不多,慢慢来了:)
        3.    win32汇编,努力学习中
        4.    Shell 编程
        5.    再回头学习一下C吧,几乎快忘光了。
        6.    Cracker/Hacker

2004年11月30日

作为一种简单的二进制文件格式,COM格式的文件主要有下面几个特点:

1…….没有文件头,是内存的一个绝对映像,程序的入口点就是文件的第一个字节,也是被加载后段地址的偏移100处,程序从此处执行。
2…….COM能够分配的最大的空间为64K,不能访问其他空间。
3…….加载时的寄存器状况:CS=DS=ES=SS=PSP开始处
       IP=100H SP=所分配内存的最高端,且其值会循环
       (0xFFFF+1 –>0×0)一般为0xFFFE,0 进栈

 一般合理的感染方式:
1……附加型
       病毒读入整个待感染文件,移动文件指针到文件末尾,写入病毒体,并修改文件的前二,三个字节为一个跳转语句(JMP/EB),略过源文件代码而跳到病毒体。病毒体尾部保存了源文件的三个字节的数据,于是病毒执行完毕之后恢复数据并把控制权交回源文件。
2……覆盖型
       先移动源文件到缓冲区,然后直接将病毒代码写入源文件,再将源文件加到病毒体之后。
3……插入型
       病毒代码插入到文件的缝隙之中。对于COM而言,病毒将自己插入未使用的空间中,用JMP语句将他们连接起来。这种的病毒比较少见,也是很显示作者功底的。

         很多时候,病毒作者并没有将写得病毒很完美,所以有时候执行后死机,如没有恢复数据给源程序(附加型)或者是没有将源程序附加到病毒代码之后(覆盖型)等等。

         COM或者EXE程序加载的时候,内存中是有MCB(内存控制块)来分配空间的。MCB一共16个字节,也就是一节。结构就暂时不说了。紧跟MCB的是PSP,每个程序都有的了,结构也暂时不说了。然后就是CS:100H处的程序代码了。整个框架是线性排列的。