病毒重定位的基本思路和方法

实验 3    PE 病毒分析与清除(一)

3.1 实验名称

PE 病毒分析与清除

3.2 实验目的

1)  了解 PE 病毒的基本原理

2)  熟悉 PE 病毒中的部分关键技术

3)  学会清除 PE 病毒

3.3 实验步骤及内容

一阶段:

 熟悉 Masm32

1)    安装 masm32v11

2)    熟悉 masm32 的基本环境

3)    写一个最简单的 HelloWorld 程序,并编译成

4)    对得到的可执行文件进行反汇编, 比较其反汇编代码和最初的汇编代码有 些异同?

5)    查看并理解 masm32\bin 下各个批处理程序,了解它们的大致功能

二阶段:

 悉病毒重定位的基本思路和方法

  在 HelloWorld.exe 中添加一段代码, 该段代码满足以下几个条件:

该段代码弹出一个对话框(标题: 武大信安病毒重定位,内容: 姓 +学号后四位)

该段代码同时包括代码和字符串数据。

该段代码可以插入到.text  节的任意指令之间,而不需要修改该段代 码中的任何字节。

三阶段:

 搜索 API 函数地

  ollydbg  打开 HelloWorld.exe ,获取 kernel32.dll  模块基地址,定位到

kernel32.dll 模块。

  从内存中的 kernel32.dll 模块获取函数 LoadLibraryA GetProcAddress 的函

数地址,并实际检验获得的地址是否正确

第四段: PE 病毒感染分析与清除

 编教材中的感染例子程序-bookexample-old.rar

使用该感染例子对 HelloWorld.exe 进行感。思考以下问题:

  该病毒在感染文件时具体做了哪些操作?

  该病毒何返回 HOST

找出该病毒程序存在的一些问题,并解决这些问题。

编译教材中的感染例子程序-bookexample-new.rar

使用该感例子对计算器 calc.exe 进行感染。

手工恢复被感染的 calc.exe  (功能恢复)。

课后习题思考:

 对 Win10 下的在 32 位及 64 位程序来说, 如何通过 PEB 获取 kernel32 基地址? 32  64 程序有何差异?

 尝试编写一个程序,可用来搜索指定目录下的所有 exe 文件,用 MessageBox 显示每 一个被索到的 exe 文件名。

 编写课本中病毒感染序的病毒清除程序,其可以用来恢复被感染的任何文件

 课程提供的病毒感染例子程序在 64 位系统中无法正常感染, 请定位其原因, 并给出 解决方案。

3.4 实验关键过程、数据及其分析

Masm32

首先,根据安装程序引导,选择安装路径,执行完成后对应目录下出现masm32文件夹并弹出intro.txt。

 右键我的电脑-属性,在高级中选择环境变量编辑系统变量,新建lib加入masm32的lib库文件,再新建include加入masm32的include目录,最后在Path下添加masm32/bin目录。

编写一个HelloWorld.asm汇编程序,并用masn编辑器打开,如下图所示。可以看到数据段包含两个内容分别是“A MessageBox !”和“Hello, World !”,代码段包含两个部分分别是调用MessageBox函数和退出函数。

  选择Project中的Assemble & Link,可以生成.obj和.exe文件,如下图所示。

双击运行程序,程序会进行弹窗如下图所示。

使用masm32自带的反汇编工具对可执行文件HelloWorld.exe进行反汇编,反汇编的结果如下图红框所示。将生成的反汇编代码和源码进行比对,发现反汇编出的内容比原来的多,它先是将四个参数进行了压栈才进一步跳转到MessageBox函数的代码块位置,执行完后又压栈了一个0,才进行退出函数的调用。

熟悉病毒重定位的基本思路和方法

使用 OllyDbg打开HelloWorld.exe文件,由于要插入我们自己的一段代码,所以先将退出代码和一段剩余空间用NOP指令填充掉,选择二进制->用NOP填充,然后汇编一条指令call MessageBoxA,如下图所示。

接着在0x00401022的位置添加一条push 0指令,由于标题是“武大信安病毒重定位”9个汉字18字节,字符串最后需要00作为结束符,因此占据19=13H字节。因此在下一条指令处使用ctrl+e进行编辑汇编,call指令是E8,字节偏移要反写为13 00 00 00,即E8 13 00 00 00。然后把字符串填入系一条指令位置,注意要在末尾添上字节00作为结束符号。如下图所示。

选择在数据窗口中跟随,可以看到数据区已有我们写入的数据。

接着在0x0040103A位置push第三个参数(姓名和学号后四位),一共占6+4+1=11(0x0B)个字节,所以下一条指令是E8 0B 00 00 00。填入数据内容后,在后面加上00,表示结束,如下图所示。

最后,在0x0040104A处push第四个参数0。至此,MessageBoxA的四个参数全部入栈完毕,但是由于此时记录的地址都是相对偏移,在加载到内存后将会失效。因此,这里需要使用IAT地址,使用PEview可以看到IAT的位置是[00402008]。

使用call语句跳转到IAT表中MessageBoxA的位置。

     接着再push一个0退出进程,并且再调用退出函数(IAT地址为[00402000])即可退出。

然后选中修改内容,右键复制到可执行文件-全部修改-保存文件为test.exe,双击运行跳出弹窗,证明修改成功。

再将代码复制到其他位置进行测试,在dump区域选择我们自己的代码对应二进制数据-二进制复制-将原代码用NOP填充-将代码粘贴至0x00401030处。

保存修改后内容为test1.exe,可以看到运行后仍能成功弹窗,因为我们这段代码用到的全都是相对偏移,包括它调用的函数也是使用IAT地址表进行跳转,因此是可以移动的。

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值