ACCESS硬盘序列号读取工具序列号

关于硬盘物理序列号和模拟硬盘物理序列号
理想高二级同学
关于硬盘物理序列号和模拟硬盘物理序列号
浏览:44497
欢迎光临理想论坛,由于您没有登录,所以无法查看到论坛的附件及隐藏分区,也无法与其他会员交流。
还没有理想论坛的帐号?
什么是硬盘物理序列号:
每个硬盘都有一个唯一的编号,以此来区分每个硬盘,就和指纹一样,你可以用程序得到,一般用来加密或验证用的
目前很多注册软件都是以硬盘的物理序列号来生成注册码,所以有了下面的这些工具你就可以大施拳脚了。
要判断哪些软件是这种软件,找一台注册过的机器,把硬盘移到同样配置的机器上,看该软件还能不能运行就知道了。
下面1、2、3、4楼分别说一说小原理,提供一些硬盘序列号查看软件,及模拟硬盘物理序列号的尝试和软件,以及介绍硬盘物理序列号修改软件PC3000,算是抛砖引玉;使用方法自己去摸索,特别提醒有风险,使用的后果自负。具体可以干什么,大家应该清楚,这里不明说。
下面的是在Win9x/NT下获取硬盘物理序列号的一种代码
#include &WinIOCtl.h&
#include &stdio.h&
#pragma inline
//---------------------------------------------------------------------------
// IDE NT/2000/XP专用变量
#define GETVERSIONOUTPARAMS& &&&GETVERSIONINPARAMS
#define DFP_GET_VERSION& && && &SMART_GET_VERSION
#define DFP_SEND_DRIVE_COMMAND&&SMART_SEND_DRIVE_COMMAND
#define DFP_RCV_DRIVE_DATA& && &SMART_RCV_DRIVE_DATA
const WORD IDE_ATAPI_IDENTIFY = 0xA1;& &// 读取ATAPI设备的命令
const WORD IDE_ATA_IDENTIFY& &= 0xEC;& &// 读取ATA设备的命令
const int MAX_IDE_DRIVES = 4;
// SCSI专用变量
const DWORD FILE_DEVICE_SCSI& && && && & = 0x0000001B;
const DWORD IOCTL_SCSI_MINIPORT_IDENTIFY = ((FILE_DEVICE_SCSI && 16) + 0x0501);
const DWORD IOCTL_SCSI_MINIPORT& && && & = 0x; // see NTDDSCSI.H for definition
const DWORD SENDIDLENGTH&&= sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE;
typedef struct _SRB_IO_CONTROL
& & ULONG HeaderL
& & UCHAR Signature[8];
& & ULONG T
& & ULONG ControlC
& & ULONG ReturnC
& & ULONG L
}SRB_IO_CONTROL, *PSRB_IO_CONTROL;
// 读取的主函数
void __fastcall ReadPhysicalDrive(TStrings *pSerList, TStrings *pModeList);
// 辅助函数
char *__fastcall ConvertToString(DWORD dwDiskData[256], int nFirstIndex, int nLastIndex);
// NT/2000/XP函数
void __fastcall ReadPhysicalDriveOnNT(TStrings *pSerList, TStrings *pModeList);
bool __fastcall DoIdentify(HANDLE hPhysicalDriveIOCTL, PSENDCMDINPARAMS pSCIP,
& && &&&PSENDCMDOUTPARAMS pSCOP, BYTE btIDCmd,
& && &&&BYTE btDriveNum, PDWORD lpcbBYTEsReturned);
// Windows 9X函数
void __fastcall ReadPhysicalDriveOnW9X(TStrings *pSerList, TStrings *pModeList);
void __fastcall ReadPhysicalDriveOnW9X_Ring0(bool IsFirst, WORD BaseAddress,
& && &&&BYTE MoS, bool &IsIDEExist, bool &IsDiskExist, WORD *OutData);
// SCSI读取函数(for NT/2000/XP)
String __fastcall ReadIDEDriveAsScsiDriveOnNT();
//---------------------------------------------------------------------------
// ReadPhysicalDrive
void __fastcall ReadPhysicalDrive(TStrings *pSerList, TStrings *pModeList)
& & switch(Win32Platform)
& && &&&case VER_PLATFORM_WIN32_WINDOWS:
& && && && &ReadPhysicalDriveOnW9X(pSerList, pModeList);
& && && && &
& && &&&case VER_PLATFORM_WIN32_NT:
& && && && &ReadPhysicalDriveOnNT(pSerList, pModeList);
& && && && &
& && &&&default:
& && && && &
//---------------------------------------------------------------------------
// ConvertToString
char *__fastcall ConvertToString(DWORD dwDiskData[256], int nFirstIndex, int nLastIndex)
& & static char szResBuf[1024];
& & int nIndex = 0;
& & int nPosition = 0;
& & // Each integer has two characters stored in it backwards
& & for(nIndex = nFirstI nIndex &= nLastI nIndex++)
& && &&&// Get high BYTE for 1st character
& && &&&szResBuf[nPosition] = (char)(dwDiskData[nIndex] / 256);
& && &&&nPosition++;
& && &&&// Get low BYTE for 2nd character
& && &&&szResBuf[nPosition] = (char)(dwDiskData[nIndex] % 256);
& && &&&nPosition++;
& & // End the string
& & szResBuf[nPosition] = '\0';
& & // Cut off the trailing blanks
& & for(nIndex = nPosition - 1; nIndex & 0 && ' ' == szResBuf[nIndex]; nIndex--)
& && &&&szResBuf[nIndex] = '\0';
& & return szResB
//---------------------------------------------------------------------------
// Winndows NT4/2000/XP 代码
//---------------------------------------------------------------------------
// ReadPhysicalDriveOnNT
void __fastcall ReadPhysicalDriveOnNT(TStrings *pSerList, TStrings *pModeList)
& & // 输出参数
& & BYTE btIDOutCmd[sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1];
& & for(int nDrive=0; nDrive & MAX_IDE_DRIVES; nDrive++)
& && &&&HANDLE hPhysicalDriveIOCTL;
& && &&&char szDriveName[32];
& && &&&sprintf(szDriveName, &\\\\.\\PhysicalDrive%d&, nDrive);
& && &&&hPhysicalDriveIOCTL = CreateFile(szDriveName,
& && && && && && && && &GENERIC_READ | GENERIC_WRITE,
& && && && && && && && &FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
& && && && && && && && &OPEN_EXISTING, 0, NULL);
& && &&&if(hPhysicalDriveIOCTL != INVALID_HANDLE_VALUE)
& && && && &DWORD dwBytesReturned = 0;
& && && && &GETVERSIONOUTPARAMS gvopVersionP
& && && && &// Get the version, etc of PhysicalDrive IOCTL
& && && && &ZeroMemory(&gvopVersionParams, sizeof(GETVERSIONOUTPARAMS));
& && && && &if(!DeviceIoControl(hPhysicalDriveIOCTL, DFP_GET_VERSION,
& && && && && && &&&NULL, 0, &gvopVersionParams, sizeof(gvopVersionParams),
& && && && && && &&&&dwBytesReturned, NULL))
& && && && &{
& && && && && &
& && && && &}
& && && && &if(gvopVersionParams.bIDEDeviceMap & 0)
& && && && &{
& && && && && & // IDE or ATAPI IDENTIFY cmd
& && && && && & BYTE btIDCmd = 0;
& && && && && & SENDCMDINPARAMS InP
& && && && && & // Now, get the ID sector for all IDE devices in the system.
& && && && && & // If the device is ATAPI use the IDE_ATAPI_IDENTIFY command,
& && && && && & // otherwise use the IDE_ATA_IDENTIFY command
& && && && && & // 具体所得结果请参考头文件中的说明
& && && && && & btIDCmd = (gvopVersionParams.bIDEDeviceMap && nDrive & 0x10) ?
& && && && && && && && &IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY;
& && && && && & ZeroMemory(&InParams, sizeof(SENDCMDINPARAMS));
& && && && && & ZeroMemory(btIDOutCmd, sizeof(btIDOutCmd));
& && && && && & if(DoIdentify(hPhysicalDriveIOCTL,
& && && && && && && &&InParams, (PSENDCMDOUTPARAMS)btIDOutCmd,
& && && && && && && &(BYTE)btIDCmd, (BYTE)nDrive, &dwBytesReturned))
& && && && && & {
& && && && && && &&&DWORD dwDiskData[256];
& && && && && && &&&USHORT *pIDS // 对应结构IDSECTOR,见头文件
& && && && && && &&&char szSerialNumber[21];
& && && && && && &&&char szModelNumber[41];
& && && && && && &&&pIDSector = (USHORT*)((SENDCMDOUTPARAMS*)btIDOutCmd)-&bB
& && && && && && &&&for(int i=0; i & 256; i++)
& && && && && && && && &dwDiskData = pIDSector;
& && && && && && &&&// 取系列号
& && && && && && &&&ZeroMemory(szSerialNumber, sizeof(szSerialNumber));
& && && && && && &&&strcpy(szSerialNumber, ConvertToString(dwDiskData, 10, 19));
& && && && && && &&&// 取模型号
& && && && && && &&&ZeroMemory(szModelNumber, sizeof(szModelNumber));
& && && && && && &&&strcpy(szModelNumber, ConvertToString(dwDiskData, 27, 46));
& && && && && && &&&pSerList-&Add(szSerialNumber);
& && && && && && &&&pModeList-&Add(szModelNumber);
& && && && && & }
& && && && &}
& && && && &CloseHandle (hPhysicalDriveIOCTL);
//---------------------------------------------------------------------------
// DoIdentify
bool __fastcall DoIdentify(HANDLE hPhysicalDriveIOCTL, PSENDCMDINPARAMS pSCIP,
& && && && &&&PSENDCMDOUTPARAMS pSCOP, BYTE btIDCmd, BYTE btDriveNum,
& && && && &&&PDWORD pdwBytesReturned)
& & // Set up data structures for IDENTIFY command.
& & pSCIP-&cBufferSize = IDENTIFY_BUFFER_SIZE;
& & pSCIP-&irDriveRegs.bFeaturesReg = 0;
& & pSCIP-&irDriveRegs.bSectorCountReg&&= 1;
& & pSCIP-&irDriveRegs.bSectorNumberReg = 1;
& & pSCIP-&irDriveRegs.bCylLowReg&&= 0;
& & pSCIP-&irDriveRegs.bCylHighReg = 0;
& & // Compute the drive number.(主盘和从盘所对应的值是不一样的)
& & pSCIP-&irDriveRegs.bDriveHeadReg = (btDriveNum & 1) ? 0xB0 : 0xA0;
& & // The command can either be IDE identify or ATAPI identify.
& & pSCIP-&irDriveRegs.bCommandReg = btIDC
& & pSCIP-&bDriveNumber = btDriveN
& & pSCIP-&cBufferSize = IDENTIFY_BUFFER_SIZE;
& & return DeviceIoControl(hPhysicalDriveIOCTL, DFP_RCV_DRIVE_DATA,
& && && &&&(LPVOID)pSCIP,
& && && &&&sizeof(SENDCMDINPARAMS) - 1,
& && && &&&(LPVOID)pSCOP,
& && && &&&sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1,
& && && &&&pdwBytesReturned, NULL);
//---------------------------------------------------------------------------
// Windows 95/98/ME 代码
//---------------------------------------------------------------------------
// ReadPhysicalDriveOnW9X
void __fastcall ReadPhysicalDriveOnW9X(TStrings *pSerList, TStrings *pModeList)
& & WORD wOutData[256];
& & SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
& & // 经过测试,发现第一次调用而且Drive &= 2时会在Ring0代码中出现错误,导致蓝屏。
& & // 经过N(N & 15)次的蓝屏后仍找不到原因:(,不得不在这里增加一段无用代码以
& & // 避免蓝屏的出现。(期待高人能指出原因)
& & for(int nDrive = 0; nDrive & 8; nDrive++)
& && &&&WORD dwBaseA
& && &&&BYTE btMasterS& && && &// Master Or Slave
& && &&&bool bIsIDEE
& && &&&bool IsDiskE
& && &&&switch(nDrive / 2)
& && && && &case 0: dwBaseAddress = 0x01F0;
& && && && &case 1: dwBaseAddress = 0x0170;
& && && && &case 2: dwBaseAddress = 0x01E8;
& && && && &case 3: dwBaseAddress = 0x0168;
& && &&&btMasterSlave = (BYTE)(((nDrive % 2) == 0) ? 0xA0 : 0xB0);
& && &&&// 进入Ring0
& && &&&ReadPhysicalDriveOnW9X_Ring0(true, dwBaseAddress, btMasterSlave,
& && && && && & bIsIDEExist, IsDiskExist, wOutData);
& & // 开始读取
& & for(int nDrive = 0; nDrive & 8; nDrive++)
& && &&&WORD dwBaseA
& && &&&BYTE btMasterS& && && &// Master Or Slave
& && &&&bool bIsIDEE
& && &&&bool bIsDiskE
& && &&&switch(nDrive / 2)
& && && && &case 0: dwBaseAddress = 0x01F0;
& && && && &case 1: dwBaseAddress = 0x0170;
& && && && &case 2: dwBaseAddress = 0x01E8;
& && && && &case 3: dwBaseAddress = 0x0168;
& && &&&btMasterSlave = (BYTE)(((nDrive % 2) == 0) ? 0xA0 : 0xB0);
& && &&&// 进入Ring0
& && &&&bIsIDEExist&&=
& && &&&bIsDiskExist =
& && &&&ZeroMemory(wOutData, sizeof(wOutData));
& && &&&ReadPhysicalDriveOnW9X_Ring0(false, dwBaseAddress, btMasterSlave,
& && && && && & bIsIDEExist, bIsDiskExist, wOutData);
& && &&&if(bIsIDEExist && bIsDiskExist)
& && && && &DWORD dwDiskData[256];
& && && && &char&&szSerialNumber[21];
& && && && &char&&szModelNumber[41];
& && && && &for(int k=0; k & 256; k++)
& && && && && & dwDiskData[k] = wOutData[k];
& && && && &// 取系列号
& && && && &ZeroMemory(szSerialNumber, sizeof(szSerialNumber));
& && && && &strcpy(szSerialNumber, ConvertToString(dwDiskData, 10, 19));
& && && && &// 取模型号
& && && && &ZeroMemory(szModelNumber, sizeof(szModelNumber));
& && && && &strcpy(szModelNumber, ConvertToString(dwDiskData, 27, 46));
& && && && &pSerList-&Add(szSerialNumber);
& && && && &pModeList-&Add(szModelNumber);
& & SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS);
//---------------------------------------------------------------------------
// ReadPhysicalDriveOnW9X_Ring0()
// dwBaseAddress = IDE(0,1,2,3) : 1F0h, 170h, 1E8h, 168h
// btMasterSlave = Master(0xA0) Or Slave(0xB0)
//---------------------------------------------------------------------------
void __fastcall ReadPhysicalDriveOnW9X_Ring0(bool bIsFirst, WORD dwBaseAddress,
& && &&&BYTE btMasterSlave, bool &bIsIDEExist, bool &bIsDiskExist, WORD *pOutData)
& & BYTE&&btIDTR1[6];
& & DWORD dwOldExceptionH
& & const int nHookExceptionNo = 5;
& & BYTE&&btIsIDEExist = 0;
& & BYTE&&btIsDiskExist = 0;
& & WORD&&wOutDataBuf[256];
& & BYTE&&btIsFirst = (BYTE)bIsF
& & const BYTE btBit00 = 0x01;
& & // const BYTE btBit02 = 0x04;
& & const BYTE btBit06 = 0x40;
& & const BYTE btBit07 = 0x80;
& & // const BYTE btERR&&= btBit00;
& & const BYTE btBusy = btBit07;
& & const BYTE btAtaCmd& &= 0xEC;
& & const BYTE btAtapiCmd = 0xA1;
& && &&&// 必须先执行这条语句
& && &&&JMP EnterRing0
& && &&&// 定义过程
& && &&&// 等待IDE设备直到其不为忙为止
& && &&&WaitWhileBusy proc
& && &&&MOV&&EBX, 100000
& && &&&MOV&&DX, dwBaseAddress
& && &&&ADD&&DX, 7
& && &&&LoopWhileBusy:
& && &&&DEC&&EBX
& && &&&CMP&&EBX, 0
& && &&&JZ& &Timeout
& && &&&in& &AL, DX
& && &&&TEST AL, btBusy
& && &&&JNZ&&LoopWhileBusy
& && &&&JMP&&DriveReady
& && &&&// 超时,直接退出
& && &&&Timeout:
& && &&&JMP&&LeaveRing0
& && &&&DriveReady:
& && &&&RET
& && &&&ENDP& &// End of WaitWhileBusy Procedure
& && &&&// 设置主盘和从盘标志
& && &&&SelectDevice proc
& && &&&MOV&&DX, dwBaseAddress
& && &&&ADD&&DX, 6
& && &&&MOV&&AL, btMasterSlave
& && &&&out&&DX, AL
& && &&&RET
& && &&&ENDP&&// End of SelectDevice Procedure
& && &&&// 向IDE设备发送存取指令
& && &&&SendCmd proc
& && &&&MOV DX, dwBaseAddress
& && &&&ADD DX, 7
& && &&&MOV AL, BL // BL是主从盘标识,在过程外设置
& && &&&out DX, AL
& && &&&RET
& && &&&ENDP&&// End of SendCmd Procedure
& && &&&// Ring0代码
& && &&&Ring0Proc:
& && &&&PUSHAD
& && &&&// 查询IDE设备是否存在
& && &&&MOV DX, dwBaseAddress
& && &&&ADD DX, 7
& && &&&in&&AL,DX
& && &&&// 当AL的值是0xFF或者0x7F时,IDE设备不存在,这时候直接返回
& && &&&CMP AL,0xFF
& && &&&JZ&&LeaveRing0
& && &&&CMP AL, 0x7F
& && &&&JZ&&LeaveRing0
& && &&&// 设置IDE设备存在标志
& && &&&MOV btIsIDEExist, 1
& && &&&// 查询IDE设备上的驱动器是否存在(有IDE插槽在主板上,但是却不一定有硬盘插在上面)
& && &&&CALL WaitWhileBusy
& && &&&CALL SelectDevice
& && &&&// 如果是第一次调用,则直接返回,否则执行下行语句时会出现蓝屏
& && &&&CMP&&btIsFirst, 1
& && &&&JZ& &LeaveRing0
& && &&&// 第一次调用时,如果执行这行语句会导致蓝屏,Why???
& && &&&CALL WaitWhileBusy
& && &&&// AL的值等于cBit06时,不存在驱动器,直接返回
& && &&&TEST AL, btBit06
& && &&&JZ& &LeaveRing0
& && &&&// 设置驱动器存在标志
& && &&&MOV&&btIsDiskExist, 1
& && &&&// 发送存取端口命令
& && &&&// 无法像NT/2000/XP那样可以通过查询VERSION的值得到驱动器的类型,
& && &&&// 所以只能一步一步地测试,如果不是ATA设备,再尝试使用ATAPI设备命令
& && &&&CALL WaitWhileBusy
& && &&&CALL SelectDevice& & // 设置主从盘标识
& && &&&MOV&&BL, btAtaCmd& && &// 发送读取命令
& && &&&CALL SendCmd
& && &&&CALL WaitWhileBusy
& && &&&// 检查是否出错
& && &&&MOV&&DX, dwBaseAddress
& && &&&ADD&&DX, 7
& && &&&in& &AL, DX
& && &&&TEST AL, btBit00
& && &&&JZ& &RetrieveInfo& &// 没有错误时则读数据
& && &&&// 如果出错,则进一步尝试使用ATAPI设备命令
& && &&&CALL WaitWhileBusy
& && &&&CALL SelectDevice
& && &&&MOV&&BL, btAtapiCmd
& && &&&CALL SendCmd
& && &&&CALL WaitWhileBusy
& && &&&// 检查是否还出错
& && &&&MOV&&DX, dwBaseAddress
& && &&&ADD&&DX, 7
& && &&&in& &AL, DX
& && &&&TEST AL, btBit00
& && &&&JZ& &RetrieveInfo& &// 没有错误时则读数据
& && &&&JMP&&LeaveRing0& &&&// 如果还是出错,直接返回
& && &&&// 读取数据
& && &&&RetrieveInfo:
& && &&&LEA&&EDI, wOutDataBuf
& && &&&MOV&&ECX, 256
& && &&&MOV&&DX, dwBaseAddress
& && &&&CLD
& && &&&REP&&INSW
& && &&&// 退出Ring0代码
& && &&&LeaveRing0:
& && &&&POPAD
& && &&&IRETD
& && &&&// 激活Ring0代码
& && &&&EnterRing0:
& && &&&// 修改中断门
& && &&&SIDT FWORD PTR btIDTR1
& && &&&MOV EAX, DWORD PTR btIDTR1 + 02h
& && &&&ADD EAX, nHookExceptionNo * 08h + 04h
& && &&&CLI
& && &&&// 保存原异常处理例程入口
& && &&&MOV ECX, DWORD PTR [EAX]
& && &&&MOV CX, WORD PTR [EAX-04h]
& && &&&MOV dwOldExceptionHook, ECX
& && &&&// 指定新入口
& && &&&LEA EBX, Ring0Proc
& && &&&MOV WORD PTR [EAX-04h],BX
& && &&&SHR EBX, 10h
& && &&&MOV WORD PTR[EAX+02h], BX
& && &&&// 激活Ring0代码
& && &&&INT nHookExceptionNo
& && &&&// 复原入口
& && &&&MOV ECX,dwOldExceptionHook
& && &&&MOV WORD PTR[EAX-04h], CX
& && &&&SHR ECX,10h
& && &&&MOV WORD PTR[EAX+02h], CX
& && &&&STI
& & if(!bIsFirst)
& && &&&bIsIDEExist&&= (bool)btIsIDEE
& && &&&bIsDiskExist = (bool)btIsDiskE
& && &&&CopyMemory(pOutData, wOutDataBuf, sizeof(wOutDataBuf));
//---------------------------------------------------------------------------
// 调用方法:
void __fastcall TForm1::Button1Click(TObject *Sender)
& & ReadPhysicalDrive(Memo1-&Lines, Memo2-&Lines);
[ 本帖最后由 股票01 于
21:51 编辑 ]股票论坛
积分10451&理想币5092 个&彩币0 个&共享币2225 个&注册时间&
理想高二级同学
一些硬盘序列号查看软件
[ 本帖最后由 股票01 于
21:32 编辑 ]
(19.37 KB)
21:32, 下载次数: 116
21:32, 下载次数: 89
21:32, 下载次数: 91
积分10451&理想币5092 个&彩币0 个&共享币2225 个&注册时间&
理想高二级同学
获取硬盘物理序列号的控件
[ 本帖最后由 股票01 于
21:34 编辑 ]
(43.97 KB)
21:34, 下载次数: 90
积分10451&理想币5092 个&彩币0 个&共享币2225 个&注册时间&
理想高二级同学
硬盘物理ID(序列号)拦截修改工具
拦截目标程序读取硬盘物理序列号或硬盘物理ID的小程序。。。
并可以返回一个你设定的硬盘ID给目标程序.从而欺骗目标程序
实现系统级拦截应用程序取硬盘物理序列号详细过程
以前想模拟某个程序取硬盘系列号,就将一个DLL注入进去,拦截DeviceIoControl的返回值,将其修改为目标硬盘的值。
后来看到REGMON 从SSDT着手拦截注册表操作,可以看到任何程序的读写操作,就仿着改了一下程序。经测试可以欺骗相当
一部分程序读硬盘序列号,包括ASPROTECT及用其加密算法的子孙:)。
我的思路是这样的:
1、首先用程序取自己的真正的硬盘序列号,假设为XXXX
2、拦截系统的ZwDeviceIoControlFile,并判断入口参数中的IoControlCode ,只有某几个特定的值用来取序列号的,
目前在所有的程序中取硬盘序列号的,我只发现两个值,一个是0x7c088,另外一个是什么忘了。
如果IoControlCode为上面的值,读取系统原有的ZwDeviceIoControlFile返回BUFFER,并用串匹配方法查找这个返回值中存在
不存在XXXX,如果存在,替换为你要欺骗的值.
代码很简单:
UCHAR __DiskSerial[DISK_SERIAL_BUFF_LENGTH]={0};
UCHAR __ChangeTo [DISK_SERIAL_BUFF_LENGTH]={0};
//一个简单的低率串匹配算法 ,判断一个串S1是不是另外一个串S2的子串
PUCHAR IsSBUString(PUCHAR String, PUCHAR SBUString ,ULONG StringLength ,ULONG SBUStringLength)
ULONG i,j;
for(i=0;i&StringLength - SBUStringLength +1 ;i++){
for(j=0;j&SBUStringLj++){
if(String[i+j]!=SBUString[j])
if(j==SBUStringLength) //match a sBUString
return String+i;
return NULL;
//----------------------------------------------------------------------
// Our own routine for ZwDeviceIocontrolFile
// We change the hard disk serial number value requested by user
//----------------------------------------------------------------------
NTSTATUS HookZwDeviceIoControlFile(
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
rc = RealZwDeviceIoControlFile (
FileHandle,
ApcRoutine,
ApcContext,
IoStatusBlock,
IoControlCode,
InputBuffer,
InputBufferLength,
OutputBuffer,
OutputBufferLength
//判断IoControlcode是不是取序列号的值
if((0x7c088 ==IoControlCode) && OutputBufferLength &DISK_SERIAL_BUFF_LENGTH){
//判断返回值中是否包含当前的硬盘序列号,是的话用假的替换
PUCHAR Locate = IsSBUString(OutputBuffer,__DiskSerial,OutputBufferLength,DISK_SERIAL_BUFF_LENGTH);
if(Locate){
for(i=0;i&20;i++){
Locate= __ChangeTo;
return(rc);
目前,驱动只处理了简单的几个应用层的消息,包括停止欺骗,开始欺骗,设置新的欺骗值。
BOOLEAN HDHookDeviceControl( IN PFILE_OBJECT FileObject, IN BOOLEAN Wait,
IN PVOID InputBuffer, IN ULONG InputBufferLength,
OUT PVOID OutputBuffer, IN ULONG OutputBufferLength,
IN ULONG IoControlCode, OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject ) {
BOOLEAN retval = FALSE;
// Its a message from our GUI!
IoStatus-&Status = STATUS_SUCCESS; // Assume success
IoStatus-&Information = 0; // Assume nothing returned
switch ( IoControlCode ) {
// 开始欺骗
case HDHOOK_HOOK:
HookStart();
// 停止欺骗
case HDHOOK_UNHOOK:
HookStop();
// 告诉驱动当前自己硬盘的序列号值为多少
case HDHOOK_SETSELFVALUE:
if( InputBufferLength & DISK_SERIAL_BUFF_LENGTH || InputBuffer == NULL){
IoStatus-&Status = STATUS_INVALID_PARAMETER;
for(i=0; i& DISK_SERIAL_BUFF_LENGTH ;i++)
__DiskSerial = ((UCHAR *)InputBuffer);
// 设置新的欺骗的硬盘序列号
case HDHOOK_SETEMULABLEVALUE:
if( InputBufferLength & DISK_SERIAL_BUFF_LENGTH || InputBuffer == NULL){
IoStatus-&Status = STATUS_INVALID_PARAMETER;
for(i=0;i& DISK_SERIAL_BUFF_LENGTH ;i++)
__ChangeTo = ((UCHAR *)InputBuffer);
//返回驱动的版本号
case HDHOOK_VERSION:
if ( OutputBufferLength & sizeof(ULONG) ||
OutputBuffer == NULL ) {
IoStatus-&Status = STATUS_INVALID_PARAMETER;
*(ULONG *)OutputBuffer = REGMONVERSION;
IoStatus-&Information = sizeof(ULONG);
IoStatus-&Status = STATUS_INVALID_DEVICE_REQUEST;
return TRUE;
////////////////////////////////////////////////
应用层程序可以通过如下简单代码与驱动进行通信:
#define HDHOOK_HOOK (ULONG) CTL_CODE( FILE_DEVICE_REGMON, 0x00, METHOD_BUFFERED, FILE_ANY_ACCESS )
#define HDHOOK_UNHOOK (ULONG) CTL_CODE( FILE_DEVICE_REGMON, 0x01, METHOD_BUFFERED, FILE_ANY_ACCESS )
#define HDHOOK_VERSION (ULONG) CTL_CODE( FILE_DEVICE_REGMON, 0x02, METHOD_BUFFERED, FILE_ANY_ACCESS )
#define HDHOOK_SETSELFVALUE (ULONG) CTL_CODE( FILE_DEVICE_REGMON, 0x03, METHOD_BUFFERED, FILE_ANY_ACCESS )
#define HDHOOK_SETEMULABLEVALUE (ULONG) CTL_CODE( FILE_DEVICE_REGMON, 0x04, METHOD_BUFFERED, FILE_ANY_ACCESS )
#define DISK_SERIAL_BUFF_LENGTH 20
//设置新的序列号模拟值
DeviceIoControl(__SysHandle,HDHOOK_SETEMULABLEVALUE,szEmulSerial,DISK_SERIAL_BUFF_LENGTH, NULL, 0, &dwDummy, NULL) ;
//告诉驱动自己的硬盘序列号
DeviceIoControl(__SysHandle,HDHOOK_SETSELFVALUE,szBuffer,DISK_SERIAL_BUFF_LENGTH, NULL, 0, &dwDummy, NULL) ;
//开始拦截
DeviceIoControl(__SysHandle,HDHOOK_HOOK,NULL,0,NULL,0,&dwDummy,NULL) ;
//停止拦截
DeviceIoControl(__SysHandle,HDHOOK_UNHOOK,NULL,0,NULL,0,&dwDummy,NULL) ;
其中__SysHandle是安装驱动的句柄
这些小软件有很多,大家可以百度
下面提供一个驱动级模拟硬盘物理序列号的软件:
直接运行diskhook.exe,将会加载一个hdhook.sys驱动,右击任务栏右下角的绿色图标setting
弹出当前硬盘号,下面的框中输入你要模拟的硬盘号,(友情提示:你可以在注册过MZD/PXD的服务器上运行本程序,得到一个注册过的硬盘号字符串),再点Apply,
再右击任务栏右下角的绿色图标---Hook On就一切OK了,
一切设置好之后,可以不用再去运行diskhook.exe了。
[ 本帖最后由 股票01 于
21:58 编辑 ]
(43.97 KB)
21:29, 下载次数: 195
(35.75 KB)
21:40, 下载次数: 350
积分10451&理想币5092 个&彩币0 个&共享币2225 个&注册时间&
理想硕士级同学(菠菜一段)
谢谢,老师辛苦!!!
积分100668&理想币64024 个&彩币24 个&共享币70 个&注册时间&
理想高二级同学
路过。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
积分11924&理想币2784 个&彩币0 个&共享币0 个&注册时间&
理想高二级同学
硬盘物理序列号修改软件PC3000
PC-3000是-- ACE Laboratory研究开发的商用的专业修复硬盘综合工具。它是从硬盘的内部软件来管理硬盘,进行硬盘的原始资料的改变和修复。可进行的操作:
1 伺服扫描 2 物理扫描 3 lba地址扫描
4 屏蔽成工厂坏道(p-list) 5 屏蔽磁头
6 屏蔽磁道 7 屏蔽坏扇区 8 改bios的字(参数)
9 改lba的大小 10 改sn号
11 查看或者修改负头的信息
二、PC3000主要用途
软硬件综合工具“PC-3000&主要用来专业修复各种型号的IDE硬盘,容量从20MB至200GB,支持的硬盘
生产厂家有: Seagate(希捷), Western Digital(西部数据), Fujitsu(富士通), Quantum(昆腾), Samsung(三星), Maxtor(迈拓), Conner, IBM, HP, Kalok, Teac, Daeyoung,and Xebec等。
使用РС-3000有可能修复 50-80% 的缺陷硬盘。 如此高的修复率是通过使用特别的硬盘工作模式来达到的(比如工厂模式),在特别的工作模式下可以对硬盘进行如下操作:
内部低级格式化;
重写硬盘内部微码模块(firmware);
改写硬盘参数标识;
检查缺陷扇区或缺陷磁道,并用重置、替换或跳过忽略缺陷的等方式修复;
重新调整内部参数;
逻辑切断(即禁止使用)缺陷的磁头;
S.M.A.R.T参数复位....
其中,重写内部微码(Firmware)模块对在一些情况下对数据恢复有特别的功效, 如: Maxtor美钻、金钻、星钻系列硬盘加电后不能被正确识别(无磁头杂音);Fujitsu MPG及MPF系列硬盘加电后磁头寻道基本正常,但不能被正确检测到;IBM腾龙系列有磁头寻道声(无杂音),但不能被正确识别;
Quantum硬盘能被检测到,但无法读写;WD EB及BB系列硬盘能被检测到,但无法读写......以上所列的这些故障,一般不属于硬件故障。通过PC-3000的操作,可以解决大部分类似故障,而且大部分数据还完好无损.
三、PC3000工作基本原理
破解各种型号的硬盘专用CPU的指令集,解读各种硬盘的Firmware(固件),从而控制硬盘的内部工作,实现硬盘内部参数模块读写和硬盘程序模块的调用,最终达到以软件修复多种硬盘缺陷的目的。
最专业功能的有:重写硬盘Firmware模块;按工厂方式扫描硬盘内部缺陷并记录在硬盘内部相应参数模块;按工厂方式进行内部低级格式化;更改硬盘参数等.
ACE Laboratory经过十多年的不断研究,PC-3000 V12(最新版本)已经能够支持大部分新旧型号的IDE接口硬盘,容量从40MB至200GB
具体软件自己百度
[ 本帖最后由 股票01 于
21:53 编辑 ]
积分10451&理想币5092 个&彩币0 个&共享币2225 个&注册时间&
理想高二级同学
看看。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
积分11924&理想币2784 个&彩币0 个&共享币0 个&注册时间&
理想高二级同学
还要做广告。。。。。。。。。。。。。。。。。。。。。。。。
积分11924&理想币2784 个&彩币0 个&共享币0 个&注册时间&
理想高二级同学
用HDTunePro就可看到。。。。。。。。。。。。。。。。。
积分11924&理想币2784 个&彩币0 个&共享币0 个&注册时间&
理想高二级同学
看看。。。模拟硬盘物理序列号。。。
积分11924&理想币2784 个&彩币0 个&共享币0 个&注册时间&
理想高三级同学
顶一下,!!!!!!
积分27885&理想币5674 个&彩币0 个&共享币13892 个&注册时间&
理想高三级同学
不错,不错........
积分29764&理想币15197 个&彩币0 个&共享币1791 个&注册时间&
理想高二级同学(菠菜一段)
感谢楼主提供分享!
积分15280&理想币3979 个&彩币888 个&共享币460 个&注册时间&
用户被禁止访问
关于硬盘物理序列号和模拟硬盘物理序列号
积分6063&理想币1753 个&彩币0 个&共享币0 个&注册时间&
理想高二级同学
路过。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
积分17032&理想币7008 个&彩币0 个&共享币6 个&注册时间&
理想初一级同学
风险系数很大,为了一软件报废了硬盘就划不来
积分3925&理想币199 个&彩币0 个&共享币0 个&注册时间&
理想初一级同学
谢谢分享,已经有很多同学发过了,请不要再发了!!
积分3417&理想币522 个&彩币0 个&共享币746 个&注册时间&
理想高三级同学
楼主辛苦了。。。。。。。。
积分21851&理想币11717 个&彩币0 个&共享币0 个&注册时间&
理想初一级同学
感谢楼主提供分享!
积分2021&理想币135 个&彩币0 个&共享币0 个&注册时间&
快速回复主题
禁用 URL 识别
使用个人签名
接收新回复邮件通知
发帖请务遵守本站的相关规则,所有发表(包括转发)政治、色情非法信息者本站将实时提供发贴者个人信息给公安局,追究责任,特此申明!
具体规则请参见《》
您需要登录后才可以发帖
发表帖子[完成后可按 Ctrl+Enter 发布]
理想论坛上的网友发表的帖子纯属个人意见,理想论坛不负任何责任!广告赞助商内容与本站无关!
工业和信息化部信息备案:
公安局网警备案:
理想论坛值班电话[8:30~17:00]: &#6 5518-1  &#6 5518-2(广告)
无安全提问
母亲的名字
爷爷的名字
父亲出生的城市
您其中一位老师的名字
您个人计算机的型号
您最喜欢的餐馆名称
驾驶执照的最后四位数字}

我要回帖

更多关于 苹果序列号查询 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信