请使用IDA或其它分析工具分析本次的样本文件,写一个简要的行为分析报告,并编写一个针对于这次样本的专杀(恢复)程序。
要求:
1、样本分析只要说明主要行为即可。提示:sub_401320主要用于文件加密操作;sub_401470主要用于查找docx文件;sub_4017D0主要用于创建自删除脚本文件;sub_4019B0主要用于创建readme说明文件。
2、专杀工具需要能够识别本次的样本文件,可采用课堂上说过的两种取特征码的方法(也可以采用你自己的方法)进行样本识别与查杀。
3、专杀工具需要有文件恢复功能,需要采用逆运算的方式解密文件,同时还需要修改文件后缀,改回docx的扩展名。专杀工具采用的编程语言不限。
4、本次实验需要提交实验报告以及专杀程序的源代码。
链接:https://pan.baidu.com/s/10YhRSY40GgWXKln8BE1F3Q
提取码:1yto
实验开始准备阶段:
首先从网络教学平台下载资源,然后把自己电脑的杀毒软件关掉,因为样本有可能会被杀毒软件认为是病毒。所以要把杀毒软件关掉。
注意:这个实验期末考试会选出一段进行考试,所以要注意
病毒样本分析
(1)对sub_401320文件加密操作分析
分析:
- sleep - 程序休眠一点时间
- CreateFileA - 创建一个新的文件
- 移动文件指针到头部
- 读取同一个文件夹下的一个文件
分析:
- sleep - 程序休眠一点时间
- CreateFileA - 创建一个新的文件
- 移动文件指针到头部
- 读取同一个文件夹下的一个文件
(1)* 00000000004013C9 cmp [ebp+var_1C], 10h 比较,如果文件还未加密完(前16个字节),跳转00000000004013CF,
* xor c1,1 - 按位或1将获取的值加密
* 反之跳转00000000004013E2
* setFilePointer - 对文件指针偏移到最开始
* writeFile - 把前16个字节加密后的数据流写入之前创建的新文件
* Closehandle - 关闭文件句柄
具体流程图:
(2)sub_401470主要用于查找docx文件
分析:
LstrcpyA 、LstrlenA、lstrcatA - 主要获取文件夹里的路径,文件名,并对之进行处理
FindFirstFileEx - 根据文件名查找文件。该函数到一个文件夹(包括子文件夹)去搜索指定文件 如果要使用附加属性去搜索文件的话 可以使用FindFirstFileEx函数。
如果没有这些文件,跳转 loc_4016FC
有,则跳转0000000000401571
链接:
https://baike.baidu.com/item/FindFirstFile/9621776 - FindFirstFile
分析:
lstrcpyA - 复制字符串
LstrcatA - 连接字符串
总之就是一系列字符串的复制拼接
然后判断是否为空,不为空(!0),则跳转00000000004016FC
反之,为空(0)则跳转00000000004015D5
注:
test eax,eax 基本上和 And eax,eax 是一样的,不同的是test 不改变eax的结果,只是改变FLAG寄存器的状态,也就是改变进位标志,零标志,溢出标志等 等。举一个例子,如果eax=01h,test eax,eax 就是两个01h 作与操作,所以结果还是01h,不是0的话,就不会跳转 je xxxx。所以要跳转je xxxx,只有一种可能就是eax=0h.所以现在eax=0a 则不会跳转 je xxxx
链接:
https://zhidao.baidu.com/question/106832847.html - test eax,eax 如何解释?
分析:
PathFindExtension - 获得文件后缀名
Lstrcmp - 比较文件后缀名,如果是.docx 跳转0000000000401614,如果不是.docx,跳转00000000004016CC
注:PathFindExtension函数的功能是获取绝对路径或文件名中的文件扩展名。
链接:https://baike.baidu.com/item/PathFindExtension/2910474?noadapt=1 - PathFindExtension
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
分析:
上面一系列函数主要是用于装换.crc32后缀名,拼接文件名和路径
解释:
findNextFileA - 查找下一个文件
.text:004016EF cmp [ebp+var_564], 0 - 比较是否查找到最后,查找到最后,跳转00000000004016FC
.text:004016F6 jnz loc_401571 反之,跳转loc_401571
findClose - 查找停止
总的逻辑图
(3)对sub_4017D0主要用于创建自删除脚本文件分析
分析:
createFileA - 打开一个文件
.text:00401844 cmp [ebp+hObject], 0FFFFFFFFh
.text:0040184B jnz short loc_401852 - 如果文件打开成功,跳转到0000000000401852
反之,跳转到000000000040184D
GetModuleFileName -
获取当前进程已加载模块的文件的完整路径,该模块必须由当前进程加载。
如果想要获取另一个已加载模块的文件路径,可以使用GetModuleFileNameEx函数。
注:
(1)mov si,offset BUFFER 汇编后是mov si, xxxx,这里的xxxx指的是一个相对偏移量,是BUFFER在内存中的相对地址,是一串数字。
汇编器知道BUFFER相对于DS的地址,因为在做汇编的时候,告诉了汇编程序DS的值(ASSUME),然后汇编器通过计算BUFFER之前的东西要多少字节,就能知道BUFFER相对于DS的地址。
(2)Delself.cmd - 删除自身
(3)CreateFile
这个函数的功能是创建或者打开一个文件或者I/O设备,通常使用的I/O形式有文件、文件流、目录、物理磁盘、卷、终端流等。如执行成功,则返回文件句柄。 INVALID_HANDLE_VALUE 表示出错,会设置 GetLastError 。
链接:
https://bbs.youkuaiyun.com/topics/30115564 - offset到底是起什么作用?
http://www.bkjia.com/sdfd/967246.html - 反病毒攻防研究:自我复制与自删除
分析:
Writefile - 写一个勒索文件
CloseHandle - 关闭句柄
winExec - 运行删除程序
注:WinAPI: WinExec - 运行外部程序
完整逻辑图:
-
(4)sub_4019B0主要用于创建readme说明文件。
分析:
createFileA - 创建readme.txt文件
分析:
WriteFile - 给文件写入内容
closeHandle - 关闭句柄
具体流程图:
第二部分:专杀工具编写思路
- 用total command打开ScapeGoat01.docx
- 再点击运行病毒,用total command查看加密后的病毒,结合病毒分析,可以知道是
病毒分析:
该病毒virus.exe_是把word文件加密,怎么加密呢?是把word文件的文件前16个字节(好像是前16个字节)加密,word是一个压缩文件,打开它就是一个解密的过程,而对它的前16个字节加密,就是对word文件头进行加密(包含PE)。解压的原理是看被解压文件的文件头,看这个文件是什么类型,再依靠此信息进行解压。如果改变了文件头,就不能知道这个文件是什么文件,所以就不能打开被病毒加密的文件。所以我们要对文件解密,就要把被修改的文件头进行还原。病毒virus.exe_是通过什么方式进行进行加密的,就是把前16个字节的每一个字节xor(按位异或)1,怎么把它解密呢?
方法如下:
解密是把前16个字节再xor(按位异或)1
如原来的值为:11011101
加密:
11011101
^00000001
__________
11011100
解密:
11011100
^ 00000001
-----------------
11011101
注:
按位异或^
运算符^
1^1=0;0^0=0; //相同则为0
0^1=1;1^0=1; //不相同为1
专杀方法(两种):
提特征码
跳转oX00420020:
修改:此处有问题,就是通过地址跳转要使用F5(Goto)- 注意:输入的是偏移量,通过特征码跳转要使用F7(Search),上面这个图是错的,大家参考时知道就行
提取特征值:00420020 - 2E 63 72 63 33 32 00 00 2E 64 6F 63 78 00 00 00
提字符串:delself.cmd,或者是那句话(勒索的话),crc32
- 找偏移(地址:要减去前面的基地值),提取特征码,进行专杀
hash值MD5
(1)c语言查看程序MD5的值