Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Уникальные номера для определенного "компа" (https://forum.antichat.xyz/showthread.php?t=108613)

_nic 01.03.2009 15:24

Уникальные номера для определенного "компа"
 
Как можно попроще получить любое произвольное число?Но что бы оно было уникальным для каждого компьютера на котором будет выполнятся такой код.

0x0c0de 01.03.2009 15:41

1) получить бренд-индекс процессора (cpuid функции с 0x80000002 по 0x80000004)

2) получить серийный номер винта (http://forum.codenet.ru/archive/index.php/t-9911.html)

сложить 2 строки, взять от них хеш и получите уникальное число

_nic 02.03.2009 01:16

Цитата:

Сообщение от 0x0c0de
1) получить бренд-индекс процессора (cpuid функции с 0x80000002 по 0x80000004)

2) получить серийный номер винта (http://forum.codenet.ru/archive/index.php/t-9911.html)

сложить 2 строки, взять от них хеш и получите уникальное число

Я просил попроще а не на как минимум 150 строчек кода :( Мне не принципиально что число может менятся.Мне главное что бы возможность его повторения максимально стремилась к нулю.
Вот нашол код получения мака сетевой
Код:

//----------------------
typedef DWORD (CALLBACK* GetadAptInfo)(PIP_ADAPTER_INFO, PULONG);
 HINSTANCE iphlpapi;
 iphlpapi=LoadLibrary("iphlpapi.dll");
 if (!iphlpapi)
    {
    ShowMessage( "Error of upload iphlpapi.dll!");
    Abort();
    }
 GetadAptInfo GetAdaptersInfo;
 GetAdaptersInfo = ( GetadAptInfo)
 GetProcAddress( iphlpapi, "GetAdaptersInfo");
 ULONG adapter_info_size = 0;
 PIP_ADAPTER_INFO pip_a_i = NULL;
 GetAdaptersInfo( pip_a_i, &adapter_info_size );
 pip_a_i = (PIP_ADAPTER_INFO)
                      malloc( sizeof(char) * adapter_info_size);
    if ( GetAdaptersInfo( pip_a_i, &adapter_info_size ))
      {
        ShowMessage("Error in GetAdaptersInfo!");
        free(pip_a_i);
        Abort();
      }
    while (pip_a_i)
          {
          Memo1->Lines->Add("Adapter's CLSID: " + (String)pip_a_i->AdapterName);
          Memo1->Lines->Add ("Name; " + (String)pip_a_i->Desc_ription);
          Memo1->Lines->Text =  Memo1->Lines->Text + "MAC address: ";
          for (int i = 0; i < pip_a_i->AddressLength; i++)
              {
                Memo1->Lines->Text =  Memo1->Lines->Text + ((unsigned char)pip_a_i->Address[i]) + ".";
              }
          Memo1->Lines->Add("");
          pip_a_i = pip_a_i->Next;
          }
    free(pip_a_i);
    FreeLibrary(iphlpapi);

Но есть одна проблемка :( У меня он почему то выводит информацию только по виртуальным сетевухам vmware :confused: А реальной физической почему то невидет

ToniKapuchon 02.03.2009 01:19

Цитата:

Сообщение от _nic
Я просил попроще а не на как минимум 150 строчек кода :( Мне не принципиально что число может менятся.Мне главное что бы возможность его повторения максимально стремилась к нулю.
Вот нашол код получения мака сетевой
Код:

//----------------------
typedef DWORD (CALLBACK* GetadAptInfo)(PIP_ADAPTER_INFO, PULONG);
 HINSTANCE iphlpapi;
 iphlpapi=LoadLibrary("iphlpapi.dll");
 if (!iphlpapi)
    {
    ShowMessage( "Error of upload iphlpapi.dll!");
    Abort();
    }
 GetadAptInfo GetAdaptersInfo;
 GetAdaptersInfo = ( GetadAptInfo)
 GetProcAddress( iphlpapi, "GetAdaptersInfo");
 ULONG adapter_info_size = 0;
 PIP_ADAPTER_INFO pip_a_i = NULL;
 GetAdaptersInfo( pip_a_i, &adapter_info_size );
 pip_a_i = (PIP_ADAPTER_INFO)
                      malloc( sizeof(char) * adapter_info_size);
    if ( GetAdaptersInfo( pip_a_i, &adapter_info_size ))
      {
        ShowMessage("Error in GetAdaptersInfo!");
        free(pip_a_i);
        Abort();
      }
    while (pip_a_i)
          {
          Memo1->Lines->Add("Adapter's CLSID: " + (String)pip_a_i->AdapterName);
          Memo1->Lines->Add ("Name; " + (String)pip_a_i->Desc_ription);
          Memo1->Lines->Text =  Memo1->Lines->Text + "MAC address: ";
          for (int i = 0; i < pip_a_i->AddressLength; i++)
              {
                Memo1->Lines->Text =  Memo1->Lines->Text + ((unsigned char)pip_a_i->Address[i]) + ".";
              }
          Memo1->Lines->Add("");
          pip_a_i = pip_a_i->Next;
          }
    free(pip_a_i);
    FreeLibrary(iphlpapi);

Но есть одна проблемка :( У меня он почему то выводит информацию только по виртуальным сетевухам vmware :confused: А реальной физической почему то невидет

там не 150 строчек получиться, а максимум 10)) да и ваще если ты умеешь кодить, то как то глупо задавать такие вопросы!

cremator (c) 02.03.2009 01:35

а (cpuid функции с 0x80000002 по 0x80000004) что значат? и как их заюзать? лучше на дельфи

stasoft 02.03.2009 02:28

Ищите в варезниках вот такую штуку и будет вам щастье.

0x0c0de 02.03.2009 07:09

Цитата:

Сообщение от cremator (c)
а (cpuid функции с 0x80000002 по 0x80000004) что значат? и как их заюзать? лучше на дельфи


Чтобы получить строку бренд-индекс, надо последовательно вызывать команду cpuid со значениями в eax = 0x80000002 , 0x80000003,0x80000004 . В результате в регистрах eax, ebx, ecx, edx именно в таком порядке вы будете получать по 16 байт [4x4] строки. И того, для хранения самого индекса вам потребуется строка длиной 48 ascii символов и завершающий 0 и того 49 символов (как видно это как раз максимально возможное значение).

В сорцах моего amd-cpu-info эта функция есть

Код:

VOID WINAPI GetBrandStr(PCHAR szBrand)
{
 for(DWORD arg = 0x80000002,i=0;arg<=0x80000004;arg++,i+=15)
 {
                _asm
                {
                        mov edi,szBrand
               
                        mov eax,arg
                       
                        cpuid
                       
                        mov esi,i
                       
                        mov dword ptr [edi+esi],eax
                       
                        mov dword ptr [edi+3+esi],ebx
                   
                        mov dword ptr [edi+7+esi],ecx
                       
                        mov dword ptr [edi+11+esi],edx
                }


               
 }
}

Пример вызова


Код:


CHAR cBrandInd[49];

RtlZeroMemory(&cBrandInd,49);

GetBrandStr(cBrandInd);

MessageBoxA(0,cBrandInd,"Processor",0);

Как пример

"AMDAthlon(tm) 64 X Dual Core Processr 5200+"

2ТС как мне кажется, это довольно простой способ - все, что связано с cpuid. У этой команды еще имеется большое количество различных функций с помощью которых можно узнать возможности конкретного процессора. Правда, если не использовать с другими параметрами оборорудования, то не особо случайно получиться, да вы и сами понимаете

желаю удачи

slesh 02.03.2009 10:24

по мне проще сгенерить ID через rdtsc и сохранить в реестре.
Хотя способ с номером тома системного диска - тож очень хорош.

_nic 02.03.2009 14:29

Цитата:

Сообщение от 0x0c0de
Чтобы получить строку бренд-индекс, надо последовательно вызывать команду cpuid со значениями в eax = 0x80000002 , 0x80000003,0x80000004 . В результате в регистрах eax, ebx, ecx, edx именно в таком порядке вы будете получать по 16 байт [4x4] строки. И того, для хранения самого индекса вам потребуется строка длиной 48 ascii символов и завершающий 0 и того 49 символов (как видно это как раз максимально возможное значение).

В сорцах моего amd-cpu-info эта функция есть

Код:

VOID WINAPI GetBrandStr(PCHAR szBrand)
{
 for(DWORD arg = 0x80000002,i=0;arg<=0x80000004;arg++,i+=15)
 {
                _asm
                {
                        mov edi,szBrand
               
                        mov eax,arg
                       
                        cpuid
                       
                        mov esi,i
                       
                        mov dword ptr [edi+esi],eax
                       
                        mov dword ptr [edi+3+esi],ebx
                   
                        mov dword ptr [edi+7+esi],ecx
                       
                        mov dword ptr [edi+11+esi],edx
                }


               
 }
}

Пример вызова


Код:


CHAR cBrandInd[49];

RtlZeroMemory(&cBrandInd,49);

GetBrandStr(cBrandInd);

MessageBoxA(0,cBrandInd,"Processor",0);

Как пример

"AMDAthlon(tm) 64 X Dual Core Processr 5200+"

2ТС как мне кажется, это довольно простой способ - все, что связано с cpuid. У этой команды еще имеется большое количество различных функций с помощью которых можно узнать возможности конкретного процессора. Правда, если не использовать с другими параметрами оборорудования, то не особо случайно получиться, да вы и сами понимаете

желаю удачи

Я читал что такое способ не работает на старых процессорах типа пентиум 3 или атлон ХР

0x0c0de 02.03.2009 15:57

>>Я читал что такое способ не работает на старых процессорах типа пентиум 3 или атлон ХР

Нет проблемы добавить небольшую проверку. Если функция cpuid 80000000h вернет в eax значение <80000004h, то вывод строки бренд-индекса не поддерживается. И тогда можно сделать по старинке - вывод идентификатора с помощью функции 0.

_nic 02.03.2009 20:28

Я выбрал серийник тома раздела с виндой.

Hellsp@wn 02.03.2009 22:44

если юзать cpuid, то правилом хорошего тона предпологается или обернуть вызов в сех иди проверить поддержку рпоцессором такой инструкции:
Код:

function IsCPUID(): Boolean; register;
asm
  PUSHFD                {save EFLAGS to stack}
  POP    EAX            {store EFLAGS in EAX}
  MOV    EDX, EAX      {save in EDX for later testing}
  XOR    EAX, $200000;  {flip ID bit in EFLAGS}
  PUSH    EAX            {save new EFLAGS value on stack}
  POPFD                  {replace current EFLAGS value}
  PUSHFD                {get new EFLAGS}
  POP    EAX            {store new EFLAGS in EAX}
  XOR    EAX, EDX      {check if ID bit changed}
  JZ      @exit          {no, CPUID not available}
  MOV    AL, TRUE      {yes, CPUID is available}
@exit:
end;

как вариант, получать имя компа/юзера :)

0x0c0de 02.03.2009 23:06

я вот сейчас у интелов глянула в мане, там до 486 cpuid не поддерживается, как и у амд (там у них кажись тоже с 486 появилось). И у себя не проверяла в кодесе, температуру-то с amd64 можно мерить через Thermtrip Status Register... В общем случае, конечно же, проверка не помешает.

ЗЫ Хотя что тут говорить, тс уже выбрал удобный для себя способ

Jes 04.03.2009 01:04

http://wasm.ru/article.php?article=hardzen

GanWorld 04.03.2009 01:11

А узнать серийник или индификатор Материнской платы?

St0nX 04.03.2009 13:17

Цитата:

А узнать серийник или индификатор Материнской платы?
Вопрос зачем? Они не уникальны. А вообще получить можно из BIOS _ttp://www.codeproject.com/KB/system/SMBIOS_Peek.aspx

Buffalon 06.03.2009 13:53

КАПЕЦ %) РАНДОМ + РАНДОМ + РАНДОМ


Время: 06:41