如何截获“获取硬盘物理序列号”的API

xycomplx 2010-01-28 08:39:59
想截获WindowsXP的“获取硬盘物理序列号”的API,使该API返回的“硬盘物理序列号的值”为本人指定的值。
不知有没有可能实现?
肯请各位帮助!谢了!!!
...全文
1781 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
金卯刀 2011-06-15
  • 打赏
  • 举报
回复
在硬盘加密或者装有还原卡的状况下,createfile访问磁盘(\\.\PhysicalDrive0)会失败。
更稳妥的办法是,直接申请IO端口操作,直接读取硬盘数据。

从这样的状况看,截获API是徒劳的....
tongtianxiao 2011-06-15
  • 打赏
  • 举报
回复
学习学习
lyke001 2011-06-14
  • 打赏
  • 举报
回复
运行正常,没有蓝屏,如果出现蓝屏,说明你要换系统了。
yuhen659 2011-04-23
  • 打赏
  • 举报
回复
13楼的程序在XP下有兼容性问题,运行蓝屏!!!
liups 2010-02-16
  • 打赏
  • 举报
回复
试了13楼的程序,确实可以能设置获取到的硬盘物理序列号,谢谢
池龙 2010-02-16
  • 打赏
  • 举报
回复
引用 13 楼 minkid 的回复:
这100分给我了~,以下的程序100符合你的要求。(含源代码)
http://blogimg.chinaunix.net/blog/upfile2/090518234832.rar

通过HOOK  DeviceIoControl函数,来任意修改获取硬盘物理序列号!
下载后打开:GUI\Debug目录,运行GUI.exe
然后在托盘按setting,设置新的硬盘物理序列号,再读到的的硬盘物理序列号,就是你刚刚设置的了。


看清楚问题。真囧。
min3333333 2010-02-15
  • 打赏
  • 举报
回复
这100分给我了~,以下的程序100符合你的要求。(含源代码)
http://blogimg.chinaunix.net/blog/upfile2/090518234832.rar

通过HOOK DeviceIoControl函数,来任意修改获取硬盘物理序列号!
下载后打开:GUI\Debug目录,运行GUI.exe
然后在托盘按setting,设置新的硬盘物理序列号,再读到的的硬盘物理序列号,就是你刚刚设置的了。
JiangShangYouZhe 2010-02-14
  • 打赏
  • 举报
回复
读取硬件ID
如硬盘ID

function GetIdeSerialNumber: pchar;
const IDENTIFY_BUFFER_SIZE = 512;
type
TIDERegs = packed record
bFeaturesReg: BYTE; // Used for specifying SMART "commands".
bSectorCountReg: BYTE; // IDE sector count register
bSectorNumberReg: BYTE; // IDE sector number register
bCylLowReg: BYTE; // IDE low order cylinder value
bCylHighReg: BYTE; // IDE high order cylinder value
bDriveHeadReg: BYTE; // IDE drive/head register
bCommandReg: BYTE; // Actual IDE command.
bReserved: BYTE; // reserved for future use. Must be zero.
end;
TSendCmdInParams = packed record
// Buffer size in bytes
cBufferSize: DWORD;
// Structure with drive register values.
irDriveRegs: TIDERegs;
// Physical drive number to send command to (0,1,2,3).
bDriveNumber: BYTE;
bReserved: array[0..2] of Byte;
dwReserved: array[0..3] of DWORD;
bBuffer: array[0..0] of Byte; // Input buffer.
end;
TIdSector = packed record
wGenConfig: Word;
wNumCyls: Word;
wReserved: Word;
wNumHeads: Word;
wBytesPerTrack: Word;
wBytesPerSector: Word;
wSectorsPerTrack: Word;
wVendorUnique: array[0..2] of Word;
sSerialNumber: array[0..19] of CHAR;
wBufferType: Word;
wBufferSize: Word;
wECCSize: Word;
sFirmwareRev: array[0..7] of Char;
sModelNumber: array[0..39] of Char;
wMoreVendorUnique: Word;
wDoubleWordIO: Word;
wCapabilities: Word;
wReserved1: Word;
wPIOTiming: Word;
wDMATiming: Word;
wBS: Word;
wNumCurrentCyls: Word;
wNumCurrentHeads: Word;
wNumCurrentSectorsPerTrack: Word;
ulCurrentSectorCapacity: DWORD;
wMultSectorStuff: Word;
ulTotalAddressableSectors: DWORD;
wSingleWordDMA: Word;
wMultiWordDMA: Word;
bReserved: array[0..127] of BYTE;
end;
PIdSector = ^TIdSector;
TDriverStatus = packed record
// 驱动器返回的错误代码,无错则返回0
bDriverError: Byte;
// IDE出错寄存器的内容,只有当bDriverError 为 SMART_IDE_ERROR 时有效
bIDEStatus: Byte;
bReserved: array[0..1] of Byte;
dwReserved: array[0..1] of DWORD;
end;
TSendCmdOutParams = packed record
// bBuffer的大小
cBufferSize: DWORD;
// 驱动器状态
DriverStatus: TDriverStatus;
// 用于保存从驱动器读出的数据的缓冲区,实际长度由cBufferSize决定
bBuffer: array[0..0] of BYTE;
end;
var
hDevice: Thandle;
cbBytesReturned: DWORD;
SCIP: TSendCmdInParams;
aIdOutCmd: array[0..(SizeOf(TSendCmdOutParams) + IDENTIFY_BUFFER_SIZE - 1) - 1] of Byte;
IdOutCmd: TSendCmdOutParams absolute aIdOutCmd;
procedure ChangeByteOrder(var Data; Size: Integer);
var
ptr: Pchar;
i: Integer;
c: Char;
begin
ptr := @Data;
for I := 0 to (Size shr 1) - 1 do begin
c := ptr^;
ptr^ := (ptr + 1)^;
(ptr + 1)^ := c;
Inc(ptr, 2);
end;
end;
begin
Result := ''; // 如果出错则返回空串
if SysUtils.Win32Platform = VER_PLATFORM_WIN32_NT then begin // Windows NT, Windows 2000
// 提示! 改变名称可适用于其它驱动器,如第二个驱动器: '\\.\PhysicalDrive1\'
hDevice := CreateFile('\\.\PhysicalDrive0', GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
end else // Version Windows 95 OSR2, Windows 98
hDevice := CreateFile('\\.\SMARTVSD', 0, 0, nil, CREATE_NEW, 0, 0);
if hDevice = INVALID_HANDLE_VALUE then Exit;
try
FillChar(SCIP, SizeOf(TSendCmdInParams) - 1, #0);
FillChar(aIdOutCmd, SizeOf(aIdOutCmd), #0);
cbBytesReturned := 0;
// Set up data structures for IDENTIFY command.
with SCIP do begin
cBufferSize := IDENTIFY_BUFFER_SIZE;
// bDriveNumber := 0;
with irDriveRegs do begin
bSectorCountReg := 1;
bSectorNumberReg := 1;
// if Win32Platform=VER_PLATFORM_WIN32_NT then bDriveHeadReg := $A0
// else bDriveHeadReg := $A0 or ((bDriveNum and 1) shl 4);
bDriveHeadReg := $A0;
bCommandReg := $EC;
end;
end;
if not DeviceIoControl(hDevice, $0007C088, @SCIP, SizeOf(TSendCmdInParams) - 1,
@aIdOutCmd, SizeOf(aIdOutCmd), cbBytesReturned, nil) then Exit;
finally
CloseHandle(hDevice);
end;
with PIdSector(@IdOutCmd.bBuffer)^ do begin
ChangeByteOrder(sSerialNumber, SizeOf(sSerialNumber));
(Pchar(@sSerialNumber) + SizeOf(sSerialNumber))^ := #0;
Result := Pchar(@sSerialNumber);
end;
end;
IDWB 2010-02-11
  • 打赏
  • 举报
回复
好像没有一个api可以独立获取硬盘序列号
JiangShangYouZhe 2010-02-11
  • 打赏
  • 举报
回复
只有获取硬盘物理序列号
acridin 2010-01-29
  • 打赏
  • 举报
回复
up
xycomplx 2010-01-29
  • 打赏
  • 举报
回复
谢谢各位了,受益匪浅!
gyk120 2010-01-28
  • 打赏
  • 举报
回复
那你只有HOOK一些关键函数,但是很容易引起误判
xycomplx 2010-01-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 heikeyanxi 的回复:]
系统中没有哪个API可以直接取到硬盘序列号的,那些取序列号的函数都是程序员自己定义的,而且这些函数是用多个API组合的,比如CreateFile、DeviceIoControl等,所以你的想法是没法实现的
[/Quote]

这样啊!那请问有没有别的方法可以实现啊?
heikeyanxi 2010-01-28
  • 打赏
  • 举报
回复
系统中没有哪个API可以直接取到硬盘序列号的,那些取序列号的函数都是程序员自己定义的,而且这些函数是用多个API组合的,比如CreateFile、DeviceIoControl等,所以你的想法是没法实现的
xycomplx 2010-01-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 huangheguyun 的回复:]
自定义函数
[/Quote]

可否详细说明?最好能举个例子!!谢谢!!!
huangheguyun 2010-01-28
  • 打赏
  • 举报
回复
自定义函数
SQLDebug_Fan 2010-01-28
  • 打赏
  • 举报
回复
获取硬盘ID多是程序员自己写的代码,不好截获。
xycomplx 2010-01-28
  • 打赏
  • 举报
回复
这样子啊,那可能没有办法了,唉!

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧