2010-04-30 25 views
9

में एंबेडेड स्ट्रिंग को संशोधित करें मुझे एक समस्या है जहां मुझे एक संकलित exe (.net 3.5 C#) रखने में सक्षम होना चाहिए कि मैं वितरित करने की प्रतियां बनाउंगा जो कि उदाहरण के लिए एक कुंजी बदलने की आवश्यकता होगी exe बाहर भेजा जाता है।सी # संकलित एक्सई

मैं हर बार एक नए exe की आवश्यकता संकलित नहीं कर सकता। यह एक पतला ग्राहक है जिसका उपयोग पंजीकरण प्रक्रिया के हिस्से के रूप में किया जाएगा।

क्या एक रिक्त मान के साथ संसाधन फ़ाइल में एक प्रविष्टि जोड़ना संभव है, जब कोई अनुरोध किसी अन्य एप्लिकेशन में रिक्त डिफ़ॉल्ट पतले क्लाइंट को पकड़ लेता है, इसे कॉपी करें, आवश्यक डेटा के साथ रिक्त मान को पॉप्युलेट करें।

यदि हां कैसे? यदि आपके पास कोई विचार नहीं है? मैं कुछ दिनों के लिए अपने सिर को खरोंच कर रहा हूं और सीमाओं के कारण सीमा में मुझे काम करने की आवश्यकता है।

अन्य विचार मुझे एक विधि में मूल्य इंजेक्ट करना था, जिसे मुझे नहीं पता कि कैसे मैं भी कोशिश करता हूं।

धन्यवाद।

+0

इसका उद्देश्य क्या है? यह जानकर कि हमें आपकी मदद करने में मदद मिल सकती है। –

+0

हैलो रॉबर्ट, मुझे एक्स उपयोगकर्ताओं को पतली क्लाइंट एक्सई वितरित करने की आवश्यकता है। हालांकि इस क्लाइंट को भेजा जाने से पहले फ्लाई पर इंजेक्शन देने की आवश्यकता है। मांग पर संकलन काम नहीं करेगा। भेजे गए प्रत्येक ग्राहक के पास इसके साथ जुड़े अपने अद्वितीय पहचानकर्ता होंगे। मैं एक app.config फ़ाइल का उपयोग नहीं कर सकता क्योंकि फ़ाइल स्वयं निहित होनी चाहिए (एक और आवश्यकता) इसलिए मैंने संसाधन फ़ाइल को देखना शुरू कर दिया क्योंकि कुंजी को एम्बेड किया जाना चाहिए। धन्यवाद। – nitefrog

+0

क्या फाइल पर हस्ताक्षर होना होगा? –

उत्तर

5

असेंबली को आईएल में कनवर्ट करें, एक टेक्स्ट खोज करें और प्रतिस्थापित करें, आईएल को फिर से एक असेंबली में दोबारा दोहराएं। standard tools from the .NET SDK का उपयोग करें।

+0

दान और एमरी मैंने अभी इस प्रश्न को पोस्ट किया है: http://stackoverflow.com/questions/2749113/compile-il-code-at-runtime-using-net-3-5-and-c-from-file मैं ildasm और ilasm दृष्टिकोण लेने जा रहा हूं, लेकिन क्या आप जानते हैं कि इसे process.start का उपयोग करके इसे कमांड करने के बिना इसे स्वचालित कैसे करें? – nitefrog

-1

मेरे मन में आता है, लेकिन अभी तक नहीं की कोशिश की: फिर

static public string regGuid = "yourguidhere"; 

के रूप में अपने कार्यक्रम में एक डिफ़ॉल्ट स्ट्रिंग बनाएँ, उदाहरण के लिए, किसी भी सभ्य हेक्स संपादक के साथ खोज संकलित EXE। यदि आपको स्ट्रिंग मिलती है, तो इसे किसी अन्य परीक्षण से बदलें। यदि आप अभी भी प्रोग्राम निष्पादित कर सकते हैं, तो आप इस प्रक्रिया को स्वचालित करने की कोशिश कर सकते हैं और voila! आप यहाँ हैं।

+2

मुझे नहीं पता कि हस्ताक्षरित असेंबली के पास किसी भी प्रकार का चेकसम है, लेकिन मुझे लगता है कि हस्ताक्षरित असेंबली के लिए असफल हो जाएगा, क्योंकि हस्ताक्षर अब मान्य नहीं होगा। –

+2

लंबाई में परिवर्तन होने पर सभी मज़े का उल्लेख नहीं करना है ... –

+0

यह समस्या है, कुंजी को हर बार एक ही लंबाई होने की गारंटी नहीं दी जा सकती है। इसलिए एक परिवर्तनीय लंबाई कुंजी। – nitefrog

1

.NET कोड की क्षमता के भीतर से, मुझे यकीन नहीं है कि यह करने योग्य है या नहीं। लेकिन गतिशील रूप से एक .NET DLL उत्पन्न करना संभव है जिसमें कुछ कुंजी शामिल है जिसे मुख्य एप्लिकेशन से संदर्भित किया जा सकता है। यही है, अगर आप वितरण में दूसरी फ़ाइल नहीं मानेंगे।

या यदि आप .exe को अलग करने के लिए Ildasm का उपयोग करने के लिए कोई फर्क नहीं पड़ता है, तो कुंजी बदलें, फिर इलैशम को फिर से इकट्ठा करने के लिए उपयोग करें, फिर आप इसे स्वचालित करने के लिए कुछ कर सकते हैं।

+0

यदि आप आईएल में कनवर्ट करते हैं और वापस कनवर्ट करते हैं तो यह वापस परिवर्तित होने के बाद exe पर हस्ताक्षर करने के साथ किसी भी समस्या का कारण बनता है। प्रक्रिया, स्वचालित होने की जरूरत है। मेरे जीवन के लिए मुझे काम करने के लिए अद्यतन संसाधन नहीं मिल सकता है। यह फ़ाइल को संशोधित करता है लेकिन नाम मान को ओवरराइट नहीं करता है ... – nitefrog

+0

आप ilasm/key = keyfile तर्क का उपयोग करके इसे पुनः संयोजित करते समय exe पर हस्ताक्षर कर सकते हैं। – Amry

+0

मैंने अभी आईएल की कोशिश की और बनाई, मुद्दा यह है कि संसाधन फ़ाइल जानकारी कहीं भी नहीं दिखती है। मैं नाम देख सकता हूं लेकिन मूल्य नहीं। क्या किसी ने भी अपडेट करने के लिए UpdateResource प्राप्त किया है? – nitefrog

4

इसके बजाय विधानसभा में महत्वपूर्ण एम्बेड करने के लिए, यह app.config फ़ाइल (या आवेदन के साथ वितरित अन्य फ़ाइल) में डाल दिया और यदि कुंजी वर्तमान और मान्य नहीं है चलने से आपके आवेदन को रोकने के। उपयोगकर्ताओं द्वारा संशोधन के खिलाफ इसे सुरक्षित करने के लिए, कॉन्फ़िगरेशन फ़ाइल में आरएसए हस्ताक्षर भी जोड़ें।

यह कोड आपके कुंजी युक्त एक्सएमएल उत्पन्न करने के लिए उपयोग किया जा सकता है। इस कोड से

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; 
    } 
} 
+0

फिर फ़ाइल स्वयं निहित होना चाहिए। मेरे पास कोई निर्भर फाइल नहीं हो सकती है, लेकिन अगर यह एक और फाइल के साथ सवारी करने के लिए हो तो यह एक बहुत ही बढ़िया समाधान है। इसके अलावा कुंजी को पढ़ने में सक्षम होना चाहिए क्योंकि एन्क्रिप्शन की आवश्यकता नहीं है। सुरक्षा में एक और प्रक्रिया है जो सुरक्षा को बंद कर देगी। मुझे बस exe से जुड़े एक अद्वितीय पहचानकर्ता की आवश्यकता है और इसे भेजने वाले प्रत्येक exe के साथ इसे एम्बेड करने की आवश्यकता है। – nitefrog

+0

मैंने सोचा कि आप गलत समस्या को हल कर सकते हैं क्योंकि मुझे लगता है कि कई मामलों में ऐप की कॉन्फ़िगरेशन फ़ाइल स्वचालित रूप से निष्पादन योग्य के साथ ले जाया जाता है। और यदि आवश्यक हो तो एकाधिक फ़ाइलों को पैकेजिंग करने के तरीके भी हैं। लेकिन यदि आपके द्वारा स्वीकार किए गए समाधान से निपटने के लिए उन समस्याओं का सामना करना कठिन होता है, तो निश्चित रूप से कम से कम प्रतिरोध का मार्ग लें। – BlueMonkMN

+0

इसके अलावा, कुंजी को इस कोड से एन्क्रिप्ट नहीं किया गया है। संपूर्ण एक्सएमएल सादा पाठ है, और अंत में केवल हस्ताक्षर जोड़ा गया है समझ में नहीं आता है। – BlueMonkMN

0

मुझे नहीं लगता कि आप अपने .exe recompiling और कुंजी में एम्बेड .exe कहा बिना प्राप्त कर सकते हैं करते हैं: आप कभी नहीं निजी कुंजी को वितरित करने के लिए है। संकलन प्रक्रिया को ildasm.exe और ilasm.exe के उपयोग के माध्यम से स्वचालित किया जा सकता है, क्योंकि डैनियल ईरविकियर ने अपनी प्रतिक्रिया https://stackoverflow.com/a/2742902/2358659

पर विस्तार किया है, यदि मैं भविष्य में इस विषय में किसी और को ठोकर खाऊंगा तो मैं उस पर विस्तार करना चाहता हूं।

मुझे हाल ही में मेरे खराब स्रोत कोड संस्करण नियंत्रण आदतों के कारण इसी तरह की समस्या का सामना करना पड़ रहा था। संक्षेप में मेरे पास एक निष्पादन योग्य था जिसे Google आईडी को संदर्भित करके Google स्प्रेडशीट में कुछ डेटा लिखना था। निष्पादन योग्य रिलीज होने के बाद लंबे समय तक एक अलग टीम से टूल का उपयोग करने के लिए एक और अनुरोध आया, लेकिन डेटा को दो टीमों के लिए अलग रखने के लिए इसे एक ही स्प्रेडशीट में एक ही जानकारी लिखनी पड़ी। उस समय मेरे पास मूल स्रोत कोड नहीं था, इसलिए मैं मूल स्प्रेडशीट आईडी धारण करने वाले स्थैतिक चर को बदलने में सक्षम नहीं था। क्या मैंने किया था इस प्रकार है:

  1. cmd.exe → कॉल का उपयोग करना "C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.0A \ बिन \ NETFX 4.0 उपकरण \ ildasm.exe" " myApplication.exe "/out="myApplication.il"
  2. नोटपैड ++ का उपयोग करना → मूल आईडी को myApplication.il फ़ाइल के अंदर नई आईडी में ढूंढें और बदलें। ऐसा करने के लिए अपने सी # एप्लिकेशन को लिखकर या PowerShell का उपयोग करके, या वीबी/जे-स्क्रिप्ट का उपयोग करके या FART जैसे सीएमडी.एक्सई → का उपयोग करके कुछ अन्य ढूंढें और टूल को ऑफ-द-शेल्फ उपलब्ध करने का उपयोग करके स्वचालित रूप से स्वचालित किया जा सकता है। कॉल fart.exe myApplication.il "OldKey" "न्यूकी")
  3. सीएमडी.एक्सई → का उपयोग करके "सी: \ विंडोज \ माइक्रोसॉफ्ट.नेट \ फ्रेमवर्क \ v4.0.30319 \ ilasm.exe" myAplication.il " /res="myApplication.res "/key="myApplicationKeyFile.snk"

जैसा कि आप देख, इन चरणों के सभी एक .bat फ़ाइल है कि एक इनपुट के रूप "NewKey" लेता है में डाल दिया जा सकता है और ठेस न्यूके एम्बेडेड के साथ नया .exe।

मुझे उम्मीद है कि इससे मदद मिलती है।