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

发布时间:2023年12月18日

实验?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地址表进行跳转,因此是可以移动的。

文章来源:https://blog.csdn.net/weixin_49816179/article/details/135048683
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。