|
182 / 33 / 3
Регистрация: 28.05.2015
Сообщений: 148
|
|
Серийный номер железа или как ещё привязать к компьютеру?31.01.2017, 12:50. Показов 7462. Ответов 28
Метки нет (Все метки)
При помощи VB6 как сделать привязку программы? По SN материнки, процессора, жёсткого диска, сетевой карты и т.д.
0
|
|
| 31.01.2017, 12:50 | |
|
Ответы с готовыми решениями:
28
Как в реестре или при помощи cmd посмотреть серийный номер материнской платы ? Серийный номер процессора или жесткого диска или материнки Серийный номер материнской платы или винчестера |
|
195 / 115 / 30
Регистрация: 05.08.2013
Сообщений: 491
|
|
| 31.01.2017, 13:23 | |
|
0
|
|
|
Заблокирован
|
|||||||
| 31.01.2017, 13:32 | |||||||
0
|
|||||||
| 31.01.2017, 13:34 | |
|
Не по теме: Shersh, Я намекаю про поиск по форуму...
0
|
|
|
Модератор
|
|||||||||||||||||||||
| 31.01.2017, 13:36 | |||||||||||||||||||||
Сообщение было отмечено CharlyChaplin как решение
Решение
5
|
|||||||||||||||||||||
|
182 / 33 / 3
Регистрация: 28.05.2015
Сообщений: 148
|
|
| 31.01.2017, 16:24 [ТС] | |
|
Иногда удивляюсь The trick. Такие вещи знает. Я тоже программирую: могу решить нужные задачи, продумать логику приложения, но как дело заходит о выудить что-то из ОС или поработать с памятью или API - проблема.
0
|
|
|
182 / 33 / 3
Регистрация: 28.05.2015
Сообщений: 148
|
|||||||||||
| 06.02.2017, 07:12 [ТС] | |||||||||||
|
Пытаюсь выполнить функцию GetCPUIDInfo. Почему выполнение VirtualAlloc выдаёт 0?
*** Форма: *** Кликните здесь для просмотра всего текста
*** Модуль *** Кликните здесь для просмотра всего текста
0
|
|||||||||||
|
182 / 33 / 3
Регистрация: 28.05.2015
Сообщений: 148
|
|
| 06.02.2017, 10:21 [ТС] | |
|
Поискал информацию про GetMem N. Если я правильно понял, то N это 1, 2, 4, 8 - это тоже самое как и ассемблерная команда mov с передачей 1, 2, 4, 8 байт в al, ax, eax регистры. Короче, передаваемые данные через N-разрядные регистры.
Я не совсем понимаю, какая разрядность у бейсиковского типа Long? Почему первый же GetMem не может передать 64-битное число в "лонговую" переменную pCode из-за переполнения? Если я правильно понял, то инструкциями mov последовательно в память через каждые 8 байт ложатся 64-х разрядные числа. Что это за числа?
0
|
|
|
Модератор
|
|||||||||
| 06.02.2017, 11:05 | |||||||||
1
|
|||||||||
|
182 / 33 / 3
Регистрация: 28.05.2015
Сообщений: 148
|
||||||
| 06.02.2017, 14:15 [ТС] | ||||||
Я вас ещё не достал? ![]() Всё же мне интересно, как работает функция GetCPUIDInfo и, в частности, вышеприведённый ассемблерный листинг. Хочется разобраться в программе, а не тупо копировать код. Немного покурил MSDN. Сорри за мой обывательский язык. Вот как я понимаю программу: 1. Сначала при помощи VirtualAlloc выделяем 4Кб памяти с правами "чтение/запись". Адрес, где начинается выделенное пространство, помещаем в "лонговую" переменную pCode. 2. Встроенной библиотечной функцией Getmem8, пачками(по 8 байт) передаём ассемблерный код в выделенную область памяти. 3. Потом производятся какие-то переопределения массивов и непонятный для меня код:
5. В param(0) помещается &H10-ый элемент массива bData(), а в param(1) - единица. 6. Снова вызывается код по адресу в pCode. 7. Освобождаем использованную область памяти для операционной системы. Также пытался разобраться в ассемблерном листинге: Где после сохранения в стеке текущих значений регистров, в EDI и EAX заносим адреса из SS:[ESP+10] и SS:[ESP+14], соответственно. Я так понимаю, они выполняют роль аргументов для функции. Потом даётся непосредственная CPUID-инструкция. А далее результат выполнения оказывается в EAX, EBX, ECX и EDX, откуда мы и переносим их в сегмент данных. Ну и из стека данные возвращаем на место в свои регистры. Если я правильно понимаю, цель ассемблерного листинга в том, что напрямую из VB нельзя обратиться к инструкции CPUID и приходится делать это с самого низа? Ещё вопрос, откуда взялись значения в SS:[ESP+10] и SS:[ESP+14]? Я имею ввиду, кто их туда поместил? Также вопрос по-поводу 3-го пункта. Какие действия там производятся, зачем мы переопределили массивы и что означает запись: types(0) = vbLong и types(1) = vbLong? DispCallFunc вызывается 2 раза, а параметры вызова одинаковы. Для чего вызывается она 2 раза?
0
|
||||||
|
Модератор
|
|||||||||||
| 06.02.2017, 20:50 | |||||||||||
|
Массив param - это непосредственно параметры функции, types - типы параметров. Первый вызов - передается первый элемент массива, функция заполняет 16 байт с индексом 0. . Это адреса аргументов. Вот смотри, если бы мы не сохраняли регистры в стеке push'ами, то адрес первого аргумента был бы ESP+4 (т.к. дополнительно ложится адрес возврата 4 байта), второго ESP+8, но мы сделали 3 push'а - 12 байт. 4 + 12 = 16 = 0x10.
2
|
|||||||||||
|
182 / 33 / 3
Регистрация: 28.05.2015
Сообщений: 148
|
|||||||||||
| 09.02.2017, 10:36 [ТС] | |||||||||||
|
Ещё вопрос:
Я не смог найти связи между
В вашем блоге про Inline-ассеблер вы написали: "Бывают ситуации когда в VB нужно использовать ассемблер. Обычно для этого используют предварительно скомпилированный код размещенный в памяти и запускают его одним из миллиона способов. Очевидным недостатком этого метода является то, что любая модификация ассемблерного кода требует изменения в процедурах размещения кода в памяти. К тому же это является довольно медленной процедурой." Правильно ли я понял, что недостаток выражается в том, что любых ошибках придётся заново компилировать код и брать шестнадцатеричные числа(например из отладчика) и вставлять их в проект Visual Basic? В нашем случае они были переведены в другую систему счисления? И я не совсем понимаю, что означает формулировка: "...требует изменения в процедурах размещения кода в памяти...". Изменения в каких процедурах например? Почему я задал такой вопрос, потому как первая же операция Getmem у меня вызывает ошибку "Overflow". Так как код "заморожен", т.е. его не исправить в IDE, то придётся либо отдельно его компилировать заново и вставлять новый HEX в проект, либо использовать вашу разработку из блога про Inline-Ассеблер, что я и хочу сделать.
0
|
|||||||||||
|
Модератор
|
|||||||||||
| 09.02.2017, 10:45 | |||||||||||
|
-842598367924536.4653@ - это Currency значение т.е. знаковое 64 битное число деленое не 1000, поэтому чтобы узнать hex значение умножаем на 1000 и смотрим Hex значение полученного числа -842598367924536465310=0x8B10E47C8B57525316.
1
|
|||||||||||
|
182 / 33 / 3
Регистрация: 28.05.2015
Сообщений: 148
|
|
| 09.02.2017, 12:41 [ТС] | |
|
Блин, получилось наконец!
Я оказывается ещё и неправильную декларацию DispCallFunc сделал. Исправил. Всё работает.![]() Спасибо большое.
0
|
|
|
182 / 33 / 3
Регистрация: 28.05.2015
Сообщений: 148
|
|
| 13.02.2017, 12:12 [ТС] | |
|
Немного поэкспериментировал с программой.
Есть два компьютера с процессорами: Pentium D и Core i5. Запуск программы производился как из IDE, так и простым exe-файлом, который был скомпилирован как на Pentium D, так и на Core i5. Результаты находятся в байтовом массиве, но байты для удобства я вывел строкой в MsgBox. Итак: Если запуск производится на Pentium D: 1.) в IDE, то 13 0 0 0 71 101 110 117 110 116 101 108 105 110 101 73 169 6 3 0 0 8 16 2 191 227 186 127 255 251 235 191 2.) exe, скомпилированном в Pentium D, то 13 0 0 0 71 101 110 117 110 116 101 108 105 110 101 73 169 6 3 0 0 8 16 2 191 227 186 127 255 251 235 191 3.) exe, скомпилированном в Core i5, то 13 0 0 0 71 101 110 117 110 116 101 108 105 110 101 73 169 6 3 0 0 8 16 0 191 227 186 127 255 251 235 191 Если запуск производится на Core i5: 1.) в IDE, то 6 0 0 0 71 101 110 117 110 116 101 108 105 110 101 73 98 15 0 0 0 8 2 1 61 228 0 0 255 251 235 191 2.) exe, скомпилированном на Core i5, то 6 0 0 0 71 101 110 117 110 116 101 108 105 110 101 73 98 15 0 0 0 8 2 1 61 228 0 0 255 251 235 191 3.) exe, скомпилированном на Pentium D, то 6 0 0 0 71 101 110 117 110 116 101 108 105 110 101 73 98 15 0 0 0 8 2 1 61 228 0 0 255 251 235 191 То есть, отличие в одном байте, когда компиляция идёт на процессоре старой модели, то при запуске готового exe на новой модели байты разнятся. Но если компилировать exe на новой модели, то результаты будут одинаковы что на новой, что на старой модели CPU. Также я заметил, что иногда 24-й байт изменяется то на 1, то на 0, то на 2 - если просто запускать несколько раз exe. Иногда первый байт меняется на 6, 3 или 13. Тогда возникает вопрос, можно ли привязываться к компьютеру, если ID не постоянен, хотя определённые его части, всё-таки, не изменчивы. Добавлено через 31 минуту Вопрос ещё осложняется тем, что мне важна именно неизменчивость данных. В моём приложении я беру CPUID, превращаю его в подобный вышеприведённый строчный вид, только без пробелов, беру из него хеш SHA-256, и часть этого хеша является ключом к зашифрованным данным, которые шифруются криптостойким алгоритмом. А теперь представьте себе, если вдруг изменится хотя бы одно значение в CPUID. Пользователь просто потеряет свои данные. Это будет катастрофа.(( Поэтому, прежде чем вшивать туда код по выуживанию CPUID, я должен убедиться, что данные не меняются. Но они почему-то меняются. Даже если брать часть CPUID, типа Genuenintel, то ведь он у многих есть, нужен именно уникальный идентификатор. Добавлено через 1 час 48 минут Теперь про серийник жёсткого диска. Когда разбирал код, не смог найти описание функции SaveArrayElementsCount. Ну да ладно. Поискал по форуму и здесь нашёл ваш же пост по такой же теме. Тот код работает и показывает серийник именно жёсткого диска. Этот серийник я проверил в программе Everest - всё верно. Но проблема в том, что он не показывается на WinXP, т.к. desc.SerialNumberOffset выдаёт смещение, но в buffer по нему стоят нули. В принципе, вы так и написали в комментарии: "Если он представлен конвертируем его из HEX в строку" На Win7 прекрасно работает. В чём может быть проблема? 1. Необходимо сначала узнать на каком логическом диске запущено моё приложение. 2. затем узнать какому физическому диску сопоставлена буква логического диска 3. и потом уже сверить серийный номер физического диска с заданным. Если верен, то программа запустится. Добавлено через 4 часа 30 минут Решил проблему самостоятельно. Помимо HDD Serial, также смог определить Model Number и Firmware Revision. Код работает как на Win7, так и на WinXP. Сверил с показаниями Everest - всё верно. Но с CPUID я так и не разобрался.
0
|
|
|
39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 634
|
|
| 14.07.2017, 15:05 | |
|
Добрый
Добавлено через 44 секунды Добрый день! Вам не трудно выложить финальный листинг проекта.. Желательно в архивчике... Заранее спасибо
0
|
|
|
182 / 33 / 3
Регистрация: 28.05.2015
Сообщений: 148
|
|||||||||||
| 15.07.2017, 07:32 [ТС] | |||||||||||
|
Определение CPUID (часть кода принадлежит Анатолию):
****** форма(без контролов) ****** Кликните здесь для просмотра всего текста
****** модуль ****** Кликните здесь для просмотра всего текста
Готовый проект + *.exe находится во Вложении. Второй EXE-файл смогу скинуть только в понедельник, т.к. Pentium D находится на работе.
0
|
|||||||||||
|
Ушел с форума
|
||
| 15.07.2017, 09:02 | ||
|
На двух компьютерах с одинаковыми моделями процессоров и одинаковыми настройками BIOS данные, полученные из CPUID, будут полностью идентичными. Поддержку серийных номеров из CPUID убрали еще много лет назад. Так что привязываться к CPUID - это ошибочная идея, она хорошо работать не будет. Уж лучше использовать серийные номера HDD и MAC...
2
|
||
| 15.07.2017, 09:02 | |
|
Помогаю со студенческими работами здесь
20
Как восстановить серийный номер seomonitor ???
Как прочесть серийный номер процессора? Как вывести серийный номер батареи Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|