Модераторы: bartram, Akella
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Серийный номер винчестера. Only под win98(95) из ДОС-окон. 
:(
    Опции темы
Chingachguk
Дата 2.4.2002, 03:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Код драйверка, читающего серийный номер винчестера(именно тот, который длиной 256 слов !;) в win98(95) из ДОС-задач. Для вызовов из win32-приложений необходимо переработать код, непосредственно читающий серийный номер(см. СИ-код справа в комментариях) в виде динамической VxD(WDM). Драйвера(а не просто команды in/out) необходимы потому, что Windows ЗАПРЕЩАЕТ работу с портами винчестера прикладным программам. Доступ к ним можно получить, если этот драйвер указать в autoexec.bat - тогда windows загрузит этот код в ring0 и работа с диском будет проходить через него, а код драйвера получит право на работу с портами.

; Программа для выдачи серийного номера жесткого диска.
; Выдает серийный номер жесткого диска в указнный буфер из 256 слов.
; Необходимо указать в autoexec.bat ее инсталляцию.
; Будучи загружена перед Windows 95/98, попадает в 0-кольцо защиты OS
; (указать в autoexec.bat)
; И потому способна корректно работать с портами ввода-вывода ЖД.
; Под DOS работает так же, как обычная программа, читающая порты ЖД.
; Поддерживает 2 функции (регистр AL):
; AL = 00h - INSTALLATION CHECK
; Если инсталлировна, то AL = FBh(Номер резерв. ф-ции), CF флаг сброшен
; AL = 01h - READ SERIAL DISK NUMBER
; В случае успешного чтения возвращает:
; - AL = FBh (Номер резерв. ф-ции), CF флаг сброшен;
; - В переданный буфер ES:DI читает серийный номер диска, буфер
; должен быть длиной 256 слов;
; Если чтение не удалось, то AL = FF и флаг CF установлен
; На другие значения в AL возвращает FF + установленный флаг CF
.286                    ; Команды процессора 286+ незащищенного режима
HookedVector equ 13h    ; Перехватываем вектор 13h - работа с диском BIOS
OurFunction  equ 0fbh   ; Резервируем ф-цию 0fbh прерывания 13h для себя
Drive        equ 00h    ; Видимо, номер жесткого диска (0,1,..)
FuncNumber   equ 2      ; Число поддерживаемых функций
InstallCheck equ 0      ; Запрос на инсталляцию
ReadSerial   equ 1      ; Запрос на чтение серийного номера
ErrorFunc    equ 0ffh   ; Ответ на ошибочный запрос
cseg segment byte 'code'
    assume  cs:cseg
    org     100h       ; Обычный PSP com - программы
begin:     jmp  Iniz    ; Обойдем резидентный код
messagekey proc near
       pushf           ; Сохраним флаги вызывающей программы
       cmp  ah,OurFunction
       jnz  @NotOurFunction
       popf            ; Парная команда к pushf в начале кода
       call Dispatcher ; Отработать возможные функции
       retf 2          ; Вернуться с установленными внутри флагами
@NotOurFunction:
       popf            ; Восстановим флаги вызывающей программы
       db   0eah       ; код команды jmp far
       Old_13H dd ?    ; На предидущий обработчик int 13h
messagekey endp
Dispatcher proc near
       push si
       xor  si,si
@FindFunc:
       cmp  al,cs:Functions[si]
       jz   @FuncFound
       inc  si
       cmp  si,FuncNumber
       jb   @FindFunc
       pop  si
       mov  al,ErrorFunc
       stc
       retn
@FuncFound:
       shl  si,1
       call word ptr cs:FuncOfs[si]
       pop  si
       retn
Dispatcher endp
Functions db InstallCheck,ReadSerial
FuncOfs   dw offset Install, offset ReadInfo
Install proc near
       mov  al,OurFunction
       clc
       retn
Install endp
ReadInfo proc near
       pusha
       mov  word ptr cs:Counter,0
@TryAgain:
mov  dx,03f6h
mov  al,0ah
out  dx,al      ; outportb(0x3F6,0x0A)
call Waiter
@Wait1: mov  dx,01f7h
in   al,dx
call TimeOut
test al,80h     ; while(inportb(0x1F7)&0x80);
jnz  @Wait1
call Waiter
mov  dx,01f6h
mov  al,Drive
shl  al,4
add  al,0a0h
out  dx,al      ; outportb(0x1F6,0xA0+(drive<<4));
call Waiter
@Wait2: mov  dx,01f7h
in   al,dx
call TimeOut
test al,40h     ; while(!(inportb(0x1F7)&0x40));
jz   @Wait2
call Waiter
mov  dx,01f7h
mov  al,0ech
out  dx,al      ; outportb(0x1F7,0xEC);
call Waiter
@Wait3: mov  dx,01f7h
in   al,dx
call TimeOut
test al,08h     ; while(!(inportb(0x1F7)&0x08));
jz   @Wait3
call Waiter
; for(i=0; i<256; i++) infoArray[i] = swap(inportw(0x1F0)) (to es:[di])
mov  cx,256
       cld
@FillBuf:
call Waiter
mov  dx,01f0h
in   ax,dx
xchg al,ah
mov  es:[di],ax ; es:[di] = ax, di:=di+2
       inc  di
       inc  di
loop @FillBuf
mov  dx,01f7h
in   al,dx
call TimeOut
test al,80h     ; if(inportb(0x1F7)&0x80) continue;
       jz   @ReadOK
jmp  @TryAgain
@ReadOK:popa
       clc
       mov  al,OurFunction
       retn
TimeOut proc near
inc  word ptr cs:Counter
jnz  @TimeDone
pop  ax
       popa
       mov  al,ErrorFunc
       stc
@TimeDone:
retn
Counter dw 0
TimeOut endp
ReadInfo endp
Waiter  proc near
push cx
xor  cx,cx
@Wait: loop @Wait
pop  cx
retn
Waiter  endp
Iniz proc
 assume ds:cseg
       push ds
mov  ax,(35H shl 8) + HookedVector
int  21h        ; Get old HookedVector to es:bx
mov  word ptr Old_13h,bx
       mov  word ptr Old_13h+2,es
       mov  dx,offset MessageKey
mov  ah,25h
int  21H        ; Set new Vector
       mov  dx,offset Iniz
       int  27H        ; Terminate and Stay Rezident
Iniz endp
cseg ends
 end Begin


Пример вызова(из ДОС-приложения !;):

; Проверить наличие драйвера:
mov ax,0FB00h ; INSTALLATION CHECK
; Если инсталлировна, то AL = FBh(Номер резерв. ф-ции), CF флаг сброшен
int 13h
jc @@NotInstall
cmp al,0FBh
jnz @@NotInstall
mov ax,0FB01h ; READ SERIAL DISK NUMBER
les di,Buffer ; В переданный буфер ES:DI читает серийный номер диска
int 13h
jc @@ErrorRead
; ...


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Vit
Дата 2.4.2002, 03:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 4
Всего: 207



Когда-то очень давно, в те времена когда полугигабайтный винт считался непозволительной раскошью, под ДОС занимался я изучением винта, напрямую читая дорожки и сектора (кажись 13 прерывание ДОС это было), оказалось что винт содержит на 1 дорожку больше чем написано в документации и видит Norton Disk Edit. Просто обращаясь к той дорожке нашел я много интересного - и информация о всяких серийных номерах и какая-то инфа от производителя и даже несколько чистых секторов, на которые можно чего записать (кстати в древности был неплохой русский редактор "Слово и дело" и кажись он туда ставил свою информацию о Trial)... Времена меняются, винты увеличились на 2 порядка, но может там та дорожка сохранилась и туда можно чего-нибудь написать?


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Chingachguk
Дата 2.4.2002, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



К сожалению, никогда не слышал о таком "дополнительном" секторе винчестера ... Полагаю только, что его наличие связано с нестандартным форматированием (по крайней мере в алгоритмах защиты программ, связанных с привязкой к дискете, встречается сто пудов такое форматирование - например, в книге П.Нортона "IBM PS и PS/2: руководство пользователя" и т.п.). Попробую что-то разузнать про это ...


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Vit
Дата 2.4.2002, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 4
Всего: 207



Попробуй просто ввести номер дорожки на 1 больший максимального и прочитать...


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
neutrino
Дата 4.4.2002, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



Da, ia vot toje "Slovo i Delo" ispolzoval. Pontovaia bila shtuka.
A mojno li sdelat takuiu zashitu programm: ispolzovat seriyniy nomer vinta, kak kliuch v kakom-nibud shifre i zashifrovat im kakuiu nibud stroku. Potom pri starte rasshifrovivat seriynim nomerom etu stroku i esli ona rasshifrovalas pravilno, to prodoljit vipolnenie, esli net to "This is copy of Software. If you want use this program, buy it.". Ili uje takoe est?


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
Chingachguk
Дата 4.4.2002, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Цитата

neutrino Дата сообщения: 04.4.2002,10:11
Da, ia vot toje "Slovo i Delo" ispolzoval. Pontovaia bila shtuka.
A mojno li sdelat takuiu zashitu programm: ispolzovat seriyniy nomer vinta, kak kliuch v kakom-nibud shifre i zashifrovat im kakuiu nibud stroku. Potom pri starte rasshifrovivat seriynim nomerom etu stroku i esli ona rasshifrovalas pravilno, to prodoljit vipolnenie, esli net to "This is copy of Software. If you want use this program, buy it.". Ili uje takoe est?


Так я так и познакомился с этим "серийным номером" - в конторе, где работал, исправлял ошибку у одной проги, которая именно так и "привязывалась" к нему. Только вот сам бы я так делать не стал: а если клиент винт поменяет - тогда как ? ;)

Цитата

Vit Дата сообщения: 02.4.2002,15:08
Попробуй просто ввести номер дорожки на 1 больший максимального и прочитать...


Как я понимаю, нужно взять вторую сторону диска(вторую головку, если их считать с единицы) и прочесть на max_дорожка+1 первый сектор ?
Параметры винта(число дорожек, на которое винт отформатирован) можно взять в BIOS ?


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Vit
Дата 4.4.2002, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 4
Всего: 207



Цитата(Chingachguk @ 04.4.2002, 02:42)
Как я понимаю, нужно взять вторую сторону диска(вторую головку, если их считать с единицы) и прочесть на max_дорожка+1 первый сектор ?
Параметры винта(число дорожек, на которое винт отформатирован) можно взять в BIOS ?

Именно так


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Chingachguk
Дата 16.4.2002, 02:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Полазил я по своему диску, много чего нового узнал, но ничего "такого" не нашел ;)

Вот как мой диск устроен:

Сначала на цилиндре(дорожке) 0, головке 0 идут свободные (63 штуки) сектора, сектор 0/0/1 - mbr;
Потом с цилиндра 0, головка 1, сектор 1 начинается активный раздел(у меня он один) и заканчивается на цилиндре 583(всего их 584, если с нуля считать), головке 63(тоже с нуля), секторе 63.
Потом идет один свободный цилиндр(584), но на нем сначала сектора заполнены нулями, потом (головки ~48..63) - байтами 6D B6 6D B6 ... - и так до конца.

Вот и все, что доступно через интерфейс БИОС(прерывание 13h).
Винда вообще дает читать только сектора активного раздела>...


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Vit
Дата 16.4.2002, 03:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 4
Всего: 207



Мда! Когда я лазил 4-5 лет назад - структура была довольно сильно отличной, но это-то понятно - объем вырос на 2 порядка...


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Windows"
December
bartram
Akella

Запрещается!

1. Обсуждать взлом и делиться кряками

2. Способствовать созданию и распространению вирусов

  • Для бессмертных бородатых вопросов типа Win vs Nix есть специальный форум Религиозные Войны
  • Несанкционированная реклама на форуме запрещена
  • Пожалуйста, давайте своим темам осмысленный, информативный заголовок. Вопль "Помогите!" таковым не является.
  • Чем полнее и яснее Вы изложите проблему, тем быстрее мы её решим.
  • ВСЕГДА УКАЗЫВАЙТЕ ВЕРСИЮ ОС

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, December, bartram, Akella.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS Windows | Следующая тема »


 




[ Время генерации скрипта: 0.0493 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.