Сейчас на форуме: Rio, tyns777, zombi-vadim (+7 невидимых)

 eXeL@B —› Программирование —› Серийник винта
Посл.ответ Сообщение

Ранг: 33.8 (посетитель), 38thx
Активность: 0.060
Статус: Участник

Создано: 05 января 2015 08:07
· Личное сообщение · #1

Доброго времени и с новым 2015 !

Второй день сижу с прогой - вот такая оказия:
Программа получает серийный номер винта и если неудача - берет дату биоса.
И вот с этим затык - требуется получить вот такую строчку - выделена красным:
http://rghost.ru/60144630

Программа юзает createfile и DeviceIoControl.
Пишу на Делфи - перебрал кучу примеров, ничего не сработало. Вроде чего-то есть на c++ но я в них не волоку.
Буду рад любой помощи.



Ранг: 262.5 (наставник), 337thx
Активность: 0.340.25
Статус: Участник

Создано: 05 января 2015 08:31
· Личное сообщение · #2

WMI



Ранг: 33.8 (посетитель), 38thx
Активность: 0.060
Статус: Участник

Создано: 05 января 2015 08:53 · Поправил: dimka_new
· Личное сообщение · #3

Пора отдыхать походу... Вот нашелся примерчик консольный - http://rghost.ru/60144795

Ну и почитать - http://derevyanko.blogspot.ru/2009/02/hardware-id-diskid32-delphi.html



Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 05 января 2015 09:37
· Личное сообщение · #4

dimka_new пишет:
Программа юзает createfile и DeviceIoControl.

есть обходной вариант, более доступный для понимания:
Code:
  1. if (::GetDriveType(&disk[0]) == DRIVE_FIXED)
  2.                         {
  3. ::GetVolumeInformation(&disk[0],NameBuffer, sizeof(NameBuffer),&VSNumber,&MCLength,&FileSF,SysNameBuffer,sizeof(SysNameBuffer));
  4.                               break;
  5.                         }





Ранг: 568.2 (!), 465thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 05 января 2015 10:58
· Личное сообщение · #5

Code:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, StdCtrls;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     Edit1: TEdit;
  12.     Edit2: TEdit;
  13.     Button1: TButton;
  14.     Label1: TLabel;
  15.     Label2: TLabel;
  16.     Edit3: TEdit;
  17.     Label3: TLabel;
  18.     procedure Button1Click(Sender: TObject);
  19.   private
  20.     { Private declarations }
  21.   public
  22.     { Public declarations }
  23.   end;
  24.  
  25. var
  26.   Form1: TForm1;
  27.   bufDriveName,bufFSNAme:array[0..255] of pchar;
  28.   SN,maxFileName,fsOptions:cardinal;
  29.  
  30. implementation
  31.  
  32. {$*.dfm}
  33.  
  34. procedure TForm1.Button1Click(Sender: TObject);
  35. begin
  36. GetVolumeInformation(nil,PAnsiChar(@bufDriveName),$100,Addr(SN),maxFileName,fsOptions,PAnsiChar(@bufFSNAme),$100);
  37. Edit1.Text:=IntToHex(SN,4);
  38. Edit2.Text:=PansiChar(@bufFSNAme);
  39. Edit3.Text:=PansiChar(@bufDriveName);
  40. end;
  41.  
  42. end.
  43.  


-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.





Ранг: 253.5 (наставник), 684thx
Активность: 0.260.25
Статус: Участник
radical

Создано: 05 января 2015 13:51
· Личное сообщение · #6

Эм каким образом серийник винта похож на ID тома ???

dimka_new
Code:
  1. const
  2. SMART_GET_VERSION = $074080;
  3. SMART_SEND_DRIVE_COMMAND = $07C084;
  4. SMART_RCV_DRIVE_DATA = $07C088;
  5.  
  6. // Values of ds_bDriverError
  7. DRVERR_NO_ERROR = 0;
  8. DRVERR_IDE_ERROR = 1;
  9. DRVERR_INVALID_FLAG = 2;
  10. DRVERR_INVALID_COMMAND = 3;
  11. DRVERR_INVALID_BUFFER = 4;
  12. DRVERR_INVALID_DRIVE = 5;
  13. DRVERR_INVALID_IOCTL = 6;
  14. DRVERR_ERROR_NO_MEM = 7;
  15. DRVERR_INVALID_REGISTER = 8;
  16. DRVERR_NOT_SUPPORTED = 9;
  17. DRVERR_NO_IDE_DEVICE = 10;
  18.  
  19. // Values of ir_bCommandReg
  20. ATAPI_ID_CMD = $A1;
  21. ID_CMD = $EC;
  22. SMART_CMD = $B0;
  23.  
  24. type
  25. TIdeRegs = packed record
  26. bFeaturesReg,
  27. bSectorCountReg,
  28. bSectorNumberReg,
  29. bCylLowReg,
  30. bCylHighReg,
  31. bDriveHeadReg,
  32. bCommandReg,
  33. bReserved: Byte;
  34. end;
  35.  
  36. TDriverStatus = packed record
  37. bDriverError: Byte;
  38. bIDEError: Byte;
  39. bReserved: array[1..2] of Byte;
  40. dwReserved: array[1..2] of DWORD;
  41. end;
  42.  
  43. TSendCmdInParams = packed record
  44. dwBufferSize: DWORD;
  45. irDriveRegs: TIdeRegs;
  46. bDriveNumber: Byte;
  47. bReserved: array[1..3] of Byte;
  48. dwReserved: array[1..4] of DWORD;
  49. bBuffer: Byte;
  50. end;
  51.  
  52. TSendCmdOutParams = packed record
  53. dwBufferSize: DWORD;
  54. dsDriverStatus: TDriverStatus;
  55. bBuffer: array[1..512] of Byte;
  56. end;
  57.  
  58. TGetVersionInParams = packed record
  59. bVersion,
  60. bRevision,
  61. bReserved,
  62. bIDEDeviceMap: Byte;
  63. dwCapabilities: DWORD;
  64. dwReserved: array[1..4] of DWORD;
  65. end;
  66.  
  67.  
  68. procedure CorrectDevInfo(var _params: TSendCmdOutParams);
  69. asm
  70. lea edi, _params.bBuffer
  71.  
  72. add edi,14h
  73. mov ecx,0Ah
  74.  
  75. @@SerNumLoop: mov ax,[edi]
  76. xchg al,ah
  77. stosw
  78. loop @@SerNumLoop
  79.  
  80.  
  81. add edi,6
  82. mov cl,18h
  83.  
  84. @@ModelNumLoop: mov ax,[edi]
  85. xchg al,ah
  86. stosw
  87. loop @@ModelNumLoop
  88. end;
  89.  
  90. function HDD_SN(): string;
  91. var
  92. i: DWORD;
  93. tmp: string;
  94. dev: THandle;
  95. scip: TSendCmdInParams;
  96. scop: TSendCmdOutParams;
  97. gvip: TGetVersionInParams;
  98. ret: DWORD;
  99.  
  100. begin
  101. dev := CreateFile('\.\PhysicalDrive0', GENERIC_READ or GENERIC_WRITE,
  102. FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
  103. if dev <> INVALID_HANDLE_VALUE then begin
  104. if DeviceIoControl(dev, SMART_GET_VERSION, nil, 0, @gvip, SizeOf(gvip),
  105. ret, nil) then begin
  106. scip.dwBufferSize := 512;
  107. scip.bDriveNumber := 0;
  108. scip.irDriveRegs.bSectorCountReg := 1;
  109. scip.irDriveRegs.bSectorNumberReg := 1;
  110. scip.irDriveRegs.bDriveHeadReg := $A0; // ???
  111. scip.irDriveRegs.bCommandReg := ID_CMD; // ???
  112.  
  113. if not DeviceIoControl(dev, SMART_RCV_DRIVE_DATA, @scip, SizeOf(scip),
  114. @scop, SizeOf(scop), ret, nil) then
  115. else
  116. if scop.dsDriverStatus.bDriverError = DRVERR_NO_ERROR then begin
  117. CorrectDevInfo(scop);
  118. SetLength(tmp, 20);
  119. Move(scop.bBuffer[21], tmp[1], 20);
  120. CloseHandle(dev);
  121. end;
  122.  Result:=tmp;
  123. end;
  124. end;
  125. end;
  126.  
  127. procedure Output;
  128. begin
  129. SetWindowTextA(TxtSerialHwnd,PChar(HDD_SN));
  130. end;


-----
ds


| Сообщение посчитали полезным: dimka_new


Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 05 января 2015 15:49
· Личное сообщение · #7

DimitarSerg

через WMI надежнее и на дельфях тоже можно

http://stackoverflow.com/questions/13215713/get-real-hdd-serial-number-with-delphi

-----
[nice coder and reverser]


| Сообщение посчитали полезным: dimka_new

Ранг: 33.8 (посетитель), 38thx
Активность: 0.060
Статус: Участник

Создано: 06 января 2015 13:45
· Личное сообщение · #8

DimitarSerg
Че то пример не заработал - а у вас чего показывает ?

Hellspawn
Вот заюзал ваш пример, на 7-ке показывает правду: http://rghost.ru/60166291
На виртуалке вот такое( - http://rghost.ru/60166283

А вот консолька, под виртуалькой:
http://rghost.ru/60166324
А под семеркой выдает нормальный номер. Похоже придется расковыривать исходник и переделывать под себя.
Вот программеры - генерацию ключа разобрал за полчаса, а как хвид формируется третий день)))

Всех с наступающим Рождеством !



Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 06 января 2015 14:13
· Личное сообщение · #9

Поиск же рулит..
--> Link <--
как и DeviceIoControl на всей линейке NT.

| Сообщение посчитали полезным: dimka_new


Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 06 января 2015 14:19
· Личное сообщение · #10

dimka_new пример не мой - это раз.
это пример работы WMI на дельфях, там можно считывать любые структуры,
если вы не знаете как это и зачем, то нужно почитать.
в примере Win32_PhysicalMedia - SerialNumber там еще есть несколько стукрут
откуда можно считать, например Win32_DiskDrive - SerialNumber.

то что утилита показывает пустой серийник под варей - это её косяк

-----
[nice coder and reverser]





Ранг: 253.5 (наставник), 684thx
Активность: 0.260.25
Статус: Участник
radical

Создано: 06 января 2015 14:29 · Поправил: DimitarSerg
· Личное сообщение · #11

dimka_new
Ничего не показывает... если запускать не от имени админа

А так работает, это я прямо из кода кейгена, который уже не раз юзал.

win7x64


-----
ds




Ранг: 33.8 (посетитель), 38thx
Активность: 0.060
Статус: Участник

Создано: 06 января 2015 14:49 · Поправил: dimka_new
· Личное сообщение · #12

DimitarSerg не поверите в первую очередь пробовал под админом

В общем разобрался
Взял за основу пример по ссылке F_a_u_s_t
Под 7-кой отлично отрабатывает - все отдает, под варей пишет не могу открыть файл.
за tryecxeptil - если номер отдался беру его, при ошибке пустую строку и читаю дату бивиса с реестра.
Может в блог положу статейку, но не факт, чет ленивый стал

Вот наваял примерчик - может кому сгодится - http://rghost.ru/60171411



Ранг: 512.7 (!), 360thx
Активность: 0.270.03
Статус: Модератор

Создано: 06 января 2015 18:08
· Личное сообщение · #13

для чтения инфо о диске использовал много раз
http://www.winsim.com/diskid32/diskid32.html
С-код, много подходов,
не работало только 1 раз, насколько помню есть проблема если есть sd-reader + sd карта



Ранг: 33.8 (посетитель), 38thx
Активность: 0.060
Статус: Участник

Создано: 06 января 2015 18:27
· Личное сообщение · #14

sendersu, да это я видел 3-й пост - человек переделал исходники на delphi



Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

Создано: 06 января 2015 18:45
· Личное сообщение · #15

незнаю конечно, над чем там можно сидеть 3 дня. переписать код с проги 1 в 1 и вуаля



Ранг: 33.8 (посетитель), 38thx
Активность: 0.060
Статус: Участник

Создано: 07 января 2015 15:39
· Личное сообщение · #16

SReg пишет:
незнаю конечно, над чем там можно сидеть 3 дня. переписать код с проги 1 в 1 и вуаля


Да вот тока тебя сидел и ждал, прикольно, не видя не программы, вообще нихера не видя, залетает туловище, и утверждает, зачем сидеть я всякое за минутку сделаю.
Ну раз так - давай - делай, перепиши 1 в 1 ?, вуаля ?



Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 07 января 2015 16:51
· Личное сообщение · #17

dimka_new, SReg
не горячитесь, горячие финские парни
можно ещё и рипнуть код, если переписывать лень




Ранг: 253.5 (наставник), 684thx
Активность: 0.260.25
Статус: Участник
radical

Создано: 07 января 2015 17:43 · Поправил: DimitarSerg
· Личное сообщение · #18

tihiy_grom пишет:
не горячитесь

+1

SReg пишет:
переписать код с проги 1 в 1 и вуаля

Если скиллы позволяют.
я вот некоторый софт сейчас докейгениваю, который отложил в 2012 и тогда казалось чем-то нереальным (сейчас на пару часов).
... а не судить по себе, ты перепишешь, я знаю, я бы риппнул/переписал.

dimka_new
Он перепишет, инфа 100% (понятное дело что заниматься этим никто 4fun не будет).


С праздником всех, добрее будьте

-----
ds




Ранг: 33.8 (посетитель), 38thx
Активность: 0.060
Статус: Участник

Создано: 07 января 2015 22:44 · Поправил: dimka_new
· Личное сообщение · #19

Во первых пользователей форума с праздниками !
Во вторых - по поводу моего поста, да возможно погорячился, тут не поспорить...
В третьих - написал статью по ремонту сабжа, но вылаживать не буду, боюсь заклюют(
В четвертых - рип, по моему скромному мнению, зло. Если рипаешь код - сиречь ты сдаешься, не можешь понять кода. Хотя и тут бывают исключения.
На сем все.


 eXeL@B —› Программирование —› Серийник винта
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати