15

ソフトウェアのライセンスを取得するためのキーとして使用するために、 HDD のシリアル番号を取得する必要があります。この URL でdiskid32コードを使用しました: http://www.winsim.com/diskid32/diskid32.html IOCTL_STORAGE_QUERY_PROPERTYの IO 制御コードでDeviceIoControl Win32 API を 使用しました。

出来た。しかし、HDD自体に印刷されている実際のシリアル番号を再確認すると、番号の2バイトごとに反転していることがわかりました.

簡単な解決策は、単にバイトを元に戻すことです。Windows XP、Vista、および 7 では機能しましたが、Windows 8 では反転する必要はありません。

Windows XP、Vista、および 7 でバイトが反転した正確な理由と、Windows 8 で反転しない理由を知りたいです。次の Windows はどうですか?

マイナーな変更を加えたコードの一部:

  int drive = 0;
  HANDLE hPhysicalDriveIOCTL = 0;
  char driveName [256];
  sprintf (driveName, "\\\\.\\PhysicalDrive%d", drive);
  //  Windows NT, Windows 2000, Windows XP - admin rights not required
  hPhysicalDriveIOCTL = CreateFile (driveName, 0,
                           FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
                           OPEN_EXISTING, 0, NULL);
  if (hPhysicalDriveIOCTL != INVALID_HANDLE_VALUE)
  {
     _STORAGE_PROPERTY_QUERY query;
     DWORD cbBytesReturned = 0;
     char buffer [10000];

     memset ((void *) & query, 0, sizeof (query));
     query.PropertyId = StorageDeviceProperty;
     query.QueryType = PropertyStandardQuery;

     memset (buffer, 0, sizeof (buffer));

     if ( DeviceIoControl (hPhysicalDriveIOCTL, IOCTL_STORAGE_QUERY_PROPERTY,
               & query,
               sizeof (query),
               & buffer,
               sizeof (buffer),
               & cbBytesReturned, NULL) )
     {
         _STORAGE_DEVICE_DESCRIPTOR * descrip = (_STORAGE_DEVICE_DESCRIPTOR *) & buffer;
         char serialNumber [1000];
         char modelNumber [1000];
         char vendorId [1000];
         char productRevision [1000];

         flipAndCodeBytes (buffer,
                           descrip -> SerialNumberOffset,
                           1, serialNumber );

        ...
     }
4

5 に答える 5

3

私はソフトウェア ライセンスで同じアプローチ (および同じコード) を使用しています。はい、何らかの理由で Wi​​ndows 8 はこのメソッドに対して反転した値を返します。理由はわかりません (そのため、質問に答えることができません)。

私の解決策は、あなたが指摘したものです。値をもう一度反転します。したがって、「flipAndCodeBytes」を呼び出した後、Windows 8 OS であるかどうかをテストし、値を反転できます。

私の場合、現在は機能しています (Windows XP/Vista/7 と Windows 8 で同じ値が得られました)。

幸運を!

于 2013-09-12T00:34:19.300 に答える
1

基本的に、最初から厳密には信頼できないデータに依存しています。ドライブは、コンピューターの使用期間中に変更される可能性があります。正確に正しいシリアル番号を取得することは、製品にとって重要なことではありません。

私が考えることができる 1 つの簡単なハックは、シリアル番号を正規化することです。たとえば、数字を並べ替えることです。これにより、より多くのドライブが似たものになりますが、問題になるとは思えません。

この問題のもう 1 つの見方は、アプリケーションがシリアル番号の変更を準備する必要があるということです。ユーザーは、(何らかの理由で) ライセンスの問題について通知され、生成されたコード (必ずしもシリアル番号自体ではない) をサポート部門に連絡するよう求められる可能性があります。このコードがあれば、サポートは顧客用の新しいライセンスを作成できます。

于 2013-02-15T02:22:42.517 に答える
0

API を使用して Windows のバージョンを確認し、バージョンが十分に高い場合は if() ブランチをコードに追加する必要があるようです

私の開発者は、この方法で別の問題を発見しました - その種の IOCtl コードは、プログラムが Win7\Win8+ で管理者権限で実行されていることに依存しています。私たちのソフトウェアの原因として、それはシステム権限で実行されるサービスであり、ユーザー権限で厳密に実行されるクライアント ソフトウェアです。

于 2014-09-19T21:55:28.797 に答える
0

ライセンス チェックの目的では、特に気にする必要はありません。知っておく必要があるのは、一部の構成では反転が発生し、一部の構成では反転せず、ライセンスの有効期間中に変更される可能性があるということだけです。

したがって、両方のバリアントを受け入れます。

string serial = get_serial();
if (license_check(serial)) {
    licensed = true;
    return;
}
serial = swap_bytes(serial);
if (license_check(serial)) {
    licensed = true;
    return;
}

(レイモンドがコメントでこれを提案したのを見ます)

壊れやすいOSのチェックも、ユーザーがライセンスを申請したときに正しく反転しなかったかどうかの心配もありません。ただ幸せなユーザー。

于 2015-02-16T17:37:28.110 に答える