首页
社区
课程
招聘
[原创]读写硬盘的一种新模式(无视大部分还原哦)
发表于: 2012-11-16 04:58 27845

[原创]读写硬盘的一种新模式(无视大部分还原哦)

2012-11-16 04:58
27845
ATAPI系列读写硬盘被大量穿透还原的恶意代码应用从而导致ATAPI读写磁盘已经不靠谱了,所以需要一种新方法~
用IDA打开HAL我们发现一组新的导出call~不过有操作系统限制,而且使用起来有操作系统限制(不过随着win7,win8的普及应该没啥问题了)~
不过也是很犀利的~详情见代码
typedef struct _X86BIOS_REGISTERS	// invented names
{
	ULONG Eax;
	ULONG Ecx;
	ULONG Edx;
	ULONG Ebx;
	ULONG Ebp;
	ULONG Esi;
	ULONG Edi;
	USHORT SegDs;
	USHORT SegEs;
} X86BIOS_REGISTERS, *PX86BIOS_REGISTERS;

NTHALAPI BOOLEAN x86BiosCall (ULONG, PX86BIOS_REGISTERS);

NTHALAPI NTSTATUS x86BiosAllocateBuffer (ULONG *, USHORT *, USHORT *);
NTHALAPI NTSTATUS x86BiosFreeBuffer (USHORT, USHORT);

NTHALAPI NTSTATUS x86BiosReadMemory (USHORT, USHORT, PVOID, ULONG);
NTHALAPI NTSTATUS x86BiosWriteMemory (USHORT, USHORT, PVOID, ULONG);

#pragma pack(1)
typedef struct _X86DISK_PACKET_
{
	USHORT Size;
	USHORT Sectors;
	USHORT Addr;
	USHORT Segment;
	ULONG64 StartSectorNumber;
	ULONG64 L_BufferAddr;
}X86DISK_PACKET,*PX86DISK_PACKET;
#pragma pack()

BOOL ReadDiskByInt13Ext(ULONG64 sector,USHORT numbers,PVOID *OutBuffer,UINT *nSize)
{
	ULONG cb = 0;
	BOOL bRet=FALSE;
	USHORT bufSeg=0,bufAddr=0;
	USHORT dpSeg=0,dpAddr=0;
	BOOL bBuf=FALSE;
	BOOL bDp =FALSE;
	NTSTATUS ns;
	X86DISK_PACKET dp;
	X86BIOS_REGISTERS regs;
	__try
	{
		if (!OutBuffer||!nSize)
			__leave;
		cb = numbers*512;//默认512一个sec这样看起来还行,其实应该好好计算的
		ns = x86BiosAllocateBuffer(&cb,&bufSeg,&bufAddr);
		if (!NT_SUCCESS(ns))
			__leave;
		bBuf =TRUE;
		cb = sizeof(X86DISK_PACKET);
		ns = x86BiosAllocateBuffer(&cb,&dpSeg,&dpAddr);
		if (!NT_SUCCESS(ns))
			__leave;
		bDp =TRUE;
		dp.Size = 0x10;
		dp.Sectors = numbers;
		dp.StartSectorNumber = sector;
		dp.Segment = bufSeg;
		dp.Addr = bufAddr;
		dp.L_BufferAddr=0;
		ns = x86BiosWriteMemory(dpSeg,dpAddr,&dp,sizeof(X86DISK_PACKET));
		if(!NT_SUCCESS(ns))
			__leave;
		RtlZeroMemory(®s,sizeof(X86BIOS_REGISTERS));
		regs.Eax = 0x4200;//AH=0x42
		regs.Edx = 0x0080;//DL=0x80 //第一个磁盘
		regs.SegDs = dpSeg;
		regs.Esi=dpAddr;
		if (x86BiosCall(0x13,®s))
		{
			UINT iSize = numbers*512;
			PVOID Buffer = ExAllocatePool(NonPagedPool,iSize);
			if (Buffer)
			{
				ns = x86BiosReadMemory(bufSeg,bufAddr,Buffer,iSize);
				if (NT_SUCCESS(ns))
				{
					*OutBuffer = Buffer;
					*nSize=iSize;
					bRet =TRUE;
				}
				else
				{
					ExFreePool(Buffer);
				}
			}		
		}
	}
	__except(EXCEPTION_EXECUTE_HANDLER)
	{
		DbgPrint("Exception From Read");
	}
	if (bBuf)
	{
		x86BiosFreeBuffer(bufSeg,bufAddr);
	}
	if (bDp)
	{
		x86BiosFreeBuffer(dpSeg,dpAddr);
	}
	return bRet;
}

BOOL WriteDiskInt13Ext(ULONG64 Sector,PVOID InBuffer,INT nInBuffSize)
{
	ULONG cb = 0;
	BOOL bRet=FALSE;
	USHORT bufSeg=0,bufAddr=0;
	USHORT dpSeg=0,dpAddr=0;
	BOOL bBuf=FALSE;
	BOOL bDp =FALSE;
	NTSTATUS ns;
	X86DISK_PACKET dp;
	X86BIOS_REGISTERS regs;
	USHORT numbers =0;
	__try
	{
		if (!InBuffer||!nInBuffSize)
			__leave;
		numbers = nInBuffSize/512;
		cb = nInBuffSize;//默认512一个sec这样看起来还行,其实应该好好计算的
		ns = x86BiosAllocateBuffer(&cb,&bufSeg,&bufAddr);
		if (!NT_SUCCESS(ns))
			__leave;
		bBuf =TRUE;
		cb = sizeof(X86DISK_PACKET);
		ns = x86BiosAllocateBuffer(&cb,&dpSeg,&dpAddr);
		if (!NT_SUCCESS(ns))
			__leave;
		bDp =TRUE;
		dp.Size = 0x10;
		dp.Sectors = numbers;
		dp.StartSectorNumber = Sector;
		dp.Segment = bufSeg;
		dp.Addr = bufAddr;
		dp.L_BufferAddr=0;
		ns = x86BiosWriteMemory(bufSeg,bufAddr,InBuffer,nInBuffSize);
		ns = x86BiosWriteMemory(dpSeg,dpAddr,&dp,sizeof(X86DISK_PACKET));
		if(!NT_SUCCESS(ns))
			__leave;
		RtlZeroMemory(®s,sizeof(X86BIOS_REGISTERS));
		regs.Eax = 0x4300;//AH=0x42
		regs.Edx = 0x0080;//DL=0x80 //第一个磁盘
		regs.SegDs = dpSeg;
		regs.Esi=dpAddr;
		if (x86BiosCall(0x13,®s))
		{
			bRet =TRUE;
		}
	}
	__except(EXCEPTION_EXECUTE_HANDLER)
	{
		DbgPrint("Exception From Read");
	}
	if (bBuf)
	{
		x86BiosFreeBuffer(bufSeg,bufAddr);
	}
	if (bDp)
	{
		x86BiosFreeBuffer(dpSeg,dpAddr);
	}
	return bRet;
}

注意部分系统下要注册一个KeRegisterBugCheckCallBack
然后通过自己调用BugCheck在自己的CallBack里才能随心所欲的使用这个代码——囧~
最后,这个代码只是个POC真正想要可用于各位的伟大事业必须继续努力修改和做很多处理,亲~(伸手党必然被砍手)

求捐助,求赞助,求投资,有意者欢迎联系QQ:86879759
欲购买 AntiGameProtect或UltraGameProtect或BypassGameProtect系列代码与产品 也欢迎联系。
AntiGameProtect系列用于穿透驱动保护调试程序
UltraGameProtect系列用于保护程序不被各类调试器(包括滴水调试器,GoodDbg等)成功调试
BypassGameProtect系列用于穿透驱动保护进行各种操作(如读写内存,注入dll,模拟键盘鼠标,防内存检测,DLL隐藏,反CRC效验等)

qq技术扯淡群1:171797360
qq技术扯淡群2:1748876
yy技术扯淡频道:80252844

[课程]Android-CTF解题方法汇总!

收藏
免费 6
支持
分享
最新回复 (59)
雪    币: 78
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
收我为徒吧
2012-11-16 06:32
0
雪    币: 292
活跃值: (153)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
收他为徒吧
2012-11-16 08:12
0
雪    币: 94
活跃值: (445)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
收亲为徒吧!
2012-11-16 08:25
0
雪    币: 485
活跃值: (78)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
5
占位学习~~~~~
2012-11-16 08:27
0
雪    币: 50
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
哈哈,V大又来放学血了
2012-11-16 08:30
0
雪    币: 673
活跃值: (278)
能力值: ( LV15,RANK:360 )
在线值:
发帖
回帖
粉丝
7
来顶一下 V大
2012-11-16 08:36
0
雪    币: 405
活跃值: (2150)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
在老外的一个BOOTKIT文档里介绍过,貌似VISTA以后能用,据说支持于VISTA的VESA BIOS EXTENSION.不过没试过,老v实验成功了?
2012-11-16 08:41
0
雪    币: 326
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
虽然看不明白是怎么回事。但我的原则就是看不懂的东西,就是好东西。
2012-11-16 09:32
0
雪    币: 274
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
楼主强大啊~~
2012-11-16 09:44
0
雪    币: 19
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
还没看懂,不过貌似很强大的样子,围观~
2012-11-16 09:50
0
雪    币: 13597
活跃值: (4393)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
12
弱弱的问下,UltraGameProtect保护的程序AntiGameProtect可以调不?
2012-11-16 10:05
0
雪    币: 27
活跃值: (90)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
13
我还可以站在第1页看V校
2012-11-16 10:19
0
雪    币: 6
活跃值: (1099)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
看到ls的问题的,我笑爆了,好像是小学课本里的一片文章耶
2012-11-16 10:21
0
雪    币: 17
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
顶一下.....茅和盾...不知道哪个比较厉害哈
2012-11-16 10:28
0
雪    币: 41
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
扩展13号中断读写硬盘
2012-11-16 10:28
0
雪    币: 1233
活跃值: (907)
能力值: ( LV12,RANK:750 )
在线值:
发帖
回帖
粉丝
17
这个必须mark?
2012-11-16 10:40
0
雪    币: 349
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
强大啊...........膜拜..
2012-11-16 11:07
0
雪    币: 107
活跃值: (326)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
谢谢分享..学习了..
2012-11-16 11:10
0
雪    币: 297
活跃值: (120)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
20
:) 占第二页看吧
2012-11-16 11:12
0
雪    币: 4873
活跃值: (3112)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
哈哈哈哈哈~
2012-11-16 11:25
0
雪    币: 4817
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
数据代码复制到低1M空间,切换到实模式,调用INT13扩展中断,切换回保护模式,复制回数据。
2012-11-16 11:27
0
雪    币: 122
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
这个貌似是个可行的路子
2012-11-16 11:37
0
雪    币: 4817
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
我是在说V大介绍的那种方法的实现原理(应该是,没研究过)
2012-11-16 11:51
0
雪    币: 300
活跃值: (179)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
25
tdsskill这个专杀工具里好像也有这样一段代码,当时没有仔细看,原来是这个意思!
2012-11-16 12:14
0
游客
登录 | 注册 方可回帖
返回
//