• ベストアンサー

exeファイルのセキュリティ。

社内用のメンテナンスプログラムを制作したのですが、同じプログラムで他社の製品にも使えてしまいます。たいした大きさではないので、フロッピーで十分なんですが社外に流失してしまうとこまってしまいます。 IPアドレスで確認すればいいのですが、登録していないようなものはどうしたらよいのでしょうか? どなたか、教えていただけませんか?

  • 9766
  • お礼率52% (601/1143)

質問者が選んだベストアンサー

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.4

通信認証のサンプルを作成しました。 (正確に言うと、以前に作成したものがあって、それを抜粋しました) プロジェクトは二つ必要で、サーバーとクライアントに分かれています。 それぞれにプロジェクトを作成して、EXEを作成してください。 基本はサーバーのEXEが立ち上がった状態で、クライアントのEXEを起動してください。 この書き込みの下の方に「共通の標準モジュール」を記してますが、[INIT_PORT][SERVER_NAME]の各定数があります。 こちらは環境に合わせて変更をしてください。 もし、一台のマシンで実験をするのであればSERVER_NAMEをご自分のマシン名に変更をしてください。 プログラムが正常に動くと、サーバー、クライントが交互に通信状況をメッセージボックスで知らせます。 これはあくまでサンプルなのでそのようにしてますが、サーバー側にはメッセージボックスの機能を使用しないでください。メッセージボックスが表示されている間は、他のユーザーとの通信ができなくなってしまいます。 (VBでそれを回避する方法があるのですが、動作が不安定になるために書きません) このサンプルでは、互いに文字列を送信しています。 実践では、その文字列をパスワード認証に使用してはいかがでしょうか? 必要なもの Project1.vbp(サーバー用) フォーム Winsock1(インデックスなし) Winsock2(インデックスあり) Project2.vbp(クライアント用) フォーム Winsock1(インデックスなし) Winsockはメニューバーより [プロジェクト] [コンポーネント] [Microsoft Winsock Control 6.0(かな?)] を選択したらツールボックスにWinsockコントロールが現れます。 それをサーバー側に二つ、クライアント側に一つ、各フォームに貼り付けます。 サーバー側のWinsock2にはIndexプロパティに'0'ゼロをセットしてください。 その他のWinsockには値を入力しないでください。 あとは下のソースを貼り付けてください。 -----サーバーのフォーム内のソース(ここから)--------- Option Explicit Private Sub Form_Load()   Me.Caption = "SERVER"   'ポートの初期化を行い、受信待ち状態にする   On Error GoTo PGMERR      With Me.Winsock1     .LocalPort = INIT_PORT     .Listen   End With      Exit Sub    PGMERR:   Call MsgBox("通信ポートに以上が見られました、終了いたします。", vbSystemModal, Me.Caption)   End End Sub 'フォームが閉じる前に、Winsockを全て閉じる Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)   Dim wkSock As Winsock      With Me     .Winsock1.Close     For Each wkSock In .Winsock2       wkSock.Close     Next wkSock   End With End Sub '特定のクライアントのソケットを閉じたとき Private Sub Winsock2_Close(Index As Integer)   With Me     .Winsock2(Index).Close     Unload .Winsock2(Index)   End With End Sub 'メッセージデータの受信 Private Sub Winsock2_DataArrival(Index As Integer, ByVal bytesTotal As Long)   Dim strRecvData As String    '送られてきたデータ   Dim lngRecvCnt As Long     '送られてきたデータライン数   Dim valRecvAry As Variant   '送られてきたデータをライン数のに分解し配列にして記憶      Dim wkVal    As Variant   '受信したメッセージ1文を、IDとメッセージに分解して配列で記憶   Dim wkSType   As SOCKMSG_ID  '分解した1文のID   Dim wkStr    As String    '分解した1文のメッセージ      Dim i      As Long     'ループカウンタ      Dim wkMsg    As String    '送信するメッセージ      With Me        'メッセージを受け取る     .Winsock2(Index).GetData strRecvData          '受信メッセージを、メッセージ分の配列にする     valRecvAry = Split(strRecvData, vbCrLf)          'メッセージ数を取得     lngRecvCnt = UBound(valRecvAry)          '受信メッセージの分だけ、一文ずつ処理を行う     For i = 0 To lngRecvCnt - 1            '一文をIDとメッセージに分解       wkVal = Split(valRecvAry(i), vbNullChar)       wkSType = wkVal(0)       wkStr = wkVal(1)              Select Case wkSType         Case SOCKMSG_ID.ID1           wkMsg = "山川豊"           Call MsgBox("ID1で[" & wkStr & "]を受信しました" & vbNewLine & vbNewLine _             & "ID1で[" & wkMsg & "]を送信します", vbSystemModal, Me.Caption)           Call SendMsg(.Winsock2(Index), ID1, wkMsg)                    Case SOCKMSG_ID.ID2           wkMsg = "起動してもいいよ"           Call MsgBox("ID2で[" & wkStr & "]を受信しました" & vbNewLine & vbNewLine _             & "ID2で[" & wkMsg & "]を送信します", vbSystemModal, Me.Caption)           Call SendMsg(.Winsock2(Index), ID2, wkMsg)              End Select     Next i   End With PGMEND: End Sub '接続要求がきたら、新たなWinsockを用意する Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)   Dim lngNewIndex As Integer      lngNewIndex = 0   On Error Resume Next      With Me     '新たな受信装置を1つ追加する     Do       Err.Clear       lngNewIndex = lngNewIndex + 1       Load .Winsock2(lngNewIndex)     Loop Until Err.Number = 0&     On Error GoTo 0          .Winsock2(lngNewIndex).Accept requestID   End With End Sub -----サーバーのフォーム内のソース(ここまで)--------- -----クライアントのフォーム内のソース(ここから)------- Option Explicit 'フォームロード時に接続を試みる Private Sub Form_Load()   Me.Caption = "CLIANT"   With Me.Winsock1     .RemoteHost = SERVER_NAME     .RemotePort = INIT_PORT     .LocalPort = 0     .Connect   End With End Sub 'サーバーが落ちた Private Sub Winsock1_Close()   Call MsgBox("サーバーが落ちたー", vbSystemModal, Me.Caption)   Unload Me End Sub 'サーバーと接続できた Private Sub Winsock1_Connect()   Dim wkMsg  As String      wkMsg = "岸部四郎"      Call MsgBox("接続できた" & vbNewLine & vbNewLine _       & "ID1で[" & wkMsg & "]を送信します", vbSystemModal, Me.Caption)   Call SendMsg(Me.Winsock1, ID1, wkMsg) End Sub 'サーバーと接続できなかった Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)   Call MsgBox("接続できなかった", vbSystemModal, Me.Caption)   Unload Me End Sub 'メッセージデータの受信 Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)   Dim strRecvData As String    '送られてきたデータ   Dim lngRecvCnt As Long     '送られてきたデータライン数   Dim valRecvAry As Variant   '送られてきたデータをライン数のに分解し配列にして記憶      Dim wkVal    As Variant   '受信したメッセージ1文を、IDとメッセージに分解して配列で記憶   Dim wkSType   As SOCKMSG_ID  '分解した1文のID   Dim wkStr    As String    '分解した1文のメッセージ      Dim i      As Long     'ループカウンタ      Dim wkMsg    As String    '送信するメッセージ      With Me        'メッセージを受け取る     .Winsock1.GetData strRecvData          '受信メッセージを、メッセージ分の配列にする     valRecvAry = Split(strRecvData, vbCrLf)          'メッセージ数を取得     lngRecvCnt = UBound(valRecvAry)          '受信メッセージの分だけ、一文ずつ処理を行う     For i = 0 To lngRecvCnt - 1            '一文をIDとメッセージに分解       wkVal = Split(valRecvAry(i), vbNullChar)       wkSType = wkVal(0)       wkStr = wkVal(1)              Select Case wkSType         Case SOCKMSG_ID.ID1           wkMsg = "鳥羽一郎"           Call MsgBox("ID1で[" & wkStr & "]を受信しました" & vbNewLine & vbNewLine _             & "ID2で[" & wkMsg & "]を送信します", vbSystemModal, Me.Caption)           Call SendMsg(.Winsock1, ID2, wkMsg)                    Case SOCKMSG_ID.ID2           Call MsgBox("ID2で[" & wkStr & "]を受信しました" & vbNewLine & vbNewLine _             & "通信を終了します", vbSystemModal, Me.Caption)                      '''''ここに通信が正常にできたことを示すフラグを立てておく           Unload Me       End Select     Next i   End With PGMEND: End Sub -----クライアントのフォーム内のソース(ここまで)------- サーバー・クライアントのそれぞれに共通の標準モジュールとして、以下のソースを追加してください。 -----共通の標準モジュール(ここから)------- Option Explicit Public Enum SOCKMSG_ID   ID1 = 1   ID2 = 2   ID3 = 3 End Enum Public Const INIT_PORT As Long = 8000 '←このPORTは使用される確立が高いので、適当な値に変更したほうがいいかも? Public Const SERVER_NAME As String = "PC_MACHINE_NAME" '←サーバー用のEXEのをおくマシン名 Public Sub SendMsg(inSock As Winsock, inSendType As SOCKMSG_ID, inSendMsg As String)   Dim wkStr  As String      With inSock     '通信が可能なときに通信する     If (.State = (sckConnected)) Then       '通信の書式は       ' 1.通信を送るときのID(SOCKMSG_IDを自分で作成、オリジナルの番号を振る)       ' 2.vbNullChar(IDとメッセージとの区切り文字)       ' 3.メッセージ(任意の文字列)       ' 4.vbCrLf(文末を示す)       wkStr = inSendType & vbNullChar & inSendMsg & vbCrLf              'メッセージを送る       .SendData wkStr     End If   End With End Sub -----共通の標準モジュール(ここまで)-------

9766
質問者

お礼

そう簡単に作れるものではありませんよね。 本当にありがとうございます。 winsockは使ったことありますので、 サンプルから発展させられればと思います。 助かります。

その他の回答 (3)

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.3

サンプルを作ってみようと思うのですが・・・ 機能1.ドメイン 「ドメイン」という意味はわかりますか? まずこちらから「ネットワークにドメインサーバーがあるかないか」という質問をこしたいのですが、、、 会社にはサーバーがありますよね? もし意味がわからなかったら、会社のサーバー管理者に 「うちのネットワークにはドメインサーバーがあるの?」と聴いてみてください。 ドメインサーバーがないのであれば、この方法は無理です。 機能2.通信 ファイルサーバーでも何でもいいので、一台のマシンが通信の受信待ち状態で待機するEXEを起動する。 それで今回問題の社外に持ち出されたら困るEXEを起動する。 このとき通信を行う。 通信ができないのであれば、EXE終了 この二つの機能がメインです。 ですのでドメインを使用してるかどうかを教えてください。 ちなみに仕事の合間にサンプルを作成しておりますので(←いいのか?)、ちーと時間がかかると思います。

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.2

ykkw_2001さんのおっしゃる通り、環境次第でどうにでもなりそうですね。 IPアドレスで確認しきれないということはDHCPを導入してるとか? もしそれなら、ユーザー名が取れるし、ワークグループではなくドメインを使用したら、ネットワークに参加=社内環境とできるのでは? なので、EXEにドメイン固定のロジックを追加してしまえばよいと思います。 さらに認証パスワードを起動時に入力などなど。 サーバーにもうひとつのEXEを用意して、そちらと通信が可能なときのみEXEが起動可能という方法もあります。

9766
質問者

お礼

ありがとうございます。 勉強不足で、”EXEにドメイン固定のロジックを追加してしまえばよいと” 理解できません。 具体例を挙げていただければ幸いです。

  • ykkw_2001
  • ベストアンサー率26% (267/1014)
回答No.1

利用環境次第でどうにでもなりそうですけど・・・ たとえば、IPで確認はダメなように書かれていますが、イントラネットの特定アドレスのマシンで認証するとか。 社内専用アプリケーションの存在をレジストリで確認してから、動作させるとか。 ID+パスワードに時間を絡めて、1回だけ実行できるようにするとか。 はずしてたらゴメンです。

9766
質問者

お礼

どうもありがとうございました。 説明不足ですみません。 >社内専用アプリケーションの存在をレジストリで確認してから・・・ ん~。むずかしいですね。 アプリで社内専用がわかればいいんですけど・・。 パスワードは平気で渡す輩がいて・・。

関連するQ&A

  • 固定IPはセキュリティ対策にならない

    社内ネットワークのお話ですが、セキュリティのために各端末に固定IPアドレスを振るのは意味が余りないということを聞いたことがあるのですが、なぜかよくわかりませんでした。 誰かのIPアドレスとサブネットがわかれば、どのようなIPが端末に割り振られるかわかるから、社外の人が適当にIPアドレスを振ってなりすましができるという意味でしょうか・・・どのような事が考えられるでしょうか?

  • セキュリティ 不正アクセス

    不正アクセス対策について、 教えていただけるとうれしいです(*^^*) ipアドレスについて 確認君http://www.ugtop.com/spill.shtml のアドレス (グローバルIPアドレス?) コンパネからのアドレスhttp://www.akakagemaru.info/port/windows7.html (プライベートIPアドレス?) ★質問 (1)個人パソコンで不正アクセスに使われるアドレスはどちらですか?   (2)対策は?(IPアドレスの危険性と対策がいまいち分かりません) ※以下は対策済みです。   用意したWebサイトにユーザーがアクセスすると外部侵入用プログラムが自動インストールされる インターネットからダウンロードしたファイルに混入されている 侵入用プログラムを添付したE-mailを送付する

  • WEBシステム著作権について

    以前にWEBシステムをシステム会社に制作を依頼しました。         メンテナンスをお願いしてましたが、対処の悪さに他社でメンテナンス及び新規開発をお願いしようと考えています。       その旨を依頼した会社に伝えたところ、プログラムの著作権は弊社にありますので他社で行うのは難しいですね~という返答でした。            毎月高額の管理費を払いまったく何もしていないのにいざ行動に移すと、御社は使用権のみしかありません。勝手にプログラムをさわることはできませんと言われてます。 無視して強引に押し切ろうと思うのですがいかがでしょうか?

  • IPアドレスについて

    IPアドレスについて教えて下さい。 下記のサイトなどで自分のIPアドレスが確認できるみたいなのですが、社内ネットワーク設定のIPアドレスと違うようです。 社内のネットワークIPアドレスとは別物と考えるものなのでしょうか?また、下記のサイトで確認できるIPアドレスは自分のPCの どこで確認できるのでしょうか? 宜しくお願いします。 http://www.iphiroba.jp/index.php http://coolstuff.jp/ipaddress/

  • ウィルスセキュリティの登録について

    一度登録し、アンインストールして他の製品を、使っていましたが、ま た使用したいと思い再インストールをしました。ですが、一度目の登録 時のメールアドレスが判らなくなってしまったため、上記のエラーが出 てしまいとうろくできません。アイコンのウイルスセキュリティの設定 で、確認しようとしましたが、記載されておりません。どうすれば確認 登録できますか?それと一度登録したときに、インターネット接続が出 来なくなりましたが、それについても、おしえてください。

  • 社外秘のExcelデータなどにパスワードなどで社外の人に見られないよう

    社外秘のExcelデータなどにパスワードなどで社外の人に見られないようにする事はできますが さらに社内のPCからでないとそのExcelデータを開けないような仕組みってあるのですか? IPアドレスが一致しないと開けないような仕組みです。 良い方法ありましたら教えて下さい 宜しくお願い致します。

  • IPアドレスを簡単に切替えるソフト Win8.

    会社では社内LANに無線接続、出張先ではスマホのテザリングでインターネットを接続しています。 社内ではIPアドレスを固定で、社外では自動取得で使用しますが、IPアドレス設定を都度切り替えるのが面倒なのでIPアドレス切り替えソフトを探しています。 Windows8.1に対応したソフトが見つかりません。 ご存じの方がいらしたら、ご教授下さい。

  • メール疎通をするには

    社内のクライアントと社外のクライアントの間で、 (【Lan-----Internet-----Lan】環境になります。) メールの疎通が出来ているか自動で確認をしたいと思っております。つまり、自分が送ったインターネット経由のメールが相手に到着している事を、定期的に確認したいのです。メールが社内LANからインターネットなどの外と疎通が取れていることを確認したいのです。だから、gooなどのWebメールを自分で登録して使用してもかまわないと思ってます。仮に、gooなどのWebメールを使うのではなくて、取引先企業のクライアントにソフトを新しくインストールすることなく、自分のクライアントにもソフトをインストールしない場合に、Exchange2003、2000、5.5の機能で、メールが社内LANからインターネットなどの外と疎通が取れていることを確認できるツールがあるのか知りたいのです。なにとぞよろしくお願いします。 ただ、条件として、 1、相手のクライアントにはソフトやプログラム出来るだけインストールしたくありません。 2、できれば、相手のアドレスとして、yahoo.co.jpなどのフリーアドレスを 使用したいと思っております。 (先方に負担は掛けられない状態です) また、Exchange2003で上記のような社外の取引先に対して、確認をする機能があれば、 ご教授をお願いします。 よろしくお願いします。

  • PC名取得

    ド素人ながら会社のシステム部門を一人で切り盛りしています。 このたび、社外にレンタルしているサーバーに社内からのアクセス専用のBBSを立てました。 アクセスはIPアドレスで制限しています。 社内で使うものなので、匿名性を無くしたいと考えています。 現在は投稿者のIPアドレスしかわからないため、投稿者を特定出来ません。(当然全員同じアドレスなので・・・) IPアドレスではなく、コンピュータ名を取得することは出来ないのでしょうか。 それが無理ならば、個人を特定するのにいい方法はありませんか?

    • ベストアンサー
    • Perl
  • オンラインストレージのお勧めは?

    以下の条件で、オンラインストレージを探しています。 ・保守ができないので、メンテナンスをしてくれること ・社外秘の資料を載せたいので、セキュリティがしっかりしてること ・予算は月額で10,000円くらい ・容量は、とりあえず2Gくらい。追加可能であること。 ・アクセス制限が必須  ・社内からなら、無条件で読込のみのアクセス可   (IPで、いくつからいくつまでと制限できるとうれしい)   (200人くらいいるので、ひとりひとりの登録は正直面倒くさい)  ・特定の部署からのみ書き込み可 以上です。よろしくお願い致します。