大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 网络安全 -> 防范措施 -> 反病毒引擎设计

反病毒引擎设计

时间: 2021-07-31 作者:daque

正文将对现在进步的宏病毒/反宏病毒本领做所有而精致的引见,中心固然放在了反宏病毒上,更加是假造机和及时监察和控制本领。文中开始引见几种现在较为时髦的宏病毒本领,囊括获得体例中心态特权级,驻留,截获体例操纵,变形和加密等。而后分五节精细计划假造机本领:第一节大略引见一下假造机的概论;第二节引见加密变形宏病毒,作家会领会两个驰名变形宏病毒的解密子;第三节是假造机实行本领详解,个中会对两种各别计划举行比拟,同声将领会一个查毒用假造机的总体遏制构造;第四节主假如对一定训令处置因变量的领会;结果在第六节中列出了少许反假造实行本领做为此后矫正的参照。舆论的第三章重要引见及时监察和控制本领,因为win9x和winnt/2000体例体制和启动模子各别,以是会分红两个操纵体例举行计划。个中波及的本领很普遍:囊括启动编制程序本领,文献钩挂,特权级间通讯之类。正文引见的本领波及操纵体例底层体制,难度较大。所供给的代码,囊括一个假造机c谈话源代码和两个宏病毒及时监察和控制启动步调反汇编代码,具备确定的接洽和适用价格。 要害字:宏病毒,假造机,及时监察和控制 文书档案实质目次 1.绪 论 1. 1课题后台 1.2现在宏病毒本领的兴盛情景 1.2.1体例中心态宏病毒 1.2.2驻留宏病毒 1.2.3截获体例操纵 1.2.4加密变形宏病毒 1.2.5反盯梢/反假造实行宏病毒 1.2.6径直api挪用 1.2.7宏病毒湮没 1.2.8宏病毒特出熏染法 2.假造机查毒 2.1假造机概论 2. 2加密变形宏病毒 2.3假造机实行本领详解 2.4假造机代码领会 2.4.1不依附标记存放器训令模仿因变量的领会 2.4.2依附标记存放器训令模仿因变量的领会 2.5反假造机本领 3.宏病毒及时监察和控制 3.1及时监察和控制概论 3.2宏病毒及时监察和控制实行本领概论 3.3win9x下的宏病毒及时监察和控制 3.3.1实行本领详解 3.3.2步调构造与过程 3.3.3hooksys.vxd逆向工程代码领会 3.4winnt/2000下的宏病毒及时监察和控制 3.4.1实行本领详解 3.4.2步调构造与过程 3.4.3hooksys.sys逆向工程代码领会 论断 道谢 重要参考文件 1.绪 论 本舆论接洽的重要实质正如其标题所示是安排并编写一个进步的反宏病毒引擎。开始须要对这“进步”二字做一个证明,何为“进步”?妇孺皆知,保守的反宏病毒软硬件运用的是鉴于特性码的静态扫描本领,即在文献中探求一定十六进制串,即使找到,就可判决文献熏染了那种宏病毒。但这种本领在现在宏病毒本领迅猛兴盛的场合下仍旧起不到很好的效率了。因为我会在以次的章节中简直刻画。所以本舆论将不对杀毒引擎中的特性码扫描和宏病毒代码废除模块做领会。咱们要计划的是为草率进步的宏病毒本领而必定的两大反宏病毒本领--假造机和及时监察和控制本领。简直什么是假造机,什么是及时监察和控制,我会在相映的章节中做精细的引见。这边我要证明的一点是,这两项本领固然在古人的处事中已有所展现(被少许国表里进步的反宏病毒厂家所运用),但出于贸易手段,那些本领并没有被实足公然,以是你不管从书籍文件仍旧网路上的材料中都没辙找到对于那些本领的底细。而我会在关系的章节中领会洪量的步调源码(主假如2.4节中的一个完备的假造机源码)或是逆向工程代码(3.3.3节和3.4.3节中三个我逆向工程的某驰名反宏病毒软硬件的及时监察和控制启动步调及存户步调的反汇编代码),并同声颁布少许我部分发掘的操纵体例里面未公然的体制和数据构造。其余我在文中会洪量地提到或援用少许对于体例底层神秘的巨匠级典范典籍,这算是给爱好体例级编制程序但又苦于找不到符合讲义的伙伴开了一份书单。底下就发端加入舆论的正题。 1.1课题后台 本舆论波及的两个重要本领,也是现在反宏病毒界运用的最为进步的本领中的两个,毕竟是作何而用的呢?开始说说假造机本领,它主假如为查杀加密变形宏病毒而安排的。大略地来说,所谓假造机并不是个假造的呆板,说得更符合少许该当是个假造cpu(用软硬件实行的cpu),只然而宏病毒界都这么叫罢了。它的效率主假如模仿intel x86 cpu的处事进程来证明实行可实行代码,与真实的cpu一律不妨取指,译码并实行相映呆板训令规则的操纵。固然什么是加密变形宏病毒,它们干什么须要被假造实行以及还好吗假造实行等题目会在符合的章节中获得回答。再说另一个重头戏--及时监察和控制本领,它的用途更为普遍,不只控制于查杀宏病毒。被及时监察和控制的东西也很多,如阻碍(intmon),页面缺点(pfmon),磁盘考察(diskmon)之类。用来杀毒的监察和控制主假如对准文献考察,在你要对一个文献举行考察时,及时监控制会议先查看文献能否为带毒文献,假如,则由用户采用是废除宏病毒仍旧废除此次操纵乞求。如许就给了用户一个对立安定的实行情况。但同声,及时监控制会议使体例本能有所低沉,不少杀毒软硬件的用户都埋怨她们的及时监察和控制让体例变得奇慢无比并且不宁静。这就给咱们的安排提出了更高的诉求,即还好吗在保护精确阻挡文献操纵的同声,让及时监察和控制占用的体例资源更少。我会在宏病毒及时监察和控制一节中特意计划这个题目。这两项本领在国表里进步的反宏病毒厂家的产物中都有运用,固然它们的源代码没有公然,但咱们仍旧不妨经过逆向工程的本领来窥视一下它们的安排思绪。本来你用一个十六进制编纂器来翻开它们的可实行文献,大概就会看到少许没有剥掉的调节和测试标记、变量名字或输入消息,那些蛛丝马迹对于领会代码的企图大有裨益。同声,在反宏病毒软硬件的安置目次中后缀为.vxd或.sys即是实行及时监察和控制的启动步调,不妨拿来逆向一下(参看我在反面领会启动源代码中的计划)。断定至此,咱们对这两项本领有了一个大概的领会。反面咱们将深刻到本领的详细中去。 1.2现在宏病毒本领的兴盛情景 要计划还好吗反宏病毒,就必需从宏病毒本领自己的计划发端。恰是所谓“良知知彼,不败之地”。本来,我觉得暂时规则接洽宏病毒本领属于不法动作生存着很大的缺点。很难设想一个毫无宏病毒写稿体味的人会变成杀毒能手。据我领会,暂时海内少许驰名反宏病毒软硬件公司的研制部队中不乏宏病毒写稿能手。只然而她们将同样的本领用到了正轨上,以‘毒’攻‘毒’。以是我蓄意这篇舆论能起到举一反三的效率,憧憬着有更多的人会将宏病毒本领引见给群众。现在的宏病毒与dos和win3.1期间下的从本领观点上看有很多各别。我觉得最大的变化是:启发区宏病毒缩小了,而剧本型宏病毒发端弥漫。因为是在现在的操纵体例下径直改写磁盘的启发区会有确定的难度(dos则没有养护,承诺挪用int13径直写盘),并且启发区的变换很简单被创造,以是很罕见人再写了;而剧本宏病毒以其传递功效高且简单编写而深抱病毒作家的喜爱。固然因为这两种宏病毒用我上头说过的鉴于特性码的静态扫描本领就不妨查杀,以是不在咱们的计划之列。我要计划的本领重要来自于二进制外壳型宏病毒(熏染文献的宏病毒),而且那些本领多数和操纵体例底层体制或386之上cpu的养护形式关系,以是犯得着接洽。大师都领会dos下的外壳型宏病毒重要熏染16位的com或exe文献,因为dos没有养护,它们不妨轻快地举行驻留,缩小可用外存(经过窜改mcb链),窜改体例代码,阻挡体例效劳或阻碍。而到了win9x和winnt/2000期间,想写个运转其上的32位windows宏病毒绝非易事。因为页面养护,你不大概窜改体例的代码页。因为i/o承诺位图中的规则,你也不许举行径直端口考察。在windows中你不大概象在dos中那么经过截获int21h来阻挡一切文献操纵。总之,你以一个用户态步调运转,你的动作将遭到操纵体例庄重的遏制,不大概再象dos下那么随心所欲了。其余犯得着一提的是,windows下沿用的可实行文献方法和dos下的exe半斤八两(普遍步调沿用pe方法,启动步调沿用le),以是宏病毒的熏染文献的难度增大了(pe和le比拟搀杂,中央分了几何个节,即使熏染错了,将引导文献不许连接实行)。由于现在宏病毒的新本领太多,我不大概将它们逐个精细计划,所以就采用了少许要害并具备代办性的在本章的各末节中举行计划。 1.2.1体例中心态宏病毒 在引见什么是体例中心态宏病毒之前,有需要计划一下中心态与用户态的观念。本来只有随意翻开一本对于386养护形式汇编步调安排的教科书,都不妨找到对这两个观念的报告。386及之上的cpu实行了4个特权级形式(windows只用到了个中两个),个中特权级0(ring0)是留给操纵体例代码,摆设启动步调代码运用的,它们处事于体例中心态;而特权极3(ring3)则给普遍的用户步调运用,它们处事在用户态。运转于处置器中心态的代码不受任何的控制,不妨自在地考察任何灵验地方,举行径直端口考察。而运转于用户态的代码则要遭到处置器的诸多查看,它们只能考察映照其地方空间的页表项中规则的在用户态下可考察页面包车型的士假造地方,且只能对工作状况段(tss)中i/o承诺位图(i/o permission bitmap)中规则的可考察端口举行径直考察(此时处置器状况和遏制标记存放器eflags中的iopl常常为0,指明暂时不妨举行径直i/o的最低特权级别是ring0)。之上的计划限于于养护形式操纵体例,象dos这种实形式操纵体例则没有那些观念,个中的一切代码都可被看作运转在中心态。既是运转在中心态有如许之多的上风,那么宏病毒固然没有来由不想获得ring0。处置器形式从ring3向ring0的切换爆发在遏制权变化时,有以次两种情景:考察挪用门的长变化训令call,考察阻碍门或组织门的int训令。简直的变化详细因为波及搀杂的养护查看和仓库切换,不复赘述,请参见关系材料。新颖的操纵体例常常运用阻碍门来供给体例效劳,经过实行一条堕入训令来实行形式切换,在intel x86上这条训令是int,如在win9x下是int30(养护形式回调),在linux下是int80,在winnt/2000下是int2e。用户形式的效劳步调(如体例dll)经过实行一个intxx来乞求体例效劳,而后处置器形式将切换到中心态,处事于中心态的相映的体例代码将效劳于此次乞求并将截止传给用户步调。底下就举例子证明宏病毒加入体例中心态的本领。 在win9x下过程假造地方空间中映照共享体例代码的局部(3g--4g)中除去最上头4m页表有页面养护外其它场合可由用户步调读写。即使你用softice(体例级调节和测试器)的page吩咐察看那些地方的页属性,则你会诧异地创造u rw位,这证明那些地方可从用户态径直读出或写入。这表示着任何一个用户步调都不妨在其运转进程中歹意或偶尔地妨害操纵体例代码页。由此宏病毒就不妨在gdt(全部刻画符表),ldt(限制刻画符表)中随便结构门刻画符并借此加入中心态。固然,也不确定要借助门刻画,再有很多本领不妨获得ring0。据我所知的本领就不下10余种之多,如经过挪用门(callgate),阻碍门(intgate),组织门(trapgate),特殊门(fault),阻碍乞求(irqs),端口(ports),假造机处置器(vmm),回调(callback),情势变换(thunks),摆设io遏制(deviceiocontrol),api因变量(setthreadcontext) ,阻碍2e效劳(ntkern.vxd)。因为篇幅的控制我不大概将一切的本领逐个刻画领会,这边我仅采用最具备代办性的cih宏病毒1.5版发端的一段代码。 人们常说cih宏病毒应用了vxd(假造摆设启动)本领,本来它自己并不是vxd。只然而它运用win9x上述缺点,在idt(阻碍刻画符表)中结构了一个dpl(段特权级)为3的阻碍门(表示着不妨从ring3下实行考察该阻碍门的int训令),并使刻画符指向本人独占地方空间中的一个须要处事在ring0下的因变量地方。如许一来cih就不妨经过大略的实行一条intxx训令(cih采用运用int3,是为了使同样接挂int3的体例调节和测试器softice没辙平常处事以到达反盯梢的手段)加入体例中心态,进而挪用体例的vmm和vxd效劳。以次是我解释的一段cih1.5的源代码:  ; *************************************  ; * 窜改idt以求得中心态特权级 *  ; *************************************  push eax  sidt [esp-02h] ;博得idt表基地方  pop ebx  add ebx, hookexceptionnumber*08h+04h ;zf = 0  cli ;读取窜改体例数据时先遏止阻碍  mov ebp, [ebx]  mov bp, [ebx-04h] ;博得从来的阻碍进口地方  lea esi, myexceptionhook-@1[ecx] ;博得须要处事在ring0的因变量的偏移地方  push esi  mov [ebx-04h], si  shr esi, 16  mov [ebx+02h], si ;树立为新的阻碍进口地方  pop esi  ; *************************************  ; * 爆发一个特殊来加入ring0 *  ; *************************************  int hookexceptionnumber ;爆发一个特殊 固然,反面再有回复从来阻碍进口地方和特殊处置帧的代码。 方才所计划的本领仅限于win9x,想在winnt/2000下加入ring0则没有这么简单。重要的因为是winnt/2000没有上述的缺点,它们的体例代码页面(2g--4g)有很好的页养护。大于0x80000000的假造地方对于用户步调是不看来的。即使你用softice的page吩咐察看那些地方的页属性,你会创造s位,这证明那些地方仅可从中心态考察。以是想在idt,gdt随便结构刻画符,运转时窜改内核是基础做不到的。所能做的仅是经过加载一个启动步调,运用它来做你在ring3下做不到的工作。宏病毒不妨在它们加载的启动中窜改内核代码,或为宏病毒自己创造挪用门(运用nt由ntoskrnl.exe导出的未公然的体例效劳kei386allocategdtselectors,kei386setgdtselector,kei386releasegdtselectors)。如funlove宏病毒就运用启动来窜改体例文献(ntoskrnl.exe,ntldr)以绕过安定查看。但这内里有两个题目,其一是启动步调从何处来,新颖宏病毒一致运用一个称为“drop”的本领,即在宏病毒体自己包括启动步调二进制码(不妨举行收缩或动静结构文献头),在宏病毒须要运用时,动静天生启动步调并将它们扔到磁盘上,而后赶快经过在scm(效劳遏制处置器)备案并最后挪用startservice来使启动步调得以运转;其二是加载一个启动步调须要处置员身份,普遍帐号在挪用上述的加载因变量时会归来波折(安定子体例要查看用户的考察令牌(token)中有无seloaddriverprivilege特权),但普遍用户在大多功夫登录时会采用处置员身份,要不连宏病毒及时监察和控制启动也同样没辙加载,以是留给宏病毒的时机仍旧很多的。 1.2.2驻留宏病毒 驻留宏病毒是指那些在外存中探求符合的页面并将宏病毒自己正片到个中且在体例运转功夫不妨一直维持宏病毒代码的生存。驻留宏病毒比那些径直熏染(direct-action)型宏病毒更具湮没性,它常常要截获某些体例操纵来到达熏染传递的手段。加入了中心态的宏病毒不妨运用体例效劳来到达此手段,如cih宏病毒经过挪用一个由vmm导出的效劳vmmcall _pageallocate在大于0xc0000000的地方上调配一块页面空间。而居于用户态的步调要想在步调退出后仍驻留代码的局部于外存中犹如是不大概的,由于不管用户步调调配何种外存都将动作过程占用资源的一局部,一旦过程中断,所占资源将登时被开释。以是咱们要做的是调配一块过程退出后仍可维持的外存。 宏病毒写稿小组29a的分子griyo 应用的一个本领很有创新意识:他经过createfilemappinga 和mapviewoffile创造了一个地区东西并映照它的一个视口到本人的地方空间中去,并把宏病毒体搬到何处,因为文献映照地方的假造地方居于共享地区(不妨被一切过程看到,即一切过程用来映照共享区内假造地方的页表项全都指向沟通的物理页面),以是下一步他经过向explorer.exe中注入一段代码(运用writeprocessmemory来向其它过程的地方空间写入数据),而这段代码会从explorer.exe的地方空间中再次请求翻开这个文献映照。如许一来,即使宏病毒退出,但因为explorer.exe还对映照页面维持援用,以是一份宏病毒体代码就从来维持在不妨感化一切过程的外存页面市直至explorer.exe退出。 其余还不妨经过窜改体例动静贯穿模块(dll)来举行驻留。win9x下体例dll(如kernel32.dll 映照至bff70000)居于系全部享地区(2g-3g),即使在其代码段间隙中写入第一小学段宏病毒代码则不妨感化其它一切过程。但kernel32.dll的代码段在用户态是只能读不许写的。以是必需先经过特出本领窜改其页养护属性;而在winnt/2000下体例dll地方页面被映照到过程的独占空间(如kernel32.dll 映照至77ed0000)中,并具备写时正片属性,即没有过程试图写入该页面时,一切过程共享这个页面;而当一个过程试图写入该页面时,体例的页面缺点处置代码将收到处置器的特殊,并查看到该特殊并非考察违例,同时间配有激励特殊的过程一个新页面,并正片原页面实质于其上且革新过程的页表以指向新调配的页。这种共享外存的优化给宏病毒的写稿带来了确定的烦恼,宏病毒不许象在win9x下那么仅窜改kernel32.dll一处代码便可一了百了。它须要运用writeprocessmemory来向每个过程映照kernel32.dll的地方写入宏病毒代码,如许每个过程城市获得宏病毒体的一个复本,这在宏病毒界被称为多过程驻留或每过程驻留(muti-process residence or per-process residence )。 1.2.3截获体例操纵 截获体例操纵是宏病毒习用的本领。dos期间如许,windows期间也不不同。在dos下,宏病毒经过在阻碍向量表中窜改int21h的进口地方来截获dos体例效劳(dos运用int21h来供给体例挪用,个中囊括洪量的文献操纵)。而大局部启发区宏病毒会接挂int13h(供给磁盘操纵效劳的bios阻碍)进而博得对磁盘考察的遏制。windows下的宏病毒同样找到了钩挂体例效劳的方法。比拟典范的如cih宏病毒即是运用了ifsmgr.vxd(可安置文献体例)供给的一个体例级文献钩子来截获体例中一切文献操纵,我会在关系章节中精细计划这个题目,由于win9x下的及时监察和控制也重要运用这个效劳。除此除外,再有其余本领。但功效没有这个体例级文献钩子好,主假如不够底层,会丧失少许文献操纵。 个中一个本领是运用apihook,钩挂api因变量。本来体例中并没有现成的这种效劳,有一个setwindowshookex不妨钩住鼠标动静,但对截获api因变量则爱莫能助。咱们能做的是本人结构如许的hook。本领本来很大略:比方你要截获kernel32.dll导出的因变量createfile,只须在其因变量代码的发端(bff7xxxx)介入一个跳转训令到你的钩子因变量的进口,在你的因变量实行完后再跳回顾。如次图所示: ;; target function(要截获的目的因变量)  ……  targetfunction:(要截获的目的因变量进口)  jmp detourfunction(跳到钩子因变量,5个字节长的跳转训令)  targetfunction+5:  push edi  ……  ;; trampoline(你的钩子因变量)  ……  trampolinefunction:(你的钩子因变量实行完后要归来原因变量的场合)  push ebp  mov ebp,esp  push ebx  push esi(之上几行是原因变量进口处的几条训令,共5个字节)  jmp targetfunction+5(跳回原因变量)  ……   但这种本领截获的只是是很小一局部文献翻开操纵。 在win9x下再有一个鲜为人知的截获文献操纵的方法,说起来这该当算是win9x的第一次全国代表大会方便之门。它即是kernel32.dll中一个未公然的叫作vxdcall0的api因变量。反汇编这个因变量的代码如次: mov eax,dword ptr [esp+00000004h] ;博得效劳代号 pop dword ptr [esp] ;仓库矫正 call fword ptr cs:[bffc9004] ;经过一个挪用门挪用3b段某处的代码 即使咱们连接盯梢下来,则会看到: 003b:xxxxxxxx int 30h ;这是个用以堕入vwin32.vxd的养护形式回调 相关vxdcall的精细实质,请参看matt pietrek的《windows 95 system programming secrets》。 当效劳代号为0x002a0010时,养护形式回调会堕入vwin32.vxd中一个叫作vwin32_int21dispatch的效劳。这正说领会win9x还在依附于msdos,纵然微软宣称win9x不复依附于msdos。挪用典型如次:  my_int21h:push ecx  push eax ;一致dos下int21h的ax中传入的功效号  push 002a0010h  call dword ptr [ebp+a_vxdcall]  ret  咱们不妨将上头vxdcall0因变量的进口处第三条远挪用训令考察的kernel32.dll数据段顶用户态可写地方bffc9004Υ娲⒌?fword'六个字节改为指向咱们本人钩子因变量的地方,并在钩子中查看传入效劳号和功效号来决定能否是乞求vwin32_int21dispatch中的某个文献效劳。驰名的hps宏病毒就运用了这个本领在用户态下径直截获体例中的文献操纵,但这种本领截获的也只是是第一小学局部文献操纵。 1.2.4加密变形宏病毒 加密变形宏病毒是假造机一章的中心实质,将放到关系章节中引见。 1.2.5反盯梢/反假造实行宏病毒 反盯梢/反假造实行宏病毒和假造机接洽出色,以是也将放到相映的章节中引见。 1.2.6径直api挪用 径直api挪用是现在win32宏病毒常用的本领,它指的是宏病毒在运转时径直定位api因变量在外存中的进口地方而后挪用之的一种本领。普遍步调举行api挪用时,编写翻译器会将一个api挪用语句编写翻译为几个参数压栈训令后跟一条转弯抹角挪用语句(这是指microsoft编写翻译器,borland编写翻译器运用jmp dword ptr [xxxxxxxxh])情势如次:  push arg1  push arg2  ……  call dword ptr[xxxxxxxxh] 地方xxxxxxxxh在步调映象的导出(import section)段中,当步调被加载运转时,由装入器控制向内里添入api因变量的地方,这即是所谓的动静链接体制。宏病毒因为为了制止熏染一个可实行文献时在文献的导出段中结构宏病毒体代码顶用到的api的链接消息,它采用应用本人在运转时径直定位api因变量地方的代码。本来那些因变量地方对于操纵体例的某个本子是对立恒定的,但宏病毒不许依附于此。此刻较为时髦的做法是先定位包括api因变量的动静贯穿库的装入坝址,而后在其导出段(export section)中探求到须要的api地方。反面一步简直没有难度,只有你熟习导出段构造即可。要害在乎第一步--决定dll装入地方。本来体例dll装入坝址对于操纵体例的某个本子也是恒定的,但宏病毒为保证其宁静性仍不许依附这一点。暂时宏病毒多数运用一个叫作构造化特殊处置的本领来捕捉宏病毒体激励的特殊。如许一来宏病毒就不妨在确定外存范畴内探求指定的dll(dll运用pe方法,头部有恒定标记),而不用担忧会因激励页面缺点而被操纵体例杀掉。 因为特殊处置和反面的反假造实行本领出色关系,以是特将构造化特殊处置大略证明如次: 公有两类特殊处置:最后特殊处置和每线程特殊处置。 其一:最后特殊处置 当你的过程中不管哪个线程爆发了特殊,操纵体例将挪用你在干线程中挪用setunhandledexceptionfilter创造的特殊处置因变量。你也不必在退出时拆去你安置的处置代码,体例会为你机动废除。  push offset final_handler  call setunhandledexceptionfilter  ……  call exitprocess  ;************************************  final_handler:  ……  ;(eax=-1 reload context and continue)  mov eax,1  ret ;program entry point  ……  ;code covered by final handler  ……  ;code to provide a polite exit  ……  ;eax=1 stops display of closure box  ;eax=0 enables display of the box  其二:每线程特殊处置 fs中的值是一个十六位的采用子,它指向包括线程要害消息的数据构造tib,线程消息块。其的首双字节指向咱们称为err的构造: 1st dword +0 pointer to next err structure (下一个err构造的南针) 2nd dword +4 pointer to own exception handler (暂时头等的特殊处置因变量的地方) 以是特殊处置是呈练状的,即使你本人的处置因变量捕获并处置了这个特殊,那么当你的步调爆发了特殊时,操纵体例就不会挪用它缺省的处置因变量了,也就不会展示一个腻烦的实行了不法操纵的红叉。 底下是cih的特殊段: myvirusstart:  push ebp  lea eax, [esp-04h*2]  xor ebx, ebx  xchg eax, fs:[ebx] ;调换此刻的err构造和前一个构造的地方  ; eax=前一个构造的地方  ; fs:[0]=此刻的err构造南针(在仓库上)  call @0  @0:  pop ebx  lea ecx, stoptorunviruscode-@0[ebx] ;你的特殊处置因变量的偏移  push ecx ;你的特殊处置因变量的偏移压栈  push eax ;前一个err构造的地方压栈  ;结构err构造,记这功夫的esp(err构造南针)为esp0  ……  stoptorunviruscode:  @1 = stoptorunviruscode  xor ebx, ebx ;爆发特殊时体例在你的练前又加了一个err构造,             ;以是要先找到从来的构造地方  mov eax, fs:[ebx] ; 取此刻的err构造的地方eax  mov esp, [eax] ; 取下个构造地方即eps0到esp  restorese: ;没有爆发特殊时成功的回到这边,你这时候的esp为本esp0  pop dword ptr fs:[ebx] ;弹出从来的前一个构造的地方到fs:0  pop eax ;弹出你的特殊处置地方,平栈罢了  1.2.7宏病毒湮没 实行过程或模块湮没该当是一个胜利宏病毒所必需完备的特性。在win9x下kernel32.dll有一个不妨使过程从过程处置器过程列表中消逝的导出因变量registerserviceprocess ,但它不许使宏病毒逃出少许过程欣赏东西的监督。但当你领会那些东西是怎样来列举过程后,你也会找到周旋那些东西相映的方法。过程欣赏东西在win9x下多数运用一个叫作toolhelp32.dll的动静贯穿库中的process32first和process32next两个因变量来实行过程列举的;而在winnt/2000里也有psapi.dll导出的enumprocess可用以实行同样之功效。以是宏病毒就不妨商量窜改那些公用因变量的局部代码,使之不许归来一定过程的消息进而实行宏病毒的湮没。 但工作远没有设想中那么大略,俗语说“道高级中学一年级尺,魔高级中学一年级丈”,此理不谬。因为此刻很多逆项工程师的全力,微软力求湮没的很多神秘仍旧渐渐被人们所发掘出来。固然个中就囊括windows内核运用的处置过程和模块的里面数据构造和代码。比方winnt/2000用由ntoskrnl.exe导出的内核变量psinitialsystemprocess所指向的过程eprocess块双向链表来刻画体例中一切震动的过程。即使过程欣赏东西径直在启动步调的扶助下从体例内核空间中读出那些数据来列举过程,那么任何宏病毒也没辙居中逃走。 相关eprocess的简直构造和功效,请参看david a.solomon和mark e.russinovich的《inside windows2000》第三版。 1.2.8宏病毒特出熏染法 对宏病毒略微有些知识的人都领会,普遍宏病毒是经过将自己附加到宿主尾部(如许一来,宿主的巨细就会减少),并窜改步调进口点来使宏病毒获得击活。但此刻不少宏病毒经过运用特出的熏染本领不妨使宿主巨细及宿主文献头上的进口点维持静止。 附加了宏病毒代码却使被熏染文献巨细静止听起来让人不堪设想,本来它是运用了pe文献方法的特性:pe文献的每个节之间留有按簇巨细对齐后的单薄,宏病毒体即使充满小则不妨将自己分红几份并辨别插入到每个节结果的间隙中,如许就不用特殊减少一个节,所以文献巨细维持静止。驰名的cih宏病毒恰是应用这一本领的典范典型(它的巨细惟有1k安排)。 宏病毒在不窜改文献头进口点的基础下要想赢得遏制权并非易事:进口点静止表示着步调是从原步调的进口代码处发端实行的,宏病毒必需要将原步调代码中的一处窜改为导向宏病毒进口的跳转训令。道理即是如许,但个中还生存很多可计划的场合,如在原步调代码的何处插入这条跳转训令。少许查毒东西扫描可实行文献头部的进口点域,即使创造它指向的场合不平常,即不在代码节而在资源节或重定位节中,则有来由质疑文献熏染了那种宏病毒。以是方才计划那种宏病毒界称之为epo(进口点朦胧)的本领不妨很好的周旋如许的扫描,同声它仍旧反假造实行的要害本领。 其余犯得着一提的是此刻不少宏病毒仍旧扶助对收缩文献的熏染。如win32.crypto宏病毒就不妨熏染zip,arj,rar,ace,cab 等诸多典型的收缩文献。那些宏病毒的代码中含有对一定收缩文献典型解压并收缩的代码段,不妨先把收缩文献中的实质解压出来,而后对符合的文献举行熏染,结果再将熏染后文献收缩回去并同声窜改收缩文献头部的校验和。暂时不少反宏病毒软硬件都扶助查多种方法的收缩文献,但对有些染毒的收缩文献没辙杀除。因为我想大概是怕因为那种来由,如解压或收缩有误,校验和计划不平等,使得废除后收缩文献方法被妨害。宏病毒却不必对用户的文献破坏控制,以是不生存这种担忧。 2.假造机查毒 2.1假造机概论 近些年,假造机,在反宏病毒界也被称为通用解密器,仍旧变成反宏病毒软硬件中最引人注手段局部,纵然反宏病毒者对于它的应用还远没有到达一个完备的水平,但假造机以其诸如"宏病毒训令码模仿器"和"stryker"等反复无常的称呼为反宏病毒产物的商场出卖带来了光彩的远景。以次的计划将把咱们带入一个精粹的假造本领的寰球中。 开始要谈及的是假造机的观念和它与诸如vmware(美利坚合众国vmware公司消费的一款假造机,它扶助在winnt/2000情况下运转如linux等其它操纵体例)和win9x下的vdm(dos假造机,它用来在32位养护形式情况中运转16实形式代码)的辨别。本来那些假造机的安排思维是有渊源可寻亲,早在上个世纪60岁月ibm就开拓了一套名为vm/370的操纵体例。vm/370在各别的步调之间供给超过式多工作,作法是在简单本质的硬件上形式出多部假造呆板。典范的vm/370对话,运用者坐在电缆贯穿的长途结尾前,经过遏制步调的一个ipl吩咐,模仿如实呆板的初始化步调承载操纵,所以 一套完备的操纵体例被载入假造呆板中,并发端为运用者发端创造一个对话。这套模仿体例是如许的完美,体例步调员以至不妨运转它的一个假造复本,来对新本子举行除错。vmware与此特殊一致,它动作原操纵体例下的一个运用步调不妨为运转于其上的目的操纵体例创造出一部假造的呆板,目的操纵体例就象运转在独立一台真实呆板上,涓滴发觉不到本人居于vmware的遏制之下。当在vmware中按下电源键(power on)时,窗口里展示了呆板自检画面,接着是操纵体例的载入,十足都和真的一律。而win9x为了让多个步调共享cpu和其它硬件资源确定运用vms(一切win32运用步调运转在一部体例假造机上;而每个16位dos步调具有一部dos假造机)。vm是一个实足由软硬件编造出来的货色,以和如实电脑实足沟通的办法往返应运用步调所提出的需要。从那种观点来看,你不妨将一部规范的pc的构造视为一套api。这套api的元素囊括硬件i/o体例,和以阻碍为普通的bios和ms-dos。win9x往往以它本人的软硬件来代劳那些保守的api元素,再不不妨对珍爱的硬件多重发讯。在vm上运转的运用步调觉得本人独吞所有呆板,它们断定本人是从真实的键盘和鼠标赢得输出,并从真实的屏幕上输入。稍被加一点控制,它们以至不妨觉得本人实足具有cpu和十足外存。实行假造本领要害在乎软硬件假造化和硬件假造化,底下扼要引见win9x下的dos假造机的实行。 当windows移往养护形式后,养护形式步调没辙径直挪用实形式的ms-dos处置例程,也不许径直挪用实形式的bios。软硬件假造化即是用来刻画养护形式windows元件是怎样不妨和实形式ms-dos和bios相互互动。软硬件假造化诉求操纵体例不妨阻挡计划超过养护形式和实形式边境的挪用,而且安排符合的参数存放器后,变换cpu形式。win9x运用假造摆设启动(vxd)阻挡来自养护形式的阻碍,经过实形式阻碍向量表(ivt),将之变换为实形式阻碍挪用。做为变换的一局部,vxd必需运用置于养护形式扩充外存中的参数,天生出符合的参数,并将之放在实形式(v86)操纵体例不妨存取的场合。效劳中断后,vxd在把截止交给扩充外存中养护形式挪用端。16位dos步调中洪量的21h和13h阻碍挪用就此处置,但个中还生存不少径直端口i/o操纵,这就须要引入硬件假造化来处置。假造硬件的展示是为了在硬件阻碍乞求线上爆发阻碍乞求,为了回应in和out训令,变换特出外存映照场所等因为。硬件假造化依附于intel 80386+的几个个性。个中一个是i/o承诺掩码,使操纵体例大概诱捕(trap)对任何一个端口的一切in/out训令。另一个个性是:由硬件扶助的分页体制,使操纵体例不妨供给假造外存,并阻挡对外存地方的存取操纵,将video ram假造化是此很好的例证。结果一个需要的个性是cpu的假造8086(v86)形式 ,让dos步调象在实形式中那么地实行。 咱们底下计划用来查毒的假造机并不是象某些人设想的:如vmware一律为待查可执路途序创造一个假造的实行情况,供给它大概用到的十足元素,囊括硬盘,端口等,让它在其上自在表现,结果按照其动作来判决能否为宏病毒。固然这是个不错的设想,但商量到其安排难渡过大(需模仿元素过多且动作领会要借助人为智能表面),所以只能动作此后兴盛的目标。我安排的假造机庄重的说不许称之为假造呆板,而叫作假造cpu,通用解密器等更为符合少许,但因为反宏病毒界风气称之为假造机,以是在底下的计划中我还将连接这个称呼。查毒的假造机是一个软硬件模仿的cpu,它不妨象真实cpu一律取指,译码,实行,它不妨模仿一段代码在真实cpu上运转获得的截止。给定一组呆板码序列,假造时机机动居中掏出第一条训令操纵码局部,确定操纵码典型和寻址办法以决定该训令长度,而后在相映的因变量中实行该训令,并按照实行后的截止决定下条训令的场所,如许轮回重复直到某个一定情景爆发以中断处事,这即是假造机的基础处事道理和大略过程。安排假造机查毒的手段是为了周旋加密变形宏病毒,假造机开始从文献中决定并读取宏病毒进口处代码,而后之上述处事办法证明实行宏病毒头部的解密段(decryptor),结果在实行完的截止(解密后的宏病毒体明文)中搜索宏病毒的特性码。这边所谓的“假造”,并非是创造了什么假造情况,而是指染毒文献并没有本质实行,只然而是假造机模仿了其如实实行时的功效。这即是假造机查毒基础道理,简直引见请参看反面的关系章节。 固然,假造实行本领运用范畴远不只机动脱壳(假造机查毒本质上是机动盯梢宏病毒进口的解密子将加密的宏病毒体按其解密算法举行解密),它还不妨运用在跨平台高档谈话证明器,歹意代码领会,调节和测试器。如刘涛涛安排的国产调节和测试器trdos即是实足运用假造本领证明实行被调节和测试步调的每条训令,这种调节和测试器比拟起保守的断点式调节和测试器(debug,softice等)具备诸多上风,如不易被被调节和测试者发觉,断点个数没有控制等。 2.2加密变形宏病毒 前方提到过安排假造机查毒的手段是为了周旋加密变形宏病毒。这一章就中心引见加密变形本领。 早期宏病毒没有运用任何搀杂的反检验和测定本领,即使拿反汇编东西翻开宏病毒体代码看到的将是真实的呆板码。所以不妨由宏病毒体内某处一段呆板代码和此处隔绝宏病毒进口(提防不是文献头)偏移值来独一决定一种宏病毒。查毒时只需大略的决定宏病毒进口并在指定偏移处扫描一定代码串。这种静态扫描本领周旋普遍宏病毒是十拿九稳的。 跟着宏病毒本领的兴盛,展示了一类加密宏病毒。这类宏病毒的特性是:其进口处具备解密子(decryptor),而宏病毒主体代码被加了密。运转时开始获得遏制权的解密代码将对宏病毒主体举行轮回解密,实行后将遏制交给宏病毒主体运转,宏病毒主体熏染文献时会将解密子,用随神秘钥加密过的宏病毒主体,和生存在宏病毒体内或嵌入解密子中的密钥一齐写入被熏染文献。因为同一种宏病毒的各别污染范例的宏病毒主体是用各别的密钥举行加密,所以不大概在个中找到独一的一段代码串和偏移来代办此宏病毒的特性,犹如静态扫描本领对此行将作废。但提防想想,各别污染范例的解密子仍维持静止呆板码明文(从表面上讲任何加密步调中都生存未加密的呆板码,要不步调没辙实行),以是将特性码选于此处固然会冒确定的误报危害(解密子中代码缺乏宏病毒个性,同样的特性码也会出此刻平常步调中),但仍不失为一种灵验的本领。 因为加密宏病毒还没有不妨实足逃走静态特性码扫描,以是宏病毒写稿者在加密宏病毒的普通之长进行矫正,使解密子的代码对各别污染范例表露出百般性,这就展示了加密变形宏病毒。它和加密宏病毒特殊一致,独一的矫正在乎宏病毒主体在熏染各别文献会结构出一个功效沟通但代码各别的解密子,也即是各别污染范例的解密子具备沟通的解密功效但代码却半斤八两。比方本来一条训令实足不妨拆成几条来实行,中央大概会被插入无效的废物代码。如许,因为没辙找到静止的特性码,静态扫描本领就完全作废了。底下先举两个例子证明加密变形宏病毒解密子结构,而后再计划还好吗用假造实行本领检验和测定加密变形宏病毒。 驰名多形宏病毒marburg的变形解密子:  00401020: movsx edi,si ;宏病毒进口  00401023: movsx edx,bp  00401026: jmp 00408a99  ......  00407400: ;宏病毒体进口  加密的宏病毒主体  00408a94: ;解密南针初始值  ......  00408a99: mov dl,f7  00408a9b: movsx edx,bx  00408a9e: mov ecx,cf4b9b4f  00408aa3: call 00408ac4  ......  00408ac4: pop ebx  00408ac5: jmp 00408ade  ......  00408ade: mov cx,di  00408ae1: add ebx,9fdbd22d  00408ae7: jmp 00408b08  ......  00408b08: add ecx,80c1fbc1  00408b0e: mov ebp,7fcdeff3 ;轮回解密记数器初值  00408b13: sub cl,39  00408b16: movsx esi,si  00408b19: add dword ptr[ebx+60242dbf],9ef42073 ;解耳语句,9ef42073是密钥  00408b23: mov edx,6fd1d4cf  00408b28: mov di,dx  00408b2b: inc ebp  00408b2c: xor dl,a3  00408b2f: mov cx,si  00408b32: sub ebx,00000004 ;挪动解密偏移南针,逆向解密  00408b38: mov ecx,86425df9  00408b3d: cmp ebp,7fcdf599 ;确定解密中断与否  00408b43: jnz 00408b16  00408b49: jmp 00408b62  ......  00408b62: mov di,bp  00408b65: jmp 00407400 ;将遏制权交给解密后的宏病毒体进口  驰名多形宏病毒hps的变形解密子:  005365b8: ;解密南针初始值和宏病毒体进口  加密的宏病毒主体  ......  005379cd: call 005379e2  ......  005379e2: pop ebx  005379e3: sub ebx,0000141a ;树立解密南针初值  005379e9: ret  ......  005379f0: dec edx ;缩小轮回记数值  005379f1: ret  ......  00537a00: xor dword ptr[ebx],10e7ed59 ;解耳语句,10e7ed59是密钥  00537a06: ret  ......  00537a1a: sub ebx,ffffffff  00537a20: sub ebx,fffffffd ;挪动解密南针,正向解密  00537a26: ret  ......  00537a30: mov edx,74d9cb97 ;树立轮回记数初值  00537a35: ret  ......  00537a3f: call 005379cd ;宏病毒进口  00537a44: call 00537a30  00537a49: call 00537a00  00537a4e: call 00537a1a  00537a53: call 005379f0  00537a58: mov esi,edx  00537a5a: cmp esi,74d9c696 ;确定解密中断与否  00537a60: jnz 00537a49  00537a66: jmp 005365b8 ;将遏制权交给解密后的宏病毒体进口  之上的代码看上去一致不会是用编写翻译器编写翻译出来,或是编制程序者细工写出来的,由于个中充溢了洪量的乱数和废物。代码中没有解释局部均可觉得是废物代码,有效局部实行的功效仅是轮回向加密过的宏病毒体的每个双字加上或异或一个恒定值。这不过变形宏病毒污染范例的个中一个,其余范例的解密子和宏病毒体将不会如许,过度变形及至让人没辙辩识。至于变形宏病毒的实行本领因为波及搀杂的算法和遏制,所以不在咱们计划范畴内。 这种加密变形宏病毒的检验和测定用保守的静态特性码扫描本领明显仍旧不行了。为此咱们采用的本领是动静特性码扫描本领,所谓“动静特性码扫描”指先在假造机的共同下对宏病毒举行解密,接着在解密后宏病毒体明文中探求特性码。咱们领会解密后宏病毒体明文是宁静静止的,只有不妨获得解密后的宏病毒体就不妨运用特性码扫描了。要获得宏病毒体明文开始必需运用假造机对宏病毒的解密子举行证明实行,当盯梢并决定其轮回解密实行或到达规则度数后,所有宏病毒体明文或局部已被生存到一个里面缓冲区中了。假造机之以是又被称为通用解密器在乎它不必事前领会宏病毒体的加密算法,而是经过盯梢宏病毒自己的解密进程来对其举行解密。至于假造机还好吗证明训令实行,还好吗决定可实行代码有无轮回解密段等详细将鄙人一节中引见。 2.3假造机实行本领详解 有了前方对于加密变形宏病毒的引见,此刻咱们领会动静特性码扫描本领的要害就在乎必需获得宏病毒体解密后的明文,而获得明文爆发的机会即是宏病毒自己解密代码解密的结束。暂时有两种本领不妨盯梢遏制宏病毒的每一步实行,并不妨在宏病毒轮回解密中断后从外存中读出宏病毒体明文。一种是单步和断点盯梢法,和暂时少许步调调节和测试器相一致;另一种本领固然即是假造实行法。底下辨别领会单步和断点盯梢法和假造实行法的本领详细。 单步盯梢和断点是实行保守调节和测试器的最基础本领。单步的处事道理很大略:当cpu在实行一条训令之前会先查看标记存放器,即使创造个中的组织标记被树立则会在训令实行中断后激励一个单步组织int1h。至于断点的树立有软硬之分,软硬件断点是指调节和测试器用一个常常是单字节的断点训令(cc,即int3h)替代掉欲触发训令的首字节,当步调实行至断点训令处,默许的调节和测试特殊处置代码将被挪用,此时生存在栈中的段/偏移地方即是断点训令后一字节的地方;而硬件断点的树立则运用了处置器自己的调节和测试扶助,在调节和测试存放器(dr0--dr4)中树立触发训令的线形地方并树立调节和测试遏制存放器(dr7)中关系的遏制位,cpu会在预设训令实行时机动激励调节和测试特殊。而windows自己又供给了一套调节和测试api,使得调节和测试盯梢一个步调变得特殊大略:调节和测试器自己不必接挂默许的调节和测试特殊处置代码,而只须挪用waitfordebugevent等候体例寄送的调节和测试事变;调节和测试器可运用getthreadcontext挂起被调节和测试线程获得其左右文,并树立左右文中的标记存放器中的组织标记位,结果经过setthreadcontext使树立奏效来举行单步伐试;调节和测试器还可经过挪用两个功效宏大的调节和测试api--readprocessmemory和writeprocessmemory来向被调节和测试线程的地方空间中注入断点训令。按照我逆向后的领会截止,vc++的调节和测试器即是径直运用这套调节和测试api写成的。运用之上的调节和测试本领既是不妨写出像vc++那么功效完备的调节和测试器,那么没有来由不许将之应用于宏病毒代码的机动解密上。最大略的最法:创造待查可实行文献为调节和测试器的调节和测试子过程,而后用上述本领对其举行单步盯梢,每当收到具备exception_single_step特殊代码的事变时就不妨领会该条以单步形式实行的训令,结果当确定宏病毒的所有解密进程中断后即可挪用readprocessmemory读出宏病毒体明文。 用单步和断点盯梢法的独一一点长处就在乎它不用途理每条训令的实行--这表示着它无需编写洪量的一定训令处置因变量,由于一切的解密代码都交由cpu去实行,调节和测试器然而是在代码被单步阻碍的间歇获得遏制权罢了。但这种本领的缺陷也是十分鲜明的:其一简单被宏病毒察觉到,宏病毒只须举行大略的仓库查看,或径直挪用isdebugerpresent就可决定本人正居于被调节和测试状况;其二因为没有相映的呆板码领会模块,训令的译码,实行实足依附于cpu,以是将引导没辙精确地获得训令实行详细并对其举行灵验的遏制。;其三单步和断点盯梢法诉求待查可实行文献如实实行,即其将做为体例中一个如实的过程在本人的地方空间中运转,这固然是宏病毒扫描所不许承诺的。很明显,单步和断点盯梢法不妨运用在调节和测试器,机动脱壳等上面,但对于查毒却是不对适的。 而运用假造实行法的独一一点缺陷就在乎它必需在里面处置一切训令的实行--这表示着它须要编写洪量的一定训令处置因变量来模仿每种训令的实行功效,这边基础不生存何时获得遏制权的题目,由于遏制权将长久控制在假造机手中。用软硬件本领模仿cpu并非易事,须要对其体制有充满的领会,要不模仿功效将与如实实行相去甚远。举两个例子:一个是宏病毒常用的乘法后ascii安排训令aam,这条训令由于生存未公然的动作进而往往被宏病毒用来检验假造机安排的是非。常常情景下aam是双字节训令,操纵码为d4 0a(本来0a隐含代办了操纵数10);但也可动作单字节训令精确地指定第二字节除数为大肆8位登时数,此时操纵码仅为d4。假造机必定商量到后一种指定除数的情景来保护模仿截止的精确性;再有一个例子是对于处置器相应阻碍的办法,即cpu在刚翻开阻碍后将不会赶快相应阻碍,而必需隔一个训令周期。即使假造机没有商量到该体制则很大概假造实行过程会与如实情景不符。但假造实行的便宜也是很鲜明的,同声它凑巧弥补了单步和断点盯梢法所力不许及的上面:开始是不大概被宏病毒察觉到,由于假造机将在其里面缓冲区中为被假造实行代码创造专用的仓库,以是仓库查看截止与本质实行无二(不会向仓库中压入单步和断点阻碍时的归来地方);其次因为假造机自己实行训令的解码和地方的计划,以是不妨获得每条训令的实行详细并加以遏制;结果,最为要害的一条在乎假造实行真实做到了“假造”实行,体例中不会爆发代办被实行者的过程,由于被实行者的存放器组和仓库等实行因素均在假造机里面实行,所以不妨觉得它在假造机地方空间中实行。基于假造实行法诸多的便宜,以是将其应用于通用宏病毒体解密上是再好然而的了。 常常,假造机的安排计划不妨采用以次三种之一:自含代码假造机(scce),缓冲代码假造机(bce),有限代码假造机(lce)。 自含代码假造机处事起来象一个真实的cpu。一条训令取自外存,由scce解码,并被传递到相映的模仿这条训令的例程,下一条训令则连接这个轮回。假造时机包括一个例程来对外存/存放器寻址操纵数举行解码,而后还会囊括一个用来模仿每个大概在cpu上实行的训令的例程集。正如你所想到的,scce的代码会变的无比的宏大并且速率也会很慢。但是scce对于一个进步的反宏病毒软硬件是很有效的。一切训令都在里面被处置,假造机不妨对每条训令的举措做出特殊精细的汇报,那些汇报和开辟式数据以及通用废除模块将彼此参照产生一个灵验的反对毒品体例。同声,反宏病毒步调不妨最透彻地遏制外存和端口的考察,由于它本人处置地方的解码和计划。 缓冲代码假造机是scce的一个缩略版,由于对立于scce它具备较小的尺寸和更快的实行速率。在bce中,一条训令是从外存中博得的,并和一个特出训令表比拟较。即使不是特出训令,则它被举行大略的解码以求得训令的长度,随后一切如许的训令会被导出到一个不妨通征地模仿一切非特出训令的小进程中。而特出训令,只占所有训令集的第一小学局部,则在一定的小处置步调中举行模仿。bce经过将一切非特出训令用一个小的通用的处置步调模仿来缩小它必需特出处置的训令条数,如许一来它减少了自己的巨细并普及了实行速率。但这表示着它将不许真实控制对某个外存地区,端口或其余一致货色的考察,同声它也不大概天生如scce供给的同样所有的汇报。 有限代码假造机有点象用来通用解密的假造体例所处的级别。lce本质上并非一个假造机,由于它并不真实的模仿训令,它只大略地盯梢一段代码的存放器实质,大概会供给一个小的被变换的外存地方表,或是挪用过的阻碍之类的货色。采用运用lce而非更大更搀杂的体例的因为,在乎纵然只对极少量训令的扶助便不妨在解密原始加密宏病毒的路上走很远,由于宏病毒只是运用了intel训令集的第一小学局部来加密其主体。运用lce,本来处置所有intel训令集时的洪量耗费没有了,带来的是速率的宏大延长。固然,这是以不许处置搀杂解密步调段为价格的。当须要举行赶快文献扫描时lce就变的有效起来,由于一个袖珍但不错的lce不妨用来赶快查看实行文献的疑惑动作,反之对每个文献都运用scce算法将会引导没辙忍耐的慢慢。固然,即使一个文献看上去疑惑,lce还不妨启用某个scce代码对文献举行所有查看。 底下发端引见32位自含代码假造机w32encode(w32encode.cpp,tw32asm.h,tw32asm.cpp做为查毒引擎的一局部和其它探求废除模块联编为rsengine.dll)的步调构造和过程。因为这是一个安排完美且搀杂的巨型商用假造机,个中不行制止地包括了对某些一定宏病毒的一定处置,为了使假造机模子的构造明显头绪明显,领会时我将做符合的简化。 w32encode的处事道理很大略:它开始树立模仿存放器组(用一个dword全部变量模仿如实cpu里面的一个存放器,如eneax)的初始值,初始化实行仓库南针(假造机用里面的一个数组static int stack[0x20]来模仿仓库)。而后加入一个轮回,证明实行训令缓冲区progbuffer中的头256条训令,即使轮回退出时仍未创造宏病毒的解密轮回则可由此判决非加密变形宏病毒,若创造领会密轮回则挪用encodeinst因变量反复实行轮回解密进程,将宏病毒体明文解密到dataseg1或dataseg第22中学。关系局部代码如次: w32encode0香港中华总商会体过程遏制局部代码:  for (i=0;i<0x100;i++) //开始假造实行256条训令试图创造宏病毒轮回解密子  {  if (instloc>=0x280)  return(0);  if (instloc+progseekoff>=progendoff)  return(0); //之上两条确定语句查看训令场所的正当性  saveinstloc(); //保存暂时训令在训令缓冲区中的偏移  hasaddnewinst=0;  if (!(j=parse())) //假造实行训令缓冲区中的一条训令  return(0); //遇到不看法的训令时退出轮回  if (j==2) //归来值为2证明创造领会密轮回  break;  }  if (i==0x100) //实行过256条训令后仍未创造轮回则退出  return(0);  preparse=0;  processinst();  if (!encodeinst()) //挪用解密因变量反复实行轮回解密进程  return(0);  jmp中判决轮回展示局部代码:  if ((loc>=0)&&(loc<instloc)) //若变化后训令南针小于暂时训令南针则大概展示轮回  if (!isinstloc(loc)) //在生存的训令南针数组instlocarray中搜索变化后指  ...... //令南针值,如创造则可判决轮回展示  else  {  ......  return(2); //归来值2代办创造领会密轮回  }  parse中假造实行每条训令的进程较搀杂少许:常常parse会从博得训令缓冲区progbuffer中博得暂时训令的头两个字节(囊括了十足操纵码)并按照它们的值挪用相映的训令处置因变量。比方当第一个字节即是0f而且第二个字节位与be后即是be时,可判决此训令为movszx并同声挪用movszx举行处置。当执前进入一定训令的处置因变量中时,开始要经过确定寻址办法(挪用modregrm或modregrm1)决定训令长度并将遏制权交给saveinst因变量。saveinst在生存该训令的关系消息后会挪用真实训令实行因变量w32executeinst。这个因变量和parse特殊一致,它从saveinstbuf第11中学博得暂时训令的头两个字节并按照它们的值挪用相映的训令模仿因变量以实行一条训令的实行。关系局部代码如次: w32executeinst中训令分遣局部代码:  if ((c&0xf0)==0x50)  {if (executepushpop1(c)) //模仿push和pop  return(gotonext());  return(0);  }  if (c==0x9c)  {if (executepushf()) //模仿pushf  return(gotonext());  return(0);  }  if (c==(char)0x9d)  {if (executepopf()) //模仿popf  return(gotonext());  return(0);  }  if ((c==0xf)&&((c2&0xbe)==0xbe))  {if (i=executemovszx(0)) //模仿movszx  return(gotonext());  return(0);  }   2.4假造机代码领会 总体过程遏制和分遣局部的关系代码,在上一章中都已领会过了。底下领会简直的一定训令模仿因变量,这才是假造机的精炼之地方。我将训令分红不依附标记存放器和依附标记存放器两大类辨别引见: 2.4.1不依附标记存放器训令模仿因变量的领会 push和pop训令的模仿:  static int executepushpop1(int c)  {  if (c<=0x57)  {if (stackp<0) //入栈前查看仓库缓冲南针的正当性  return(0);  }  else  if (stackp>=0x40) //出栈前查看仓库缓冲南针的正当性  return(0);  if (c<=0x57) {  stackp--;  enesp-=4; //即使是入栈训令则在入栈前缩小仓库南针  }  switch (c)  {case 0x50:stack[stackp]=eneax; //模仿push eax  break;  ......  case 0x5f:enedi=stack[stackp]; //模仿push edi  break;  }  if (c>=0x58) {  stackp++;  enesp+=4; //即使是出栈训令则在出栈后减少仓库南针  }  return(1);  }  2.4.2依附标记存放器训令模仿因变量的领会 cw32asm类中cmp训令的模仿:  void cw32asm:: cmpw(int c1,int c2)  {  char flgreg;  __asm {  mov eax,c1 //博得第一个操纵数  mov ecx,c2 //博得第二个操纵数  cmp eax,ecx //比拟  lahf //将比拟后的标记截止装入ah  mov flgreg,ah //生存截止在限制变量flgreg中  }  flagreg=flgreg; //生存截止在全部变量flagreg中  }  cw32asm类中jnz训令的模仿:  int cw32asm::jne()  {int i;  char flgreg=flagreg; //用生存的flagreg初始化限制变量flgreg  __asm  {  mov ah,flgreg //树立ah为生存的模仿标记存放器值  pushf //生存假造机自己暂时标记存放器  sahf //将模仿标记存放器值装入如实标记存放器中  mov eax,1  jne l //实行jnz  popf //回复假造机自己标记存放器  xor eax,eax  l:  popf //回复假造机自己标记存放器  mov i,eax  }  return(i); //归来值为1代办须要跳转  }   2.5反假造机本领 任何一个实物都不是尽如人意,尽善尽美的,假造机也不不同。因为反假造实行本领的展示,使得假造机查毒遭到了确定的挑拨。这边引见几个比拟典范的反假造实行本领: 开始是插入特出训令本领,即在宏病毒的解密代码局部报酬插入诸如浮点,3dnow,mmx等特出训令以到达反假造实行的手段。纵然假造机运用软硬件本领模仿真实cpu的处事进程,它究竟不是真实的cpu,因为精神有限,假造机的源代码者大概实行对所有intel训令集的扶助,所以当假造机会到其不看法的训令时将会连忙遏止处事。但经过对这类宏病毒代码的领会和统计,咱们创造常常那些特出训令对于宏病毒的解密自己没有爆发任何感化,它们的插入只是是为了干预假造机的处事,换句话说即是宏病毒基础不会运用这条随机的废物训令的演算截止。如许一来,咱们不妨仅结构一张一切特出训令对应于各别寻址办法的训令长度表,而不用为每个特出训令编写一个专用的模仿因变量。有了这张表后,当假造机会到不看法的训令时不妨用训令的操纵码索引表格以求得训令的长度,而后将暂时模仿的训令南针(eip)加上训令长度来跳过这条废物训令。固然,再有一个更为保障的方法那即是:获得训令长度后,不妨将这条咱们不看法的训令放到一个充溢空操纵训令(nop)的缓冲区中,接着咱们将跳到缓冲区中去实行,这即是让真实的cpu帮咱们来实行这条训令,结果一步固然是将实行后如实存放器中的截止放回咱们的模仿存放器中。这假造实行和如实实行各半本领的长处在乎:即使在特出训令对于宏病毒是有意旨的,即宏病毒依附其归来截止的情景下,假造机仍可保护假造实行截止的精确。 其次是构造化特殊处置本领,即宏病毒的解密代码开始树立本人的特殊处置因变量,而后蓄意激励一个特殊而使步调过程转向预先创造的特殊处置因变量。这种过程变化是cpu和操纵体例彼此共同的截止,而且在很大水平上,操纵体例在个中起了很大的效率。因为暂时的假造机只是模仿了没有养护查看的cpu的处事进程,而对于体例体制没有举行处置。以是面临激励特殊的训令会有两种截止:其一是某些安排有缺点的假造机没辙确定被模仿训令的正当性,以是模仿如许的训令将使假造机自己实行不法操纵而退出;其二假造机确定出被模仿训令属于不法训令,如试图向只读页面写入的训令,则连忙遏止假造实行。常常宏病毒运用该本领的手段在乎将真实轮回解密代码放到特殊处置因变量后,如许假造机将在加入特殊处置因变量前就遏止了处事,进而使解密子有时机隐藏假造实行。所以一个好的假造机该当完备创造和记载宏病毒安置特殊过滤因变量的操纵并在其激励特殊时机动将遏制转向特殊处置因变量的本领。 再次是进口点朦胧(epo)本领,即宏病毒在不窜改宿主原进口点的基础下,经过在宿主代码体内某处插入跳转训令来使宏病毒赢得遏制权。经过前方的领会,咱们领会假造机器扫描描宏病毒时出于功效商量不大概假造实行待查文献的一切代码,常常的做法是:扫描待查文献代码进口,假设在规则步数中没有创造解密轮回,则由此判决该文献没有带领加密变形宏病毒。这种本领之以是能起到反假造实行的效率在乎它凑巧运用了假造机的这个假如:因为宏病毒是从宿主实行到一半时赢得遏制权的,以是假造机开始证明实行的是宿主进口的平常步调,固然在规则步数中不大概创造解密轮回,所以爆发了漏报。即使假造性能减少规则步数的巨细,则很有大概跟着宏病毒插入的跳转训令盯梢加入宏病毒的解密子,但决定规则步数巨细简直是件难题:太大则将无谓减少平常步调的检验和测定功夫;太小则简单爆发漏报。但咱们对此也不用过于担忧,这类宏病毒因为其编写本领难度较大以是为数不多。在没有反汇编和假造实行引擎的扶助下,宏病毒很难在宿主体预定位一条完备训令的发端处来插入跳转,同声很难保护插入的跳转训令的深度大于假造机的规则步数,而且没有控制插入的跳转训令确定会被实行到。 其余再有多线程本领,即宏病毒在解密局部进口干线程中又启用了特殊的处事线程,而且将真实的轮回解密代码安置于处事线程中运转。因为多线程间切

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.