vb.netで別資格情報で実行するアプリケーションと.NET逆コンパイラについて


vb.netを利用してみて、クライアント端末に対して管理者権限を所持していなくても安全に指定したアプリケーションだけは対話型ウィンドウでインストール出来る仕組みを何か作れないかなと考えておりました。

インターネット上の色々なナレッジを読ませていただきまして、コピー&ペーストでとりあえず動作するexeを作ってみたは良いものの、どうやらそのまま利用してしまっては.NET逆コンパイラを利用した場合に、すぐにパスワードとして設定している値が読み取れてしまうようで、単純にバイナリを作成して配ってしまっただけではセキュリティを一定レベルに担保するのは難しいようです。

やはり権限を付与する部分はASP.netなりを利用してサーバ側で実行してしまうか、サービスを作成してアプリケーションをシステム権限でUpdate出来る仕組みを作ってしまうのが影響範囲的にもよさそうです。

このまま配布するとセキュリティ的に問題が発生してしまうとは思いますが、コードを添付しておきます。
※今回コードの勉強させていただいたサイトと逆コンパイラに関しては文末の参考欄に記載してあります。

Module Module1

    Sub Main()
        'ユーザ名とパスワードを入力する
        Dim UserName As String = "ユーザ名"
        Dim PassWord As String = "パスワード"

        Dim strPWD As String = PassWord
        Dim SecureString As System.Security.SecureString = New System.Security.SecureString()

        Dim i As Integer = 1
        For i = 1 To Len(strPWD)
            SecureString.AppendChar(CChar(Mid(strPWD, i, 1)))
        Next

        Dim psi As New System.Diagnostics.ProcessStartInfo()

        psi.UserName = UserName
        psi.Password = SecureString

        'ComSpecのパスを取得する
        psi.FileName = System.Environment.GetEnvironmentVariable("ComSpec")
        '出力を読み取れるようにする
        psi.RedirectStandardInput = False
        psi.RedirectStandardOutput = True
        psi.UseShellExecute = False
        'ウィンドウを表示しないようにする
        psi.CreateNoWindow = True
        'コマンドラインを指定("/c"は実行後閉じるために必要)
        psi.Arguments = "/c ipconfig /all"

        Dim p As System.Diagnostics.Process
        Dim results As String

        Try

            p = System.Diagnostics.Process.Start(psi)
        Catch ex As System.ComponentModel.Win32Exception

            Console.Write("ユーザー名を認識できないか、またはパスワードが間違っています。")
            Return

        End Try

        '出力を読み取る
        results = p.StandardOutput.ReadToEnd
        '出力された結果を表示
        Console.WriteLine(results)
        p.WaitForExit()

    End Sub

End Module

参考

DOSコマンドを実行し出力データを取得する

System.Security.SecureStringに値を入れる方法

.NET逆コンパイラとコードを難読化するDotfuscator

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です