2012-04-21 3 views
1

Ну, я хотел бы получить уникальный идентификатор CPU, чтобы я мог получить идентификацию UNIQUE для каждой машины. Я проверил __cpuid() из библиотеки windows.h, но проблема в том, что идентификатор он получает, это идентификатор всех типов ЦП, если у вас есть процессор I3 Core, и у меня есть основной процессор I3, он даст тот же «Уникальный идентификатор».Уникальный идентификатор CPU в Windows через C++

Вот что я придумал, чтобы сделать CPU ID из __cpuid(), которая возвращает ту же информацию о процессорах одного и того же типа:

std::string GetCPUID(){ 

      int CPUInfo[4] = {-1}; 
      __cpuid(CPUInfo, 0); 
      if (CPUInfo[0] < 4) 
      return ""; //Error on retrieving 

      stringstream st; 
      for(int i = 0; i <= 3; i++){ 
         st << CPUInfo[i]; 
        } 

      return st.str(); 

} 

Я также проверил программу под названием «Hardware ID Extractor «это прекрасно работает, на самом деле он возвращает идентификатор UNIQUE CPU как графический интерфейс, как я и хотел, поэтому они предоставили DLL, чтобы мы могли извлечь идентификатор CPU, который он сгенерировал, я пробовал все с помощью самого чистого кода с помощью DLL и следуя их примеру, но кажется, что он ничего не возвращает при работе в Windows 7. многие другие люди жаловались на это в Windows 7 через DLL, даже несмотря на то, что GUI в Windows 7 возвращает правильный идентификатор ЦП.

Показаны свою работу в Hardware ID Extractor,

Вот сайт, где я загружал DLL (Где я выбрал ссылку на C++, VB, .NET): http://www.soft.tahionic.com/download-hdd_id/free-download/free%20download.html

И вот сама DLL скачать: http://www.soft.tahionic.com/download-hdd_id/free-download/DLL%20compressed/HardwareIDExtractorC.dll

Это код, который я получил от Hardware ID Extractor (я использую Visual Studio 2008):

#include <iostream> 
#include <windows.h> 
#include <conio.h> 
using namespace std; 

int main(){ 

    char* (__stdcall *GetIDESerialNumber)(BYTE); 

    HINSTANCE DllInst = NULL; 
    if (DllInst == NULL) DllInst = LoadLibrary("C:\\HardwareIDExtractorC.dll"); 
    printf("LoadLibrary error %d\n", GetLastError()); 
    if (DllInst) { 
     GetIDESerialNumber = (char* (__stdcall*)(BYTE))GetProcAddress(DllInst, "GetIDESerialNumber"); 

    //Now call the imported function 
     cout << "SN: " << GetIDESerialNumber(0); // 0 = first IDE hard drive in your system 
    }else{ 
     printf(" - Not Loaded"); 
    } 

    _getch(); 



return 0; 
} 

В визуальной продукции студии он показывает, что DLL была выполнена, говоря:

'Test.exe': Loaded 'C:\HardwareIDExtractorC.dll', Binary was not built with debug information. 

И выход программы, которую я получаю: LoadLibrary error 998 - Not loaded

Кто-то знает, что я могу сделать, чтобы получить CPU ID Unique, как в приложении Hardware ID Extractor? Мне нужно получить идентификатор ЦП, потому что, если я получу информацию о жестком диске, пользователь может отформатировать жесткий диск, и программа перестанет работать, так как я разрабатываю его для работы только с указанным компьютером.

Я использую Windows 7 32 бит Ultimate и Intel I3 Core Processor (если это помогает в любом случае).

Надеюсь, что в моем вопросе был ясен. Спасибо заранее!

+0

Сбой вызова функции LoadLibrary() по какой-либо причине. Можете ли вы добавить код ошибки из GetLastError()? – uesp

+0

cpuid не возвращает уникальный идентификатор процессора, он возвращает возможности ЦП. Кроме того, прочитайте это: http://en.wikipedia.org/wiki/Processor_Serial_Number#Controversy_about_privacy_issues – avakar

+0

Он выбрал ошибку «Ошибка LoadLibrary 998», когда я использовал DllInst = LoadLibrary («C: \\ HardwareIDExtractorC.dll»); \t printf («Ошибка LoadLibrary% d \ n», GetLastError()); – Grego

ответ

3

Вы не можете исполнить эту работу. Intel представила серийный номер процессора в дизайне Pentium III, который читается с помощью cpuid. Это вызвало огромный вонь из-за privacy concerns, и Intel была вынуждена отступить. Эта функция была удалена в более поздних версиях Pentium III и никогда не была возвращена.

Вам понадобится использовать другой источник для отпечатка пальца. Не используйте только один, собирайте кучу и объявляйте его недействительным, когда более одного изменено. Используйте MAC-адрес сетевого адаптера, размер оперативной памяти, серийный номер тома диска и тому подобное. Есть тысячи вопросов об этом в SO.

+1

Ханс благодарит за ответ, вы знаете эту программу под названием «Hardware ID Extractor», она утверждает, что получает идентификатор CPU, серийный номер жесткого диска, все разделенные, он не говорит, что он использует много информации и все еще работает правильно , и они делают его доступным исходным кодом, но его только для покупки. Вы знаете, как это сделала программа? Благодаря! – Grego

+2

Программа делает это шаг за шагом! Если вы действительно не хотите платить им (что, вероятно, вам нужно, так как вы, очевидно, делаете это для коммерческого проекта, в чем смысл?), Вам нужно самостоятельно выяснить, что они сделали. В основном вы, вероятно, должны не беспокоиться об этом, и просто делаете что-то вроде онлайн-регистрации, как и многие другие, в наши дни: отправляйте серийный номер программы на центральный сервер, который следит за использованием дубликатов и делает их недействительными по мере необходимости. –

+2

John Zwinck благодарит за ответ, я действительно подумываю о покупке его, и вы знаете, что я также использую онлайн-регистрацию, но онлайн-регистрация не так сложно взломать, если вы имитируете сервер и изменяете входящие данные, поэтому я добавив немного больше трудностей, поэтому моя программа не получает пиратских так легко. – Grego

1

Hardware ID Extractor надежный и прост в использовании. У меня есть это. Потому что я купил DLL и Исходный код давно мне не пришлось покупать обновления. Я просто изменил код сам.

Hans спасибо за ответ, вы знаете, эта программа называется "Hardware ID Extractor" он утверждает, что она возвращает процессор ID

Да. DLL предоставляет не только идентификатор CPU и ID ID HDD, но и многие другие статистические данные, связанные с оборудованием (ID). Я пробовал его на нескольких процессорах (как AMD, так и Intel), и он работает как шарм.

Схема

Самая дешевая 'защита' является серийным номером. Это просто отстойное время. Один бездумный клиент делает его доступным в Интернете, и у всех есть ваша программа БЕСПЛАТНО! Не говоря уже о том, что сегодня «хакеры» не потрудились нарушить защиту вашего программного обеспечения. Они будут покупать ваше программное обеспечение поддельной кредитной карточкой и будут публиковать ключ в Интернете или они будут покупать программное обеспечение с действующей кредитной картой, а затем они будут использовать 30-дневную политику возврата денег, чтобы вернуть деньги. Некоторые безумные реселлеры программного обеспечения, такие как Plimus (да, держаться подальше от Plimus), применяют это к поставщикам программного обеспечения. Классические серийные номера мертвы, как динозавры.

Другая рекомендация, основанная на сервере, также не очень хороша. Немного сложнее обмануть поддельных кредитных карт «хакеров», а также не будет просачивать ключи по всему Интернету. Но вы потеряете хотя бы половину своих клиентов, потому что в наши дни у всех есть брандмауэр/антивирус, который заблокирует вашу программу от подключения к серверу. А как насчет тех, кто мобилен? Или у вас есть только случайный/редкий доступ к Интернету? Я даже не смею говорить о тех, кто работает за брандмауэром учреждения/компании/организации. Большинство из этих компаний «управляются» бессмысленными сетевыми администраторами, которые разрешают ЛЮБОЙ программе, за исключением Internet Explorer (даже Firefox) от доступа к Интернету. Я был там. Я сделал это. Поверьте мне, это НОЧНАЯ! В других, чтобы иметь программу, связанную с Интернетом, вы должны пойти в администрацию, заполнить множество форм запроса и, наконец, MAYBE, MAYBE, они позволят программе получить доступ к Интернету. Возможно, через прокси.

Во всяком случае, очень легко сделать надежную основанную на ключах защиту для вашей программы: отправить ключ клиенту, но не отправлять классический ключ, а аппаратный ключ. Таким образом, ключ будет работать только в той системе SPECIFIC. Вы даже можете опубликовать объявление на своем веб-сайте: «Пожалуйста, не стесняйтесь публиковать этот ключ. Мне не наплевать» :)

Просто не полагайтесь на один идентификатор оборудования (например, CPU), но и на всех из них. Разрешить пользователю изменять/обновлять все свои аппаратные компоненты, кроме одного. Поэтому, пока они не изменят весь компьютер, лицензия будет работать. Поскольку новый компьютер приобретается каждые 3,4 года (я нашел статистику в Интернете), вы должны разрешить пользователю запрашивать 3 новых ключа (повторная активация лицензии). Вероятно, вы выпустите новую версию до истечения промежутка в 3,4 года. Таким образом, клиентам все равно придется покупать обновление и получить новый ключ.

+1

Это ответ, который я искал. Fella вы знаете, что я полностью согласен с вами, но дело в том, что мое приложение предназначено для очень конкретных людей, и они должны быть в сети, потому что программа должна делать HTTP-запросы, даже если я не стану онлайн-регистрацией, они должны были бы разрешить HTTP-запросы из моего приложения, и я не только полагаюсь на это, я просто использую в качестве дополнительной защиты. Кстати, можете ли вы опубликовать рабочий пример этой DLL на C++? Я привел пример здесь, но не работал, я использую VS 2008, и если вы хотите загрузить полную DLL и gimme, я был бы очень рад, ха-ха, спасибо! – Grego

+0

oh yea, и я использую довольно безопасную систему с открытым ключом и логином входа в личный ключ каждый раз, когда запускается программа, но все же мне нужна эта проблема с процессором, пользователи, которые будут использовать мое программное обеспечение, будут иметь машину, я скажу им, что они работают , так что это не для обычных пользователей. вот почему это нормально, чтобы быть немного сложным. – Grego

+0

Обратите внимание, что идентификатор CPU, который выдает «Hardware ID Extractor», НЕ НИЧЕГО, чем выход RAW инструкции CPUID (в основном первый блок кода в OP), поэтому он НЕ УНИКАЛЬНЫЙ для процессоров той же модели! Кроме того, для получения фактических серийных номеров жестких дисков, а не только идентификатора тома (который легко может быть изменен с помощью инструментов разделов), «Hardware ID Extractor» должен запускаться как администратор (повышен в случае Vista + UAC), этот что делает его совершенно бесполезным для программ, где вы не можете делать это каждый запуск (большинство из них). – rajkosto