2010-01-30 10 views
14

दिखाए जाने से रोकें विधि के नाम मैं अपने निष्पादन में सुरक्षा को संभालने के लिए एक वर्ग के लिए लिख रहा हूँ (जाँच धारावाहिकों, मुकदमे की तारीख की जाँच आदि)। जब मैं निष्पादन योग्य (यहां तक ​​कि रिलीज बिल्ड में, सभी डीबग और आरटीटीआई पीढ़ी के बंद होने के साथ) संकलित करता हूं, जब मैं इसे नोटपैड में खोलता हूं और कच्चे डेटा में विधि का नाम खोजता हूं, तो मैं अपनी कक्षा को इकट्ठा करने वाले तरीकों के सभी नाम देख सकता हूं । कोड बेस में किसी भी कक्षा में कोई प्रकाशित सदस्य नहीं हैं।डेल्फी: निष्पादनयोग्य

यह सुरक्षा के लिए बुरा है। क्या डेल्फी को निष्पादन योग्य तरीके से विधि नामों को स्टोर न करने का कोई तरीका है? यदि आरटीटीआई की आवश्यकता नहीं है और कोई COM विस्फोट नहीं है तो यह उन्हें बिल्कुल क्यों स्टोर कर रहा है? क्या कोई संकलक विकल्प इसे नियंत्रित कर रहा है?

हो सकता है कि लक्ष्य निष्पादन में किसी भी वर्ग का कोई भी तरीका पाठ के रूप में निष्पादन के अंदर संग्रहित है। जाहिर है इस विस्तारित RTTI के कारण होता है डेल्फी में सभी वर्गों के लिए डिफ़ॉल्ट रूप से चालू किया जा रहा 2010

+0

@FractalizeR -। यह गलत तरीके से नहीं लेते हैं लेकिन यदि आप obfuscation पर अपनी सुरक्षा का आधार (हिस्सा) कर रहे हैं, तो आप गलत दृष्टिकोण ले रहे हैं। मुझे सुरक्षा के बारे में कुछ भी नहीं पता है लेकिन यह जानने के लिए पर्याप्त है कि आपको कोशिश नहीं करनी चाहिए डिवाइस अपनी खुद की 'अटूट' योजना। मेरा सुझाव है कि आप अपने आवेदन के सुरक्षा पहलू को संभालने के लिए एक वाणिज्यिक या ओपन सोर्स समाधान की तलाश करेंगे। –

+0

यदि आप देखना चाहते हैं कि कौन से प्रतीकों (जैसे प्रक्रिया और कार्य नाम) आपके exe में रहते हैं, तो एक अच्छा परीक्षण इडा (इंटरएक्टिव डिससेबलर) में exe लोड करना होगा: http://www.hex-rays.com/idapro/मूल्यांकन और फ्रीवेयर संस्करण उपलब्ध हैं। – Remko

+0

@Lieven मैं अपने exe पर थीमिडा रक्षक का उपयोग करने की योजना बना रहा हूं, लेकिन इस मामले में भी सुरक्षा को मजबूत करने के लिए किसी को अत्यधिक जानकारी को खत्म करने की जरूरत है। –

उत्तर

15

आप डेल्फी 2010 में विस्तारित RTTI के बारे में पूछ रहे हैं, तो यह

{$ RTTI मुखर बंद किया जा सकता पद्धतियां ([]) संपत्तियां ([]) FIELDS ([])}

docwiki भी देखें।

+1

मुझे लगता है कि आप सही हैं। लेकिन क्या यह विकल्प जीयूआई से नियंत्रित नहीं है? यदि हां - तो कैसे? –

+2

AFAIK उन्नत आरटीटीआई के लिए कोई जीयूआई नियंत्रण नहीं है। आपको प्रत्येक इकाई को उन निर्देशों को जोड़ने की आवश्यकता है। –

-1

क्या आप शायद देखेंगे एक संसाधन (जैसे अपनी परियोजना के DFM फ़ाइलों की बाइनरी represetation) के रूप में अपने प्रपत्र परिभाषा है।

आप (धारावाहिक की जानकारी स्क्रीन आदि के लिए) इन दिखाने के लिए आप "कोड में" इन रूपों shouldcreate नहीं करना चाहते हैं। जैसे एक TForm बनाएं, उस पर एक TButton और TEDIT रखें, ईवेंट हैंडलर कोड में संलग्न करें।

एक handly तरह से ऐसा करने के लिए: एक रूप के साथ शुरू और DFM पैदा करते हैं। फॉर्म को विसर्जित करते समय, संदर्भ मेनू से टेक्स्ट के रूप में चुनें और आपको पता चलेगा कि आपको कोड में किस चीज की प्रतिलिपि बनाना चाहिए। और किसी भी varaiablerefernces जगह सुनिश्चित नहीं के तहत डी प्रकाशित (हमेशा सार्वजनिक/संरक्षित अपने वर्ग परिभाषा के दायरे में पहली पंक्ति के रूप/निजी डाल कर

+1

यह रूपों के बारे में नहीं है, लेकिन TObject से व्युत्पन्न कस्टम कक्षाओं के बारे में है। –

+0

@FraktalizeR: आपके द्वारा पहले दी गई जानकारी को देखते हुए, यह एम्बेडेड संसाधनों और आरटीटीआई के बारे में हो सकता था। केवल आपके बाद के अपडेट में आपने उल्लेख किया था कि यह नई विस्तारित आरटीटीआई के बारे में है। फिर भी: पुनर्विक्रेता वर्ग के नाम भी देते हैं, इसलिए मुझे समझ में नहीं आ रहा है कि आप इस जानकारी को इस तरह क्यों खारिज करते हैं।यह सही है कि यह निष्पादन योग्य में वर्ग नाम एम्बेड करने का एक तरीका है। –

6

इसके अलावा relocations पट्टी, इस परियोजना का डीपीआर फ़ाइल में निम्न तक का समय लग:।

{$IFDEF RELEASE} 
    // Leave out Relocation Table in Release version 
    {$SetPEFlags IMAGE_FILE_RELOCS_STRIPPED} 
{$ENDIF RELEASE} 
+0

यह डेल्फी 2010 में कंपाइलर त्रुटि देता है। इसका किस संस्करण का इरादा है? –

+0

Windows.pas में निरंतर घोषित किया गया है: IMAGE_FILE_RELOCS_STRIPPED = $ 0001; {फाइल से अलग स्थानांतरित जानकारी। } तो आपको डीपीआर में उपयोग खंड में विंडोज यूनिट जोड़ने या इसे स्वयं घोषित करने की आवश्यकता है। – Remko

6

... और भूल नहीं है "td 32 डिबग जानकारी" (पुराने संस्करणों में) या डिबग जानकारी बाद में लोगों में लिंकर टैब में बंद करने के लिए