[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2005/11/24(Thu) 16:50
投稿者名:T2
Eメール:
URL :
タイトル:
実行ファイルの内容を読み取れてしまう
お世話になります。T2と申します。

実行ファイルを作成したのですが、その実行ファイルをメモ帳などで開いた時に、
変数に代入するために記述した内容が半角スペースで区切られた形で
格納されていることがわかりました。

例: dim cstr_SAMPLE(255) as string
      cstr_SAMPLE(0) = "Password_000"
      cstr_SAMPLE(1) = "Password_001"
      ・・・
      cstr_SAMPLE(255) = "Password_255"

   実行ファイル作成後メモ帳を開くと「P a s s ・・・」といった形で、
   上記のようにセットした文字列がすべて列記されていました

特定のIPアドレスに対して、決められたパスワードを返すといった処理をしている箇所で
このパスワードを利用者には見られないようにしたいのですが、
実行ファイルを作成する際に、ソースの内容を読み取られないように
してコンパイルする方法をご存知ありませんでしょうか?

試してみた方法
 1.表示されないListboxにパスワード一覧を記述して、ListIndexを使用して
   上記の配列の代わりに使用する。

  => ListBoxのListの内容がそのまま実行ファイル内に記述されていた。

投稿時間:2005/11/24(Thu) 17:25
投稿者名: 
Eメール:
URL :
タイトル:
Re: 実行ファイルの内容を読み取れてしまう
MD5などのハッシュ関数を使ってみては?

ex)
Password_000 の代わりに MD5(<ユニークなもの>+<Password_000>)

※万全というわけではありません。

投稿時間:2005/11/24(Thu) 19:46
投稿者名:T2
Eメール:
URL :
タイトル:
Re^2: 実行ファイルの内容を読み取れてしまう
回答ありがとうございます。

ハッシュ関数に関して資料を探して読みふけっていたら
返信遅くなってしまいました。

検討した結果、ハッシュ関数を使用してのソースを暗号化する事が難しいようなので、
魔界の仮面弁士さんの意見を参考にさせていただくことにしました。
 ・VB6では、ハッシュ関数が直接用意されていない。
   => DLL化して公開している方がいらっしゃるようですが
     下記の理由で使用できそうにありません。

 ・実行ファイルは、共有フォルダ上にあり、ログオン時に各端末がそれを実行する。
    =>すべての端末に、ハッシュ関数を利用できるように環境を整えることができない。

ハッシュ関数。いろいろ読んでいたら面白そうで、
なんちゃってな感じでも自作してみたいと思いますが、
いかんせん時間がなく。。。


> MD5などのハッシュ関数を使ってみては?
>
> ex)
> Password_000 の代わりに MD5(<ユニークなもの>+<Password_000>)
>
> ※万全というわけではありません。

投稿時間:2005/11/25(Fri) 10:02
投稿者名:ダンボ
URL :
タイトル:
Re^3: 実行ファイルの内容を読み取れてしまう
解決しているので、強くは突っ込まないですが、

>  ・実行ファイルは、共有フォルダ上にあり、ログオン時に各端末がそれを実行する。
>     =>すべての端末に、ハッシュ関数を利用できるように環境を整えることができない。

「Password_000 の代わりに MD5(<ユニークなもの>+<Password_000>)」の
<ユニークなもの>にその実行端末のIPアドレス(またはそこから計算されるもの)を
使えばいいと思いますよ。

投稿時間:2005/11/24(Thu) 17:33
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: 実行ファイルの内容を読み取れてしまう
> 実行ファイルを作成したのですが、その実行ファイルをメモ帳などで開いた時に、
> 変数に代入するために記述した内容が半角スペースで区切られた形で
半角スペースというか、null文字ですね。
VB内の文字コードは Unicode であり、全角/半角いずれも 2バイトで表現されています。


> 実行ファイルを作成する際に、ソースの内容を読み取られないように
> してコンパイルする方法をご存知ありませんでしょうか?
厳密には無理でしょう。コンピュータがexeの内容を読み取れる以上、
絶対に読み取れないような処理を記述する事はできません。


ですが、簡単には読み取られないようにするという程度の意図であれば、
文字列のパスワードを埋め込まないようにすれば大丈夫でしょう。

たとえば、
 Public Function Hoge(ByVal X As Long) As Long
  Hoge = ((X / 1234) + (X Mod 8765)) * 90
 End Function
のような関数を用意しておき、

 Dim CODE As Long   'この場合は 1727 なら正解
 CODE = 4桁の暗号コード
 If Hoge(CODE) = 155556 Then
  MsgBox "OK!"
 Else
  MsgBox "NG..."
 End If

のような処理仕様にしておけば、「パスワード文字列」が埋め込まれていないので、
メモ帳で開いた程度では、簡単には判読できないでしょう。
(実際には、4桁程度では総当りで解かれてしまうので、もう少し手を加える必要がありますが…)

あるいは、公開鍵暗号を用いる方法などもありますね。

投稿時間:2005/11/24(Thu) 20:17
投稿者名:T2
Eメール:
URL :
タイトル:
Re^2: ありがとうございました。
回答ありがとうございます。

> 文字列のパスワードを埋め込まないようにすれば大丈夫でしょう。

なるほど、確かに・・・。ソースを暗号化できないかとか
ずれたことばかり考えて、気がつきませんでした。

パスワードの文字列が直接記入されないよう、アスキーコードで記載した文字列を
Chr関数を使用して文字に変換しなおしてパスワードとして利用する方法で
直接ユーザに参照されないようにしてみたいと思います。

予定:
    Rem アスキーコードを"&"で区切る(Split関数で区切る)
    Rem コードを直接読み取られる可能性があるので[コード + 87]して
  Rem 直接参照されることを防ぐ。

  Dim cstr_SAMPLE(255) as string
  cstr_SAMPLE(0) = "&184&185&186"   'abc  
  cstr_SAMPLE(1) = ""&187&188&189"   'def
      ・・・
  cstr_SAMPLE(255) = ""&152&185&154" 'AbC


このような感じで、直接参照されないよう工夫して見ます。
お二方とも、本当にありがとうございました。