トップ回答者
プログラムから無線LANプロファイルを設定する方法

質問
-
お世話になります。
現在、プログラムから無線LANプロファイルを設定しようとしています。開発環境:Win7 pro SP1(64bit), Visual Studio2010 (C++)
まずは、WlanGetProfile()で無線プロファイルを変数に取得して、取得した無線プロファイルをそのままWlanSetProfile()に渡してセットするということを行っています。
WlanGetProfile()で取得した無線プロファイルのxml情報を出力すると以下のようになりました。ここで気になったのが、<keyMaterial>の部分で以下のように、長い文字列が出力されていました(実際は数百文字ほどあります)。
私は、この部分には、netsh wlan show profile name="name" key=clear コマンドで出力される「主要なコンテンツ」の項目のパスワード(無線LANに接続する際に入力した10桁のパスワード)が出力されると思っていました。しかし、文字列の量が全く異なっており、どういうことかわからない状態です。私の認識は間違っていますでしょうか。
また、プロファイルからパスワードを設定したい場合、どのように設定すればいいのでしょうか。さらに、別の方法でプログラムからパスワードを設定する方法などあれば教えていただきたいです。何か情報をお持ちの方、ご教授いただけないでしょうか。よろしくお願いいたします。
<?xml version="1.0"?>
-<WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1">
<name>core</name>
-<SSIDConfig>
-<SSID><hex>636F7265</hex>
<name>core</name>
</SSID>
</SSIDConfig>
<connectionType>ESS</connectionType>
<connectionMode>auto</connectionMode>
-<MSM>
-<security>
-<authEncryption><authentication>open</authentication>
<encryption>WEP</encryption>
<useOneX>false</useOneX>
</authEncryption>
-<sharedKey><keyType>networkKey</keyType>
<protected>true</protected>
<keyMaterial>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</keyMaterial>
</sharedKey>
</security>
</MSM>
</WLANProfile>
回答
-
すみません、確かにありますね。調査できていませんでした。
このフラグを指定しつつ、かつ wlan_secure_get_plaintext_key と WLAN_READ_ACCESS の permission があればできるそうですので、管理者権限であればできそうですね。(未実験です)WlanSetProfile で与える XML については このあたり が参考になると思いますが、unencrypted key(暗号化されていないキー)が必要です。
plantext_key で得られる条件を満たすか、プログラム上でユーザーに入力してもらうか、プログラムでキーの定義を用意しておくあたりになると思います。
すべての返信
-
少し疑問を感じるのですが、プログラムは「すでに設定されている暗号キー」を知らないのに、「別のアクセスポイントにそれを使うように設定させる」ということを目指しているのでしょうか?
もし、それが安易に作れるのであれば、ユーザーにそのプログラムを渡すことで「アクセスポイントの暗号キー」を盗み出すことができます。
セキュリティ上の欠陥となると思うので、方法は存在しないかもしれないことも考慮いただきたいです。
(できるかどうかは未調査。少し待ってみても情報が得られず、何とか白黒つけたいのであればサポートへ)
- 編集済み AzuleanMVP, Moderator 2015年4月14日 13:58
-
少し疑問を感じるのですが、プログラムは「すでに設定されている暗号キー」を知らないのに、「別のアクセスポイントにそれを使うように設定させる」ということを目指しているのでしょうか?
もし、それが安易に作れるのであれば、ユーザーにそのプログラムを渡すことで「アクセスポイントの暗号キー」を盗み出すことができます。
セキュリティ上の欠陥となると思うので、方法は存在しないかもしれないことも考慮いただきたいです。
(できるかどうかは未調査。少し待ってみても情報が得られず、何とか白黒つけたいのであればサポートへ)
Azulean様
返信ありがとうございます。
一度アクセスポイントに接続したことがあればPC側にはプロファイルの設定が保存されているので、WlanGetProfile()でパスワードの確認ができるのかと思ったのですが、間違いかもしれません。
同一のアクセスポイントに複数のPCでアクセスする運用で、それぞれのPCで設定する際にプログラムで同じプロファイルを簡単に設定する方法はないのかと調べています。
プログラム側で設定されているパスワードを取得して、そのパスワードをプロファイルで設定できるといいのですが。プログラムからパスワードを取得できないのであれば、あらかじめパスワードを控えておいてその値をプロファイルで設定したいと考えています。
疑問としては、
①無線アクセスポイントに接続する際に入力するパスワード(私の場合は10桁)は、プログラムでどう設定すればいいのか。WlanSetProfile()で可能?
②xmlファイルの<keyMaterial>と①のパスワードは全く違うものなのか、それともなにか関係があるのか。
この部分が理解できていません。知識不足で申し訳ありませんが、何かわかるようでしたらよろしくお願いいたします。
-
すみません、確かにありますね。調査できていませんでした。
このフラグを指定しつつ、かつ wlan_secure_get_plaintext_key と WLAN_READ_ACCESS の permission があればできるそうですので、管理者権限であればできそうですね。(未実験です)WlanSetProfile で与える XML については このあたり が参考になると思いますが、unencrypted key(暗号化されていないキー)が必要です。
plantext_key で得られる条件を満たすか、プログラム上でユーザーに入力してもらうか、プログラムでキーの定義を用意しておくあたりになると思います。