11

たとえば、exe が送信される前にキーを変更する必要があるコピーを作成して配布するコンパイル済みの exe (.net 3.5 c#) を使用できるようにする必要があるという問題があります。

新しいexeが必要になるたびにコンパイルできません。これは、登録プロセスの一部として使用されるシン クライアントです。

空白の値でリソース ファイルにエントリを追加することはできますか? 要求が届いたときに、別のアプリケーションが空白のデフォルトのシン クライアントを取得してコピーし、空白の値に必要なデータを入力することはできますか?

はいの場合、どのように?いいえの場合、何かアイデアはありますか?私はここ数日間頭を悩ませていますが、仕事をしなければならない境界による制限があります.

私が持っているもう1つのアイデアは、値をメソッドに注入することでしたが、それをどのように試みるかさえわかりません。

ありがとう。

4

6 に答える 6

6

アセンブリを IL に変換し、テキストの検索と置換を実行して、IL を再度アセンブリに再コンパイルします。.NET SDKの標準ツールを使用します。

于 2010-04-30T07:21:01.907 に答える
5

キーをアセンブリに埋め込むのではなく、app.config ファイル (またはアプリケーションと共に提供される別のファイル) に配置し、キーが存在せず有効でない場合にアプリケーションが実行されないようにします。ユーザーによる変更から保護するには、構成ファイルに RSA 署名も追加します。

このコードを使用して、キーを含む XML を生成できます。

public static void Main()
{
   Console.WriteLine(GenerateKey());
}

public static Byte[] Transform(Byte[] bytes, ICryptoTransform xform)
{
   using (System.IO.MemoryStream stream = new System.IO.MemoryStream())
   {
      using (CryptoStream cstream = new CryptoStream(stream, xform, CryptoStreamMode.Write))
      {
         cstream.Write(bytes, 0, bytes.Length);
         cstream.Close();
         stream.Close();
         return stream.ToArray();
      }
   }
}

public static string GenerateKey()
{
   RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
   // This is the private key and should never be shared.
   // Generate your own with RSA.Create().ToXmlString(true).
   String rsaPrivateKey = "<RSAKeyValue><Modulus>uPCow37yEzlKQXgbqO9E3enSOXY1MCQB4TMbOZyk9eXmc7kuiCMhJRbrwild0LGO8KE3zci9ETBWVVSJEqUqwtZyfUjvWOLHrf5EmzribtSU2e2hlsNoB2Mu11M0SaGd3qZfYcs2gnEnljfvkDAbCyJhUlxmHeI+35w/nqSCjCk=</Modulus><Exponent>AQAB</Exponent><P>4SMSdNcOP0qAIoT2qzODgyl5yu9RubpIU3sSqky+85ZqJHXLUDjlgqAZvT71ROexJ4tMfMOgSWezHQwKWpz3sw==</P><Q>0krr7cmorhWgwCDG8jmzLMo2jafAy6tQout+1hU0bBKAQaPTGGogPB3hTnFIr84kHcRalCksI6jk4Xx/hiw+sw==</Q><DP>DtR9mb60zIx+xkdV7E8XYaNwx2JeUsqniwA3aYpmpasJ0N8FhoJI9ALRzzp/c4uDiuRNJIbKXyt6i/ZIFFH0qw==</DP><DQ>mGCxlBwLnhkN4ind/qbQriPYY8yqZuo8A9Ggln/G/IhrZyTOUWKU+Pqtx6lOghVdFjSxbapn0W8QalNMFGz7AQ==</DQ><InverseQ>WDYfqefukDvMhPHqS8EBFJFpls/pB1gKsEmTwbJu9fBxN4fZfUFPuTnCIJsrEsnyRfeNTAUFYl3hhlRYZo5GiQ==</InverseQ><D>qB8WvAmWFMW67EM8mdlReI7L7jK4bVf+YXOtJzVwfJ2PXtoUI+wTgH0Su0IRp9sR/0v/x9HZlluj0BR2O33snQCxYI8LIo5NoWhfhkVSv0QFQiDcG5Wnbizz7w2U6pcxEC2xfcoKG4yxFkAmHCIkgs/B9T86PUPSW4ZTXcwDmqU=</D></RSAKeyValue>";

   rsa.FromXmlString(rsaPrivateKey);
   String signedData = "<SignedData><Key>Insert your key here</Key></SignedData>";
   Byte[] licenseData = System.Text.Encoding.UTF8.GetBytes(signedData);
   Byte[] sigBytes = rsa.SignData(licenseData, new SHA1CryptoServiceProvider());
   String sigText = System.Text.Encoding.UTF8.GetString(Transform(sigBytes, new ToBase64Transform()));
   System.Text.StringBuilder sb = new StringBuilder();
   using (System.Xml.XmlWriter xw = System.Xml.XmlTextWriter.Create(sb))
   {
      xw.WriteStartElement("License");
      xw.WriteRaw(signedData);
      xw.WriteElementString("Signature", sigText);
      xw.WriteEndElement();
   }
   return sb.ToString();
}

このコードからの出力例:

<?xml version="1.0" encoding="utf-16"?>
<License>
  <SignedData>
    <Key>Insert your key here</Key>
  </SignedData>
  <Signature>cgpmyqaDlHFetCZbm/zo14NEcBFZWaQpyHXViuDa3d99AQ5Dw5Ya8C9WCHbTiGfRvaP4nVGyI+ezAAKj287dhHi7l5fQAggUmh9xTfDZ0slRtvYD/wISCcHfYkEhofXUFQKFNItkM9PnOTExZvo75pYPORkvKBF2UpOIIFvEIU=</Signature>
</License>

次に、このようなコードを使用して検証できます。秘密鍵を配布する必要はありません。

public static Boolean CheckLicenseSignature(String licXml)
{
   try
   {
      System.Xml.XmlDocument xd = new System.Xml.XmlDocument();
      xd.LoadXml(licXml);
      String licSig = xd.SelectSingleNode("/License/Signature").InnerText;
      RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
      String rsaPublicKey = "<RSAKeyValue><Modulus>uPCow37yEzlKQXgbqO9E3enSOXY1MCQB4TMbOZyk9eXmc7kuiCMhJRbrwild0LGO8KE3zci9ETBWVVSJEqUqwtZyfUjvWOLHrf5EmzribtSU2e2hlsNoB2Mu11M0SaGd3qZfYcs2gnEnljfvkDAbCyJhUlxmHeI+35w/nqSCjCk=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
      rsa.FromXmlString(rsaPublicKey);
      Byte[] licenseData = System.Text.Encoding.UTF8.GetBytes(xd.SelectSingleNode("/License/SignedData").OuterXml);
      return rsa.VerifyData(licenseData, new SHA1CryptoServiceProvider(), Transform(System.Text.Encoding.UTF8.GetBytes(licSig), new FromBase64Transform()));
   }
   catch (System.Xml.XmlException ex)
   {
      return false;
   }
   catch (InvalidOperationException ex)
   {
      return false;
   }
}
于 2010-04-30T13:45:15.683 に答える
1

.NET コード自体の能力からすると、これが実行可能かどうかはわかりません。ただし、メイン アプリケーションから参照できるキーを含む .NET DLL を動的に生成することは可能です。つまり、ディストリビューション内の 2 番目のファイルを気にしない場合です。

または、Ildasm を使用して .exe を逆アセンブルし、キーを変更してから、Ilasm を使用して再アセンブルすることを気にしない場合は、それを自動化するために何かを行うことができます。

于 2010-04-30T07:19:08.763 に答える
-1

私の頭に浮かぶが、まだ試していないこと:プログラムでデフォルトの文字列を作成します。たとえば、

static public string regGuid = "yourguidhere";

次に、適切な 16 進エディタでコンパイル済みの EXE を検索します。文字列が見つかった場合は、別のテストに置き換えます。それでもプログラムを実行できる場合は、このプロセスを自動化してみてください。はい、どうぞ。

于 2010-04-30T06:10:40.270 に答える