特定のHDDでしかっ起動できないようにするには?


Looker  2008-10-12 12:03:28  No: 140630  IP: 192.*.*.*

こんにちは
今HDDシリアルナンバーを使ってのTool認証機能を作っています
現時点ではHDDシリアルナンバーは取得することが出来たんですが
問題のToolで認証する方法がわかりません
簡易的に説明すると
HDDシリアルをおくってもらってその番号でToolが起動するかしないか
HDDシリアルがあっているなら起動
間違っているならメッセージでもだして、「認証できません」でTool終了
というような動きが望ましいです
どなたかご教授していただけませんか?

編集 削除
Looker  2008-10-12 12:43:52  No: 140631  IP: 192.*.*.*

追記です
HDDシリアルをさらにMD5ハッシュにしたいので、もしよければそこもお願いします。

編集 削除
魔界の仮面弁士  2008-10-13 04:03:06  No: 140632  IP: 192.*.*.*

> 現時点ではHDDシリアルナンバーは取得することが出来たんですが
どのようにして取得しているのでしょうか? その取得方法に興味があります。

自分も、認証用に HDD シリアルを取得しようとしたことがあったのですが、
適当なサンプルが見当たらず、かといって DFP_RECEIVE_DRIVE_DATA 等から
書き起こすのも手間だったので、そのまま調査を放置した経験があるので。(^^;

# (HDDシリアルではなく)ボリュームシリアルなら簡単に取得できますが、
# 一意性が無いので、ボリュームシリアルだと認証用には向かないんですよね…。


> HDDシリアルをおくってもらってその番号でToolが起動するかしないか
お使いの環境は何でしょうか? VB のバージョン等によって、回答は異なるかと。

また、ユーザーから HDDシリアルが送られてきた後、それをどのようにして
Tool 側に、それが「登録済みのシリアルである」と認識させたいのでしょうか?
その仕様が決まらないうちは、VBに書き起こす事はできないかと思います。


それとも、その処理ロジック自体を思いつかない、という事でしょうか。
だとすると例えば…。

《案1 : 認証用プログラムを個別に作成》

(1) HDDシリアルを取得し、ハッシュ値を得るだけのツールを作成する。
(2) それを実行してもらい、得られたハッシュ値をメールや電話で受け取る。
(3) ユーザーから受け取ったハッシュ値を元に、その HDD 用に
      If [実行時に得たHDDシリアル(のハッシュ値)] = [メール等で得たハッシュ値] Then
    のようなコードを組み込んだ認証用 Tool を作成。


《案2 : 認証用サーバを立てる》

(1) 認証用の Web サービスを作成しておく。
(2) その Web サーバ上に、送ってもらったシリアルのハッシュ値を登録しておく。
(3) Tool は、起動時に HDD シリアルを取得し、それを Web サーバに
    送出して、それが「登録済み」であるかどうかを確認する仕様にする。


> MD5ハッシュにしたいので
VB6 / VBScript / VB.NET など、開発環境によってコードは異なりますが、
たとえばこんな感じで。

《案1 : ハッシュ関数を直接実装する》
→ http://www.geocities.co.jp/SiliconValley/4334/unibon/asp/md5.html

《案2 : CryptAPI を用いる》
→ CryptCreateHash 関数に、CALG_MD5 定数(&H8003)を指定して得る。

《案3 : BASP21 を用いる》
→ BASP21.DLL の MD5 メソッドを使って得る。

《案4 : .NET の System.Security.Cryptography 名前空間を用いる》
→ MD5 クラスの ComputeHash メソッドを使って得る。

編集 削除
Looker  2008-10-13 19:15:25  No: 140633  IP: 192.*.*.*

回答ありがとうございます
使用しているのはVB6です
今考えている案は
《案1 : 認証用プログラムを個別に作成》

(1) HDDシリアルを取得し、ハッシュ値を得るだけのツールを作成する。
(2) それを実行してもらい、得られたハッシュ値をメールや電話で受け取る。
(3) ユーザーから受け取ったハッシュ値を元に、その HDD 用に
If [実行時に得たHDDシリアル(のハッシュ値)] = [メール等で得たハッシュ] Then
のようなコードを組み込んだ認証用 Tool を作成。

ちょうどこのようなものです
HDDシリアルの取得方法は適当に検索して出てきたものを直接使用しています
無知なもので、HDDシリアルではなくボリュームかもしれません;;
ココの掲示板にあったものですが(コピペです)
Dim fs  As Object
Dim drv As Object
Set fs = CreateObject("Scripting.FileSystemObject")                                                   'ファイルシステムオブジェクト作成
For Each drv In fs.Drives
'ハードディスクシリアル番号一覧を作成
If drv.DriveType = 2 Then
Text1.Text = Text1.Text & drv.driveletter & ": " & Format$(drv.SerialNumber) & vbCrLf
End If
Next
Set fs = Nothing
というものです

よろしくおねがいします

編集 削除
魔界の仮面弁士  2008-10-14 14:34:46  No: 140634  IP: 192.*.*.*

> 《案1 : 認証用プログラムを個別に作成》
であれば、特にわからない点は無いですよね。

ユーザーからシリアル文字列を受け取ったら、そのドライブ用に
  If [実行時に得たHDDシリアル] = [メール等で得たシリアル] Then
というコードを含んだ EXE を作成するだけですので。


> HDDシリアルではなくボリュームかもしれません;;

これはボリューム シリアルの方ですね。HDD シリアルは HDD(物理ディスク)単位に
割り当てられているのですが、こちらはドライブ(ボリューム)単位で割り当てられます。


HDD シリアル は、その物理ディスクの製造業者によって割り当てられる番号で、
たとえば WESTERN DIGITAL 社だと、"WD-WM3493798728" などといった値となります。
確認するだけなら、フリーソフトの CrystalDiskInfo などを使うと良いでしょう。
プログラムから取得する場合、DeviceIoControl API で DFP_RECEIVE_DRIVE_DATA を指定すれば
取れるようです。なお、環境によっては WMI 経由で取得できる可能性もあるようですが、
こちらの方法は、対応していない環境も多いかと思います。
  Dim o As Object
  For Each o In GetObject("winmgmts:").InstancesOf("Win32_PhysicalMedia")
    Debug.Print o.Tag, o.SerialNumber
  Next


一方、ボリューム シリアル はフォーマット等を行うごとに割り当てられる番号です。
これは、ディスクイメージを丸ごとコピーするなどすると、同じ番号が複製される
可能性があります。たとえばメーカー製PC(NEC,富士通等)に搭載された HDD の場合、
同一機種/兄弟機種/販売時期の近いPCでは、異なる HDD から 同じ番号が返される事も
さして珍しくありません。

このためボリューム シリアルは、機器判定による認証用途には不向きです。


--- 以下、無意味な蛇足情報 ---
ボリュームシリアルとは、生成日時を基にした 32bit の値であり、
通常は 0000-0000形式で4桁-4桁の16進数として表示されます。

たとえば『1995年12月26日 21時55分41秒94』に生成された場合、
『3578-1d02』という値になります。換算式は下記のとおり。
  12月26日  →  16進  →  0c,1a
  41秒94    →  16進  →  29,5e
  21時55分  →  16進  →  15,37
  1995年    →  16進  →  07cb

  0c1a + 295e  =  3578
  1537 + 07cb  =  1d02

編集 削除
Looker  2008-10-14 15:14:48  No: 140635  IP: 192.*.*.*

やはりHDDボリュームでしたか。。。
わからない点はあるんですが

(3) ユーザーから受け取ったハッシュ値を元に、その HDD 用に
If [実行時に得たHDDシリアル(のハッシュ値)] = [メール等で得たハッシュ] Then
のようなコードを組み込んだ認証用 Tool を作成。

HDDシリアル値が違った場合にMsgBoxをだしたいんですが

編集 削除
魔界の仮面弁士  2008-10-14 16:33:05  No: 140636  IP: 192.*.*.*

> HDDシリアル値が違った場合にMsgBoxをだしたいんですが

MsgBox をだしたいのは分かりましたが…何に困っているのかも書いてもらわないと
回答のしようがありません。(^^;

イメージコードで書けば、このようになるでしょう。特に難しい所はないですよね。


If [実行時に得たHDDシリアル] = [メール等で得たシリアル値] Then
  'ここに、通常処理を記述
Else
  'メッセージ表示
  MsgBox "シリアルが違いますよ。", vbInformation
End If


もし MD5 ハッシュが必要なら、先の回答を参考にして組み込んでみてください。

編集 削除
もげ  2008-10-14 16:38:00  No: 140637  IP: 192.*.*.*

>> 現時点ではHDDシリアルナンバーは取得することが出来たんですが
>どのようにして取得しているのでしょうか? その取得方法に興味があります。

興味への情報だけですが、
こんなのありました。
http://vbnet.mvps.org/index.html?code/disk/smartide.htm

編集 削除
Looker  2008-10-14 21:51:20  No: 140638  IP: 192.*.*.*

わからない場所の記述をわすれていました><!!
すいませんm(_ _)m!
(3) ユーザーから受け取ったハッシュ値を元に、その HDD 用に
If [実行時に得たHDDシリアル(のハッシュ値)] = [メール等で得たハッシュ] Then
のようなコードを組み込んだ認証用 Tool を作成

ですが
実行時に得たHDDシリアル(のハッシュ値)とメール等で得たハッシュ
とはどういうことでしょうか?
メールなどで得たとは、送ってもらったHDDシリアルということでしょうか?
では実行時に得たハッシュ値とは? 
両方とも同じということですか?


If [実行時に得たHDDシリアル] = [メール等で得たシリアル値] Then
  'ここに、通常処理を記述
Else
  'メッセージ表示
  MsgBox "シリアルが違いますよ。", vbInformation
End If
この文を入れる場所ですがForm.Loadなどでいいのでしょうか?

何でもかんでも聞いてばかりですいません><

>もげさん
これはHDDシリアルみたいですね!
情報ありがとうございます。

編集 削除
魔界の仮面弁士  2008-10-15 12:01:49  No: 140639  IP: 192.*.*.*

> メールなどで得たとは、送ってもらったHDDシリアルということでしょうか?
そうです。ゆえに、これは固定値となります。

> では実行時に得たハッシュ値とは? 
ハッシュ関数にかけるかどうかは任意ですが、[実行時に得たシリアル]というのは、
Tool が起動時に、ボリュームシリアル(またはHDDシリアル)を取得するという事です。
こちらは、実行する PC によって変動する値となります。

> 両方とも同じということですか?
同じ値であれば認証成功です。異なっていれば MsgBox で警告します。


> Form.Loadなどでいいのでしょうか?
Sub Main の方が良いでしょうね。

編集 削除
Looker  2008-10-15 13:51:33  No: 140640  IP: 192.*.*.*

If drv.DriveType = [メール等で得たシリアル値] Then
  'ここに、通常処理を記述
Else
  'メッセージ表示
  MsgBox "シリアルが違いますよ。", vbInformation
End If
のような感じでよろしいでしょうか?

編集 削除
魔界の仮面弁士  2008-10-15 14:18:09  No: 140641  IP: 192.*.*.*

それでは駄目でしょうね。
ボリューム シリアルを返すのは、DriveType プロパティではありませんし。

編集 削除
とおりすがり  2008-10-15 23:15:57  No: 140642  IP: 192.*.*.*

>HDD シリアル は、その物理ディスクの製造業者によって割り当てられる番号で、
>プログラムから取得する場合、DeviceIoControl API で DFP_RECEIVE_DRIVE_DATA を指定すれば
取れるようです。

http://www.dreamincode.net/code/snippet429.htm

この辺ですかね。

編集 削除
Looker  2008-10-16 12:54:43  No: 140643  IP: 192.*.*.*

いろいろ調べてIPアドレスの認証にする事にしました
TextBoxにIPアドレス表示をすれば、出来るんですが
.NETではIP取得は多くのサンプルがあったんですが
VB6で見つかったのは2つで
片方は環境が悪いのかできず
もうかたほうはIP.basのモジュールです
しかし、これをつかってTextBoxに入れる方法はどのようにすれば
GetIpAddressでは出来ないのでしょうか?もっと複雑なものなのでしょうか
VBではこういうものは扱いズラいそうで、大変です;;

編集 削除
Looker  2008-10-16 12:56:07  No: 140644  IP: 192.*.*.*

追記
VB6でのIP.basはこちらです
http://aircross.hp.infoseek.co.jp/vb_ip.htm

編集 削除
もげ  2008-10-16 13:18:11  No: 140645  IP: 192.*.*.*

もうちょっとよく調べてみれば
http://aircross.hp.infoseek.co.jp/vb_pa.htm
のほうがこの場合の用途に適しているかもしれないですけど。

編集 削除
Looker  2008-10-16 14:17:45  No: 140646  IP: 192.*.*.*

>もうちょっとよく調べてみれば
>http://aircross.hp.infoseek.co.jp/vb_pa.htm
>のほうがこの場合の用途に適しているかもしれないですけど。
たしかにMACアドレスの方がいいとは思うんですが、、
MACアドレスは難しいと聞いたので。
実際のところどうなんでしょう。

編集 削除