hd spoofer from ring0

转载 2007年09月14日 03:36:00
 /*
simple ring0 hd serial spoofer by Orkblutt aka s@t@nic@
credits:
Taurine for his sample on NtDeviceIoControlFile
jiurl for port hidder method
Bruce Allen & smartmontools devs
*/

#include <ntddk.h>

#define IOCTL_STORAGE_BASE 0x0000002d
#define IOCTL_DISK_BASE 0x00000007

#define IOCTL_STORAGE_QUERY_PROPERTY /
CTL_CODE(IOCTL_STORAGE_BASE0x0500,METHOD_BUFFEREDFILE_ANY_ACCESS
)

#define SMART_RCV_DRIVE_DATA /
CTL_CODE(IOCTL_DISK_BASE0x0022METHOD_BUFFEREDFILE_READ_ACCESS FILE_WRITE_ACCESS
)

#define ATA_IDENTIFY_DEVICE 0xec

#pragma pack(1)

typedef struct ServiceDescriptorEntry 
{
    
unsigned int *ServiceTableBase
;
    
unsigned int *ServiceCounterTableBase
//Used only in checked build
    
unsigned int NumberOfServices
;
    
unsigned char *ParamTableBase
;
ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t
;

struct ata_identify_device 
{
  
unsigned short words000_009[10
];
  
unsigned char  serial_no[20
];
  
unsigned short words020_022[3
];
  
unsigned char  fw_rev[8
];
  
unsigned char  model[40
];
  
unsigned short words047_079[33
];
  
unsigned short major_rev_num
;
  
unsigned short minor_rev_num
;
  
unsigned short command_set_1
;
  
unsigned short command_set_2
;
  
unsigned short command_set_extension
;
  
unsigned short cfs_enable_1
;
  
unsigned short word086
;
  
unsigned short csf_default
;
  
unsigned short words088_255[168
];
};

typedef enum _STORAGE_BUS_TYPE 
{
    
BusTypeUnknown 0x00
,
    
BusTypeScsi
,
    
BusTypeAtapi
,
    
BusTypeAta
,
    
BusType1394
,
    
BusTypeSsa
,
    
BusTypeFibre
,
    
BusTypeUsb
,
    
BusTypeRAID
,
    
BusTypeMaxReserved 
0x7F
STORAGE_BUS_TYPE, *PSTORAGE_BUS_TYPE
;

// retrieve the storage device descriptor data for a device. 
typedef struct _STORAGE_DEVICE_DESCRIPTOR 
{
  
ULONG  Version
;
  
ULONG  Size
;
  
UCHAR  DeviceType
;
  
UCHAR  DeviceTypeModifier
;
  
BOOLEAN  RemovableMedia
;
  
BOOLEAN  CommandQueueing
;
  
ULONG  VendorIdOffset
;
  
ULONG  ProductIdOffset
;
  
ULONG  ProductRevisionOffset
;
  
ULONG  SerialNumberOffset
;
  
STORAGE_BUS_TYPE  BusType
;
  
ULONG  RawPropertiesLength
;
  
UCHAR  RawDeviceProperties[1
];

STORAGE_DEVICE_DESCRIPTOR, *PSTORAGE_DEVICE_DESCRIPTOR
;


#pragma pack()

#pragma pack(1)

typedef struct _GETVERSIONOUTPARAMS 
{
    
UCHAR  bVersion
;
    
UCHAR  bRevision
;
    
UCHAR  bReserved
;
    
UCHAR  bIDEDeviceMap
;
    
ULONG  fCapabilities
;
    
ULONG  dwReserved[4
];
GETVERSIONOUTPARAMS, *PGETVERSIONOUTPARAMS, *LPGETVERSIONOUTPARAMS
;


typedef struct _IDEREGS 
{
    
UCHAR  bFeaturesReg
;
    
UCHAR  bSectorCountReg
;
    
UCHAR  bSectorNumberReg
;
    
UCHAR  bCylLowReg
;
    
UCHAR  bCylHighReg
;
    
UCHAR  bDriveHeadReg
;
    
UCHAR  bCommandReg
;
    
UCHAR  bReserved
;
IDEREGS, *PIDEREGS, *LPIDEREGS
;

typedef struct _SENDCMDINPARAMS 
{
    
ULONG  cBufferSize
;
    
IDEREGS  irDriveRegs
;
    
UCHAR  bDriveNumber
;
    
UCHAR  bReserved[3
];
    
ULONG  dwReserved[4
];
    
UCHAR  bBuffer[1
];
SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS
;


typedef struct _DRIVERSTATUS 
{
    
UCHAR  bDriverError
;
    
UCHAR  bIDEError
;
    
UCHAR  bReserved[2
];
    
ULONG  dwReserved[2
];
DRIVERSTATUS, *PDRIVERSTATUS, *LPDRIVERSTATUS
;

typedef struct _SENDCMDOUTPARAMS 
{
    
ULONG  cBufferSize
;
    
DRIVERSTATUS  DriverStatus
;
    
UCHAR  bBuffer[1
];
SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS
;


#pragma pack()


__declspec(dllimport
ServiceDescriptorTableEntry_t
KeServiceDescriptorTable
;


// smartmontools code to deal with non big endian system

// Copies n bytes (or n-1 if n is odd) from in to out, but swaps adjacents
// bytes.
void swapbytes(char *out, const char *insize_t n
)
{
  
size_t i
;

  for (
0n+= 2
) {
    
out[i]   = in[i+1
];
    
out[i+1] = in[i
];
  }
}

// Copies in to out, but removes leading and trailing whitespace.
void trim(char *out, const char *in
)
{
  
int ifirstlast
;

  
// Find the first non-space character (maybe none).
  
first = -1
;
  for (
0in[i]; i
++)
    if (!
isspace((int)in[i
])) {
      
first i
;
      break;
    }

  if (
first == -1
) {
    
// There are no non-space characters.
    
out[0] = '/0'
;
    return;
  }

  
// Find the last non-space character.
  
for (strlen(in)-1>= first && isspace((int)in[i]); i
--)
    ;
  
last i
;

  
strncpy(outin+firstlast-first+1
);
  
out[last-first+1] = '/0'
;
}

// Convenience function for formatting strings from ata_identify_device
void formatdriveidstring(char *out, const char *inint n
)
{
  
char tmp[65
];
  
64 64 n
;
  
swapbytes(tmpinn
);
  
tmp[n] = '/0'
;
  
trim(outtmp
);
}



NTSYSAPI
NTSTATUS
NTAPI ZwDeviceIoControlFile
(
    
IN HANDLE FileHandle
,
    
IN HANDLE Event OPTIONAL
,
    
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
    
IN PVOID ApcContext OPTIONAL
,
    
OUT PIO_STATUS_BLOCK IoStatusBlock
,
    
IN ULONG IoControlCode
,
    
IN PVOID InputBuffer OPTIONAL
,
    
IN ULONG InputBufferLength
,
    
OUT PVOID OutputBuffer OPTIONAL
,
    
IN ULONG OutputBufferLength
);


typedef NTSTATUS (*ZWDEVICEIOCONTROLFILE
)(
    
IN HANDLE FileHandle
,
    
IN HANDLE Event OPTIONAL
,
    
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
    
IN PVOID ApcContext OPTIONAL
,
    
OUT PIO_STATUS_BLOCK IoStatusBlock
,
    
IN ULONG IoControlCode
,
    
IN PVOID InputBuffer OPTIONAL
,
    
IN ULONG InputBufferLength
,
    
OUT PVOID OutputBuffer OPTIONAL
,
    
IN ULONG OutputBufferLength
);


ZWDEVICEIOCONTROLFILE OldZwDeviceIoControlFile
;

NTSTATUS NewZwDeviceIoControlFile
(
    
IN HANDLE FileHandle
,
    
IN HANDLE Event OPTIONAL
,
    
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
    
IN PVOID ApcContext OPTIONAL
,
    
OUT PIO_STATUS_BLOCK IoStatusBlock
,
    
IN ULONG IoControlCode
,
    
IN PVOID InputBuffer OPTIONAL
,
    
IN ULONG InputBufferLength
,
    
OUT PVOID OutputBuffer OPTIONAL
,
    
IN ULONG OutputBufferLength
)
{

    
PSTORAGE_DEVICE_DESCRIPTOR output
;
    
PSENDCMDINPARAMS  cmdinput
;
    
PSENDCMDOUTPARAMS cmdoutput
;
    
struct ata_identify_device *hdid
;

    
NTSTATUS rc
;
    
rc = ((ZWDEVICEIOCONTROLFILE)(OldZwDeviceIoControlFile
)) (
             
FileHandle
,
             
Event
,
             
ApcRoutine
,
             
ApcContext
,
             
IoStatusBlock
,
             
IoControlCode
,
             
InputBuffer
,
             
InputBufferLength
,
             
OutputBuffer
,
             
OutputBufferLength
         
);



    if(
IoControlCode != IOCTL_STORAGE_QUERY_PROPERTY && IoControlCode != SMART_RCV_DRIVE_DATA
)
        return(
rc
);

    if(
NT_SUCCESS(rc
))
    {
        switch( 
IoControlCode 
)
        {
        case 
IOCTL_STORAGE_QUERY_PROPERTY
:

            
output = (PSTORAGE_DEVICE_DESCRIPTOROutputBuffer
;
            if( 
output->SerialNumberOffset 

            {
                
charserialnum = (char*)output output->SerialNumberOffset
;
                
formatdriveidstring(serialnum"FAKE SERIAL"40
);
            }

            if( 
output->ProductIdOffset 

            {
                
charproductid = (char*)output output->ProductIdOffset
;
                
strncpyproductid"STUPID PB"strlen(productid
) );
            }

            if( 
output->VendorIdOffset 

            {
                
charvendorid = (char*)output output->VendorIdOffset
;
                
strncpyvendorid"asdfghjkl"strlen(vendorid
) );
            }

            break;

        case 
SMART_RCV_DRIVE_DATA
:

            
cmdinput  = (PSENDCMDINPARAMS)  InputBuffer
;
            
cmdoutput = (PSENDCMDOUTPARAMSOutputBuffer
;

            if (
cmdinput->irDriveRegs.bCommandReg == ATA_IDENTIFY_DEVICE

            {
                
hdid = (struct ata_identify_device*) (cmdoutput->bBuffer
);
                
formatdriveidstring(hdid->model"spoofed model!"40 
);
                
formatdriveidstringhdid->serial_no"serial goes here"20 
);
            }
            break;
        }
    }

    return(
rc
);

}


NTSTATUS DriverDispatch
(
    
IN PDEVICE_OBJECT DeviceObject
,
    
IN PIRP Irp
)
{

    
Irp->IoStatus.Status STATUS_SUCCESS
;

    
IoCompleteRequest (Irp,IO_NO_INCREMENT
);

    return 
Irp->IoStatus.Status
;
}



void DriverUnload(IN PDRIVER_OBJECT DriverObject
)
{

    
_asm
    
{
        
CLI 
//dissable interrupt
        
MOV EAXCR0 
//move CR0 register into EAX
        
AND EAXNOT 10000H 
//disable WP bit
        
MOV CR0EAX 
//write register back
    
}

    (
KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)ZwDeviceIoControlFile+1
)])
    = (
ULONG)OldZwDeviceIoControlFile
;

    
_asm

    
{
        
MOV EAXCR0 
//move CR0 register into EAX
        
OR EAX10000H 
//enable WP bit
        
MOV CR0EAX 
//write register back
        
STI 
//enable interrupt
    
}
}


NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObjectIN PUNICODE_STRING RegistryPath
)
{

    
DriverObject->MajorFunction[IRP_MJ_CREATE] = DriverObject->MajorFunction[IRP_MJ_CLOSE] = DriverDispatch
;

    
DriverObject->DriverUnload DriverUnload
;

    
// save old system call locations

    
OldZwDeviceIoControlFile = (ZWDEVICEIOCONTROLFILE)(KeServiceDescriptorTable.ServiceTableBase
[
                                   *(
PULONG)((PUCHAR)ZwDeviceIoControlFile+1
)]);

    
_asm
    
{
        
CLI 
//dissable interrupt
        
MOV EAXCR0 
//move CR0 register into EAX
        
AND EAXNOT 10000H 
//disable WP bit
        
MOV CR0EAX 
//write register back
    
}

    (
KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)ZwDeviceIoControlFile+1
)])
    = (
ULONG)NewZwDeviceIoControlFile
;

    
_asm
    
{
        
MOV EAXCR0 
//move CR0 register into EAX
        
OR EAX10000H 
//enable WP bit
        
MOV CR0EAX 
//write register back
        
STI 
//enable interrupt
    
}

    return 
STATUS_SUCCESS
;

性能测试之——IP Spoofer技术

性能测试之——IP Spoofer技术 默认情况下,同一个Load Generator上的所有虚拟用户都是用该Generator的IP地址来访问服务器,即在同一个负载生成器计算机上的Vuser具有相...
  • aovenus
  • aovenus
  • 2012年07月05日 21:41
  • 2386

获取微信用户openid的三种方法#ACCESS_TOKEN

本文介绍如何获得微信公众平台关注用户的基本信息,包括昵称、头像、性别、国家、省份、城市、语言。 在本文中,特别要注意的是有两个不同的Access Token,他们产生的方式不一样,一种是使用AppI...
  • weixin_40104079
  • weixin_40104079
  • 2017年11月01日 11:23
  • 261

chrome ua spoofer插件可以切换到其他终端ipad等模式浏览

chrome ua spoofer插件可以修改user agentchrome 浏览模式选择:andriod,ipadF12工具栏:Network监控。找到qmt/183081...
  • lumengabc
  • lumengabc
  • 2013年12月09日 10:57
  • 1677

ring0检测隐藏进程

2007年8月26日 ring0检测隐藏进程标 题: 【原创】ring0检测隐藏进程作 者: 堕落天才时 间: 2007-05-10,13:28链 接: http://bbs.pediy.com/...
  • jingzu
  • jingzu
  • 2007年11月27日 12:54
  • 2198

终于完成了Ring3下挂钩ring0下的函数程序(目前支持xp)

折腾了一天终于把这个程序搞定了,是蓝了我N次屏变换了N多种方法,终于稳定实现了。目前只是SSDT 挂钩了NtOpenProcess,其实可以挂钩任何ring0下函数(理论上,只是其中很多非常麻烦,会把...
  • chenhui530
  • chenhui530
  • 2008年03月23日 21:00
  • 2963

揭秘Windows内核——如何利用自定义驱动程序在Ring3做Ring0的勾当!

最近在做图像处理(其实是利用摄像机采回来的Image进行分析,从而得到目标的运动信息),既然是图像处理那就得有图像Source,没错那就是Camera,实验室的这个Camera还挺高级的,是千兆以太网...
  • LnTigerLn
  • LnTigerLn
  • 2012年05月30日 05:55
  • 1707

KeUserModeCallback用法详解(Ring0调用Ring3代码)

ring0调用ring3早已不是什么新鲜事,除了APC,我们知道还有KeUserModeCallback.其原型如下: 代码: NTSTATUS KeUserModeCallback (   ...
  • zacklin
  • zacklin
  • 2012年07月17日 10:29
  • 2901

ring0下读取用户进程内存(转)2010-05-30 21:32ring0下读取用户进程内存

ring0下读取用户进程内存(转)2010-05-30 21:32ring0下读取用户进程内存 这里只是简单的实现下读取进程空间的数据...写操做也是一样的....比较简单... ...
  • hucaiyu2009
  • hucaiyu2009
  • 2010年07月14日 23:49
  • 776

loadrunner进阶——学习五、IP欺骗(IP Spoofer)

学习五、IP欺骗(IP Spoofer)运行场景时,vuser使用它们所在的load generator的固定的IP,同时每个generator上运行大量的vuser,会造成大量用户使用同一IP同时访...
  • huilan_same
  • huilan_same
  • 2016年06月12日 16:49
  • 812

在ring0调用Ring3的代码

作者:VXK/CVC.GB时间:2005-02-05 每次上driverdevelop总看到有人问怎么在Ring0下调用Ring3的代码——Ring3使用Ring0已经是地球人全知道的事情了,但是ri...
  • iiprogram
  • iiprogram
  • 2006年05月11日 08:37
  • 3736
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章: hd spoofer from ring0
举报原因:
原因补充:

(最多只允许输入30个字)