好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 YWFhYmJi 于 2024-12-12 22:16 编辑
要穿透还原软件,首先要了解还原软件的原理,下面以××还原8.63标准版为例分析还原软件(注意:只分析硬盘还原功能,忽略鼠标键盘的过滤器和解冻空间的驱动)
首先使用DeviceTree观察硬盘的设备树,发现还原软件在硬盘上层和下层分别附加了过滤器,分别是DeepFrz.sys和DfDiskLo.sys
通过看文件名和测试发现,DeepFrz.sys主要负责系统保护,DfDiskLo.sys主要负责MBR保护
发现可以通过进入内核直接向SCSI Miniport(本例中是设备\Device\0000006f驱动\Driver\stornvme)发送IRP_MJ_SCSI绕过还原软件直接读写硬盘,参考 这篇文章(https://www.cnblogs.com/robinh00d/archive/2010/01/17/1650135.html)
但同时也失去了partmgr和文件系统驱动,只能按扇区读写,需要自己解析硬盘分区和文件系统
FAT32的分区结构简单,很好解析,但现在的系统都使用NTFS文件系统作为系统分区,但NTFS的分区结构比较复杂,所以采用开源linux ntfs读写库 ntfs-3g(https://github.com/tuxera/ntfs-3g),使用cygwin把它移植到windows上(主要修改了libntfs-3g里的win32_io.c),这样就可以在硬盘保护模式中修改和读取任意文件
解除保护就可以直接把还原软件的保护驱动替换成自己的假驱动,重启后就可以解除还原(注意:不能直接利用系统api定位驱动文件存储扇区并修改,因为驱动需要数字签名,直接修改扇区会导致数字签名失效)
尝试修改MBR,用一样的方法修改扇区,提示成功,但重启后MBR没有被修改,猜测发送的IRP被钩子拦截
使用OpenARK工具查看stornvme的派遣函数,发现IRP_MJ_INTERNAL_DEVICE_CONTROL(IRP_MJ_SCSI)被挂钩(指向DfDiskLo.sys,正常的是指向storport.sys!RaDriverScsiIrp),恢复钩子后修改MBR成功
恢复IRP_MJ_SCSI的hook可以直接在storport.sys中搜索特征码定位函数地址
[C] 纯文本查看 复制代码 NTSTATUS FindScsiMajorRoutineAddress(PULONG64 FuncAddress)
{
UCHAR sign[] = {
0x48, 0x89, 0x74, 0x24, 0x18, 0x57, 0x48, 0x83, 0xEC, 0x30, 0x48, 0x89, 0x6C, 0x24, 0x48, 0x48
};
RTL_PROCESS_MODULE_INFORMATION DriverInfo = { 0 };
NTSTATUS status = GetDriverInfo("storport.sys", &DriverInfo);
if (!NT_SUCCESS(status))
return status;
ULONG NeedSize = DriverInfo.ImageSize;
PVOID StartAddr = DriverInfo.ImageBase;
for (ULONG i = 0; i < NeedSize - sizeof(sign); i++)
{
if (RtlEqualMemory((PUCHAR)StartAddr + i, sign, sizeof(sign)))
{
*FuncAddress = i;
LogInfo("Found SCSI routine address: 0x%llX\n", *FuncAddress);
return STATUS_SUCCESS;
}
}
return STATUS_NOT_FOUND;
}
NTSTATUS RestoreSCSIMajorRoutine(PDRIVER_OBJECT DriverObject, ULONG64 FuncAddress)
{
RTL_PROCESS_MODULE_INFORMATION DriverInfo = { 0 };
NTSTATUS status = GetDriverInfo("storport.sys", &DriverInfo);
if (!NT_SUCCESS(status))
return status;
ULONG64 BaseAddress = (ULONG64)DriverInfo.ImageBase;
ULONG64 NewFuncAddress = FuncAddress + BaseAddress;
LogInfo("ScsiFunctionAddress=0x%llX\n", NewFuncAddress);
if (!MmIsAddressValid((PVOID)NewFuncAddress))
return STATUS_INVALID_PARAMETER;
InterlockedExchange64((PLONG64)&DriverObject->MajorFunction[IRP_MJ_SCSI], (LONG64)NewFuncAddress);
return STATUS_SUCCESS;
}
修改版ntfs-3g.7z
(888.01 KB, 下载次数: 18)
完整代码.7z
(1.15 MB, 下载次数: 21)
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|