Измените Строку Emdeded в скомпилированном exe C#

У меня есть проблема, где я должен смочь иметь скомпилированный exe (.net 3.5 c#), из которого я сделаю копии распределить, который должен будет изменить ключ, например, прежде чем exe будет отослан.

Я не могу скомпилировать каждый раз, когда новый exe необходим. Это - тонкий клиент, который будет использоваться в качестве части процесса регистрации.

Действительно ли возможно добавить запись в файл ресурсов с пустым значением затем, когда запрос входит, имеют другое приложение, захватывают пустой тонкий клиент по умолчанию, копируют его, заполняют пустое значение с необходимыми данными.

Если да, как? Если не делают у Вас есть какие-либо идеи? Я царапал голову в течение нескольких дней теперь и ограничения как из-за границ, в которых я обязан работать.

Другая идея, которую я имею, состояла в том, чтобы ввести значение в метод, который я понятия не имею, как я даже делал бы попытку этого.

Спасибо.

11
задан nitefrog 30 April 2010 в 06:00
поделиться

4 ответа

Преобразуйте сборку в IL, выполните текстовый поиск и замените , снова перекомпилируйте IL в сборку. Используйте стандартные инструменты из .NET SDK .

6
ответ дан 3 December 2019 в 10:03
поделиться

Я не уверен, что это выполнимо, исходя из возможностей самого кода .NET. Но можно динамически сгенерировать .NET DLL, которая содержит некоторый ключ, на который можно ссылаться из основного приложения. То есть, если вы не возражаете против второго файла в раздаче.

Или, если вы не против использовать Ildasm для дизассемблирования .exe, изменить ключ, затем использовать Ilasm для повторной сборки, тогда вы можете сделать что-нибудь для автоматизации этого.

1
ответ дан 3 December 2019 в 10:03
поделиться

Что приходит на ум, но еще не пробовал: Создайте строку по умолчанию в своей программе, например, как

static public string regGuid = "yourguidhere";

Затем найдите скомпилированный EXE с помощью любого приличного шестнадцатеричного редактора. Если вы найдете строку, замените ее другим тестом. Если вы все еще можете выполнить программу, вы можете попробовать автоматизировать этот процесс и вуаля! Держи.

-1
ответ дан 3 December 2019 в 10:03
поделиться

Вместо встраивания ключа в сборку поместите его в файле 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;
   }
}
4
ответ дан 3 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: