Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#编译的exe中修改emded字符串_C#_Assemblies_Executable_Disassembly_Code Injection - Fatal编程技术网

在C#编译的exe中修改emded字符串

在C#编译的exe中修改emded字符串,c#,assemblies,executable,disassembly,code-injection,C#,Assemblies,Executable,Disassembly,Code Injection,我有一个问题,我需要能够有一个已编译的exe(.net 3.5 c#),我将复制该exe进行分发,这将需要更改密钥,例如在发送exe之前 我无法在每次需要新的exe时编译。这是一个瘦客户端,将用作注册过程的一部分 有可能将一个条目添加到一个带有空白值的资源文件中,然后当一个请求进来时,另一个应用程序捕获空白的默认瘦客户机,复制它,用所需的数据填充空白值。 如果是,怎么做?如果没有,你有什么想法吗?几天来,我一直在挠头,由于工作范围的限制,我的工作受到限制 我的另一个想法是将值注入到一个方法中,我

我有一个问题,我需要能够有一个已编译的exe(.net 3.5 c#),我将复制该exe进行分发,这将需要更改密钥,例如在发送exe之前

我无法在每次需要新的exe时编译。这是一个瘦客户端,将用作注册过程的一部分

有可能将一个条目添加到一个带有空白值的资源文件中,然后当一个请求进来时,另一个应用程序捕获空白的默认瘦客户机,复制它,用所需的数据填充空白值。 如果是,怎么做?如果没有,你有什么想法吗?几天来,我一直在挠头,由于工作范围的限制,我的工作受到限制

我的另一个想法是将值注入到一个方法中,我甚至不知道如何尝试


谢谢。

我想到了什么,但还没有尝试过:在程序中创建一个默认字符串,例如

static public string regGuid = "yourguidhere";

然后,用任何合适的十六进制编辑器搜索编译的EXE。如果找到该字符串,请用另一个测试替换它。如果你仍然可以执行这个程序,你可以尝试自动化这个过程,瞧!这就是。

从.NET代码本身的能力来看,我不确定这是否可行。但是可以动态生成一个.NET DLL,其中包含一些可以从主应用程序引用的密钥。也就是说,如果您不介意发行版中的第二个文件的话


或者,如果您不介意使用Ildasm来反汇编.exe,更改密钥,然后使用Ilasm重新组装,那么您可以做一些事情来实现自动化。

将程序集转换为IL,执行文本搜索和替换,再次将IL重新编译为程序集。使用。

而不是将密钥嵌入程序集中,将其放入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();
}
publicstaticvoidmain()
{
Console.WriteLine(GenerateKey());
}
公共静态字节[]转换(字节[]字节,ICryptoTransform xform)
{
使用(System.IO.MemoryStream stream=new System.IO.MemoryStream())
{
使用(CryptoStream cstream=新的CryptoStream(stream、xform、CryptoStreamMode.Write))
{
cstream.Write(字节,0,字节.长度);
cstream.Close();
stream.Close();
返回流ToArray();
}
}
}
公共静态字符串GenerateKey()
{
RSACryptoServiceProvider rsa=新的RSACryptoServiceProvider();
//这是私钥,不应共享。
//使用RSA.Create().ToXmlString(true)生成您自己的。
字符串rsaPrivateKey="2.这两个城市的研究成果是一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市一个城市的一个城市的一个城市一个城市一个城市一个2 2 2 2 2 2 2 2 2 2 2 2 2 2个城市的城市的城市的一个城市一个城市一个城市的一个城市一个城市一个城市一个城市一个城市一个城市一个城市一个城市一个城市一个城市一个城市一个城市一个城市一个城市一个城市一个城市一个城市一个城市一个城市一个城市一个城市一个城市一个城市一个城市一个城市一个城市一个城市一个城市一个KHCRALCKSI6JK4X(2)该文给出了一个新的研究结果。2)该文给出了一个新的研究结果。该研究的目的是对一个新的研究项目进行研究。该文给出了一个新的研究结果。该文的第四部分是一个新的研究结果。2)该文的第四部分是一个新的研究结果(2)该文的研究结果(2)该文给出了一个新的研究结果(2)是一个中国的一个研究成果。2)对该文给出了一个研究的研究结果(2)该文的研究结果(2)是:该文文的研究(8)是(2)的研究(8 8)是一文文文文文的研究(8)是一个研究(8)的研究结果(8)是一个研究(8)是对(8)是对(8)文文文文文文文的研究(8)8)8个研究(8)的研究(8)8)Q Q(8)Q Q Q(8)是WFJ2PXTOUI+wTgH0Su0IRp9sR/0v/x9HZlluJ0BR2O33SNQCXYI8LIO5NOWHFHKVSV0QFQIDCG5WNBIZ7W2U6PCXEC2XFCOKG4YXFKAMHCIKs/B9T86PUPSW4ZTXcwDmqU=“;
rsa.FromXmlString(rsaPrivateKey);
String signedData=“在此处插入密钥”;
Byte[]licenseData=System.Text.Encoding.UTF8.GetBytes(signedData);
Byte[]sigBytes=rsa.SignData(licenseData,新的SHA1CryptoServiceProvider());
String sigText=System.Text.Encoding.UTF8.GetString(转换(sigBytes,new-ToBase64Transform());
System.Text.StringBuilder sb=新的StringBuilder();
使用(System.Xml.XmlWriter xw=System.Xml.XmlTextWriter.Create(sb))
{
xw.书面声明(“许可证”);
xw.WriteRaw(签名数据);
xw.WriteElementString(“签名”,sigText);
xw.WriteEndElement();
}
使某人返回字符串();
}
此代码的输出示例:

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

把钥匙插在这里
cgpmyqaDlHFetCZbm/ZO14NECBFZWAQPYXVHIUDA3D99AQ5DW5YA8C9WCHBTIGFRVAP4NVGYI+EZAAKJ287DHHI7FQAGGH9XTFDZ0SLRTVYD/WISCCHFYKEHZHOFQFKFKIT9PNOTEXZVO75PYPORKVKBF2UPOIFFIEU=
然后您可以使用这样的代码来验证它。您永远不必分发私钥:

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;
   }
}
公共静态布尔CheckLicenseSignature(字符串licXml)
{
尝试
{
System.Xml.XmlDocument xd=new System.Xml.XmlDocument();
LoadXml(licXml);
字符串licSig=xd.SelectSingleNode(“/License/Signature”).InnerText;
RSACryptoServiceProvider rsa=新的RSACryptoServiceProvider();
字符串rsPublicKey=“UPCOW37YEZLKQQGBQO9E3ENSOXY1MCQB4TMBOZYK9EXMC7KUIMCHJRBWILD0LGO8KE3ZCI9ETBWVVSJEQUQWTZY2HLSNOB2MU11M0SAGD3QZFYCS2GNENLJFVKDABCYJHULXMHEI+35w/nqSCjCk=AQAB”;
rsa.FromXmlString(rsaPublicKey);
Byte[]licenseData=System.Text.Encoding.UTF8.GetBytes(xd.SelectSingleNode(“/License/SignedData”).OuterXml);
返回rsa.VerifyData(licenseData,new-SHA1CryptoServiceProvider(),Transform(System.Text.Encoding.UTF8.GetBytes(licSig),new-FromBase64Transform());
}
catch(System.Xml.xmleexception ex)
{
返回false;
}
捕获(无效操作异常ex)
{
返回false;
}
}

我认为,如果不重新编译.exe并将密钥嵌入到所述的.exe中,您是无法逃脱的。正如Daniel Earwicker在回复中建议的那样,通过使用ildasm.exe和ilasm.exe,编译过程可以自动化的

如果将来有人偶然发现这个话题,我想进一步说明

<