求放在按键精灵里可以直接用的 获取硬盘物理序列号修改的方法 看清楚 是物理序列号 唯一的 请发到我邮箱

常用软件推荐
原创软件推荐
硬盘物理序列号修改专家用于专业修改电脑硬盘物理序列号的理想工具硬盘物理序列号是硬盘的出厂序列号,它是全球唯一的,不会随着系统的安装、硬盘的格式化等操作而改变。硬盘物理序列号修改专家不是市面上那些简单修改硬盘驱动器的序列号的东西,而是修改硬盘厂商在烧制时刻录在硬盘盒上的,即(硬盘物理序列号),大约20位字母数字的组合硬盘物理序列号修改专家软件功能:1、可以解决部分软件封用户电脑,导致这台电脑无法正常使用软件。2、部分软件每台可以免费试用一段时间,使用硬盘物理序列号修改专家修改后可以无限的试用。3、部分游戏判断硬件信息防止多开或者其他原因,可以减少封号的情况。4、本工具最显著地特点是可以用户自己定义想修改的序列号。5、对于网赚CPA项目更是不可多得的好东西哦。6、提供免费高匿名IP代理。硬盘物理序列号修改专家 v4.1更新:增强系统兼容性。
只要是硬件设备,都是有寿命的。并不是说硬盘有了坏道之后就会报废,其实处理方法得当,硬盘检测修复工具就可以恢复使用。小编为大家介绍几款硬盘坏道检测、修复、屏蔽软件。非凡推荐:、
硬盘物理序列号修改专家用于专业修改电脑硬盘物理...
AS SSD Benchmark为一款SSD固态硬盘传输速度测速...
v4.8.0 官方专业版
PartitionGuru是一款磁盘管理及数据恢复软件。支...
希捷硬盘维护工具Seagate SeaTools是一款省时、省...
硬盘物理序列号修改专家能做什么?硬盘物理序列号修改专家用于专业修改电脑硬盘物理序列号的理想工具硬盘物理序列号是硬盘的出厂序列号,不会随着系统的安装、硬盘的格式化等操作而改变。
怎么更改硬盘物理序列号?下载一个硬盘序列号修改工具按照操作步骤修改就可以了。
适合机型:三星N9005,三星N9005刷机包
Android版本:6.0.1
ROM大小:1280.00 MB
本站提供的软件会测试再上传,但无法保证所有软件都没有问题,如果您发现链接错误或其它问题,请在评论里告诉我们!
下载点支持点击下载(IE图标)或(迅雷图标),若直接点击下载速度太慢,请尝试点击其他的下载点,若文件太大请尝试使用迅雷下载。为确保下载的文件能正常使用,请使用最新版本解压本站软件。
建议大家谨慎对待所下载的文件,大家在安装的时候务必留意每一步!关于或的有关提示,请自行注意选择操作。
本站所有资源均是软件作者、开发商投稿、网上搜集,任何涉及商业盈利目的均不得使用,否则产生的一切后果将由您自己承担!将不对任何资源负法律责任。所有资源请在下载后24小时内删除。
网友评论评论内容摘要(共 1 条,) 得分 77 分
很好!瞬间修改!你的位置:
大漠获取硬盘号问题,求达人赐教
11:05:47 |
来源: 按键精灵资源站
函数简介:获取本机的硬盘序列号.支持ide scsi硬盘. 要求调用进程必须有管理员权限. 否则返回空串.
string GetDiskSerial()
字符串表达的硬盘序列号
sirial = dm.GetDiskSerial()
脚本里这个sirial = dm.GetDiskSerial()函数得到的硬盘号一直都是空的,我的是WIN7系统32位的。大漠已注册,而且用的是绝对路径。UAC也关了。。。(要求调用进程必须有管理员权限. 否则返回空串.)这句写的很清楚,但我不知道进程管理员权限要怎么才能有这权限。哦,对了,是生成小精灵后成这样的。右键点属性,以管理员运行无果,改管理员权限也不得。特来求助达人,望达人不吝赐教呀。关于硬盘物理序列号和模拟硬盘物理序列号
理想高二级同学
还需要 9046 积分才能升级
关于硬盘物理序列号和模拟硬盘物理序列号
浏览:68963
欢迎光临理想论坛,由于您没有登录,所以无法查看到论坛的附件及隐藏分区,也无法与其他会员交流。
还没有理想论坛的帐号?
什么是硬盘物理序列号:
每个硬盘都有一个唯一的编号,以此来区分每个硬盘,就和指纹一样,你可以用程序得到,一般用来加密或验证用的
目前很多注册软件都是以硬盘的物理序列号来生成注册码,所以有了下面的这些工具你就可以大施拳脚了。
要判断哪些软件是这种软件,找一台注册过的机器,把硬盘移到同样配置的机器上,看该软件还能不能运行就知道了。
下面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 编辑 ]股票论坛
积分10954&理想币4789 个&彩币0 个&共享币3900 个&注册时间&
理想高二级同学
还需要 9046 积分才能升级
一些硬盘序列号查看软件
[ 本帖最后由 股票01 于
21:32 编辑 ]
(19.37 KB)
21:32, 下载次数: 128
21:32, 下载次数: 95
21:32, 下载次数: 100
积分10954&理想币4789 个&彩币0 个&共享币3900 个&注册时间&
理想高二级同学
还需要 9046 积分才能升级
获取硬盘物理序列号的控件
[ 本帖最后由 股票01 于
21:34 编辑 ]
(43.97 KB)
21:34, 下载次数: 96
积分10954&理想币4789 个&彩币0 个&共享币3900 个&注册时间&
理想高二级同学
还需要 9046 积分才能升级
硬盘物理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, 下载次数: 221
(35.75 KB)
21:40, 下载次数: 421
积分10954&理想币4789 个&彩币0 个&共享币3900 个&注册时间&
理想硕士级同学(菠菜一段)
还需要 99326 积分才能升级
谢谢,老师辛苦!!!
积分100674&理想币64022 个&彩币24 个&共享币165 个&注册时间&
理想高二级同学
还需要 7844 积分才能升级
路过。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
积分12156&理想币2777 个&彩币0 个&共享币100 个&注册时间&
理想高二级同学
还需要 9046 积分才能升级
硬盘物理序列号修改软件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 编辑 ]
积分10954&理想币4789 个&彩币0 个&共享币3900 个&注册时间&
理想高二级同学
还需要 7844 积分才能升级
看看。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
积分12156&理想币2777 个&彩币0 个&共享币100 个&注册时间&
理想高二级同学
还需要 7844 积分才能升级
还要做广告。。。。。。。。。。。。。。。。。。。。。。。。
积分12156&理想币2777 个&彩币0 个&共享币100 个&注册时间&
理想高二级同学
还需要 7844 积分才能升级
用HDTunePro就可看到。。。。。。。。。。。。。。。。。
积分12156&理想币2777 个&彩币0 个&共享币100 个&注册时间&
理想高二级同学
还需要 7844 积分才能升级
看看。。。模拟硬盘物理序列号。。。
积分12156&理想币2777 个&彩币0 个&共享币100 个&注册时间&
理想大一级同学
还需要 9653 积分才能升级
顶一下,!!!!!!
积分30347&理想币5685 个&彩币0 个&共享币19037 个&注册时间&
理想高三级同学
还需要 181 积分才能升级
不错,不错........
积分29819&理想币15190 个&彩币0 个&共享币1885 个&注册时间&
理想高二级同学(菠菜一段)
还需要 4237 积分才能升级
感谢楼主提供分享!
积分15763&理想币4043 个&彩币888 个&共享币492 个&注册时间&
用户被禁止访问
提示: 作者被禁止或删除 内容自动屏蔽
积分6063&理想币1753 个&彩币0 个&共享币100 个&注册时间&
理想高二级同学
还需要 2953 积分才能升级
路过。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
积分17047&理想币6979 个&彩币0 个&共享币106 个&注册时间&
理想初三级同学
还需要 1348 积分才能升级
风险系数很大,为了一软件报废了硬盘就划不来
积分6652&理想币21 个&彩币0 个&共享币2727 个&注册时间&
理想初二级同学
还需要 1064 积分才能升级
谢谢分享,已经有很多同学发过了,请不要再发了!!
积分4936&理想币714 个&彩币0 个&共享币1721 个&注册时间&
理想高三级同学
还需要 8147 积分才能升级
楼主辛苦了。。。。。。。。
积分21853&理想币11719 个&彩币0 个&共享币100 个&注册时间&
理想初一级同学
还需要 1977 积分才能升级
感谢楼主提供分享!
积分2023&理想币137 个&彩币0 个&共享币100 个&注册时间&
快速回复主题
禁用 URL 识别
使用个人签名
接收新回复邮件通知
发帖请务遵守本站的相关规则,所有发表(包括转发)政治、色情非法信息者本站将实时提供发贴者个人信息给公安局,追究责任,特此申明!
具体规则请参见《》
您需要登录后才可以发帖
发表帖子[完成后可按 Ctrl+Enter 发布]
理想论坛上的网友发表的帖子纯属个人意见,理想论坛不负任何责任!广告赞助商内容与本站无关!
理想论坛值班电话[9:30~18:30]: &#6 5518-1  &#6 5518-2(广告)
工业和信息化部信息备案:

我要回帖

更多关于 硬盘物理序列号修改 的文章

 

随机推荐