سؤال

وأنا تطوير مكتبة يستخدم واحد أو أكثر للتنفيذ المساعد في سياق ممارسة الأعمال التجارية. يتطلب تنفيذ بلدي الحالي أن يكون لدى المستخدم للتنفيذ المساعد المثبتة على النظام في مكان معروف. للمكتبة لتعمل بشكل صحيح يجب أن يكون التطبيق المساعد في الموقع الصحيح ويكون الإصدار الصحيح.

وأود أن إزالة شرط أن يتم تكوين النظام بالطريقة المذكورة أعلاه.

هل هناك طريقة لحزمة قابل للتنفيذ المساعد في المكتبة بحيث يمكن تفكيك في وقت التشغيل، والمثبتة في دليل مؤقت، وتستخدم لمدة شوط واحد؟ في نهاية المدى يمكن إزالة قابل للتنفيذ المؤقت.

ولقد نظرت توليد ملف يحتوي على مجموعة تشار غير موقعة الذي يحتوي على نص قابل للتنفيذ تلقائيا. يمكن القيام بذلك في وقت الترجمة كجزء من عملية الإنشاء. في وقت التشغيل هذه السلسلة سوف تكون مكتوبة إلى وبالتالي خلق ملف قابل للتنفيذ.

وسيكون من الممكن القيام بهذه المهمة دون كتابة القابل للتنفيذ إلى قرص (ربما نوعا من القرص RAM)؟ أنا يمكن أن نتصور بعض الماسحات الضوئية الفيروسات وغيرها من البرامج الأمنية الاعتراض على مثل هذه العملية. هل هناك مخاوف أخرى أود أن تكون قلقة؟

ويجري تطوير المكتبة في C / C ++ للاستخدام عبر منصة ويندوز ولينكس.

هل كانت مفيدة؟

المحلول

ويمكنك استخدام xxd لتحويل ملف ثنائي إلى ملف C الرأس.

$ echo -en "\001\002\005" > x.binary

$ xxd -i x.binary 
unsigned char x_binary[] = {
  0x01, 0x02, 0x05
};
unsigned int x_binary_len = 3;

وxxd هو المعيار جدا على أنظمة * لا شىء، وأنها متاحة على ويندوز مع سيغوين أو مينغو، أو فيم يتضمن في المثبت القياسي كذلك. وهذا هو غاية الطريقة عبر منصة لتشمل البيانات الثنائية إلى رمز المترجمة.

وثمة نهج آخر هو استخدام objcopy لإلحاق البيانات إلى نهاية للتنفيذ - IIRC لك <م> يمكن الحصول objcopy واستخدامه لشركات القطاع العام على ويندوز.

ونهج واحد أحب أفضل قليلا من ذلك هو مجرد إلحاق البيانات الخام مباشرة إلى نهاية الملف القابل للتنفيذ. في القابل للتنفيذ، كنت تسعى إلى نهاية الملف، وقراءة في العدد، مما يدل على حجم البيانات الثنائية المرفقة. ثم كنت تسعى إلى الوراء أن العديد من وحدات البايت، وfread أن البيانات ونسخها إلى نظام الملفات، حيث يمكن التعامل معها كملف قابل للتنفيذ. هذا هو بالمناسبة الطريق أن العديد، إن لم يكن قبل كل شيء، وخلق التنفيذية استخراج ذاتي .

إذا إلحاق البيانات الثنائية، وأنها تعمل مع كل ملفات Windows PE و* ملفات لا شىء ELF - أيا منهما قراءة الماضي "الحد" من تنفيذ

وبطبيعة الحال، إذا كنت بحاجة إلى إلحاق ملفات متعددة، يمكنك إما إلحاق القطران ملف / الرمز البريدي لإكس الخاص بك، أو سوف تحتاج إلى بنية بيانات أكثر قليلا مسبق لقراءة ما تم إلحاق.

وعليك أيضا ربما تريد UPX التنفيذية الخاصة بك قبل إلحاق لهم.

وكنت قد تكون مهتمة ايضا في LZO مكتبة، والذي يقال واحدة المكتبات ضغط أسرع فك الضغط. لديهم مكتبة MiniLZO التي يمكنك استخدامها لإلغاء ضغط خفيف الوزن جدا. ومع ذلك، فإن المكتبات LZO وGPL ترخيص، بحيث <م> قد يعني أنك لا يمكن إدراجه في التعليمات البرمجية المصدر ما لم GPLed التعليمات البرمجية الخاصة بك أيضا. من ناحية أخرى، هناك الرخص التجارية المتاحة.

نصائح أخرى

<اقتباس فقرة>   

و"أي شخص ذكي يحل المشكلة. A   عاقل يتجنب ذلك. "- ألبرت أينشتاين

في روح هذا الاقتباس أوصي بأن تقوم ببساطة حزمة هذا الملف التنفيذي جنبا إلى جنب مع التطبيق نهاية.

و2 سنتا فقط بلدي.

ونهج مختلف قليلا من استخدام غير موقعة تشار * مجموعة هو وضع ثنائي قابل للتنفيذ بأسره من الموارد دلل. في وقت التشغيل، يمكنك حفظ البيانات الثنائية كملف مؤقت المحلي وتنفيذ التطبيق. أنا لست متأكدا مما اذا كان هناك طريقة لتنفيذ قابل للتنفيذ في الذاكرة، وإن كان.

<اقتباس فقرة>   

لمكتبة لتعمل بشكل صحيح   يجب أن يكون التطبيق المساعد في الصحيحين   الموقع

في ويندوز، والتي من شأنها أن تكون ملفات البرنامج الدليل أو الدليل System32؟

وهذا قد يكون مشكلة. عند تثبيت التطبيق، خصوصا في بيئة الشركات، وهو يحدث عادة في سياق مع حقوق إدارية. على ويندوز فيستا وفي وقت لاحق مع UAC تمكين (الافتراضي)، هذا من الضروري أن أكتب بعض الدلائل. وكان معظم النكهات يونكس قيود معقولة من هذا القبيل لطالما يمكن لأي شخص أن يتذكر.

وحتى إذا كنت تحاول أن تفعل ذلك في الوقت يستدعي التطبيق المضيف إلى المكتبة الخاصة بك، التي قد لا تكون في سياق مع الحقوق الكافية لتثبيت الملفات، وحتى مكتبتك من شأنه أن يضع قيودا على التطبيق المضيف.

(وشيء آخر أن سيتم استبعاده هو تغييرات التسجيل، أو تحديثات ملف التكوين على مختلف Unices، إذا لم يكن التطبيق المضيف القدرة على رفع عملية إلى المستوى الإداري.)

وبعد كل ذلك، ويقول لك كنت تفكر في تفريغ المساعدين في دليل مؤقت، ولذلك ربما يكون هذا هو كل الصورية.

وكيو تي لديها وسيلة ممتازة لتحقيق ذلك: QResource

و"نظام الموارد كيو تي هو آلية منصة مستقلة لتخزين الملفات الثنائية في تنفيذ التطبيق".

وأنت لا تقول إذا كنت تستخدم حاليا كيو تي، ولكنك تقول "C ++ للاستخدام عبر منصة ويندوز ولينكس"، لذلك حتى لو كنت لا تستخدم ذلك، قد ترغب في النظر في البدء.

وهناك طريقة في ويندوز لتشغيل قابل للتنفيذ من داخل الذاكرة دون كتابة على القرص. والمشكلة هي أنه نظرا لأنظمة الأمن الحديثة (DEP) هذا ربما لن يعمل على جميع أنظمة وسوف تقريبا أي جهاز ماسح ضوئي لمكافحة البرمجيات الخبيثة الكشف عن ذلك وتحذير المستخدم.

ونصيحتي هي لمجرد حزمة قابل للتنفيذ في التوزيع، انها بالتأكيد الطريقة الأكثر موثوقية لتحقيق ذلك.

وكذلك، فإن فكرتي الأولى هي: ماذا يفعل هذا المساعد التنفيذي نفعل ذلك لا يمكن أن يتم ضمن التعليمات البرمجية مكتبتك نفسها، ربما باستخدام مؤشر ترابط ثانوي إذا لزم الأمر. هذا قد يكون شيئا للنظر فيها.

ولكن بالنسبة لمسألة الفعلي ... إذا يتم واحدة "المكتبة" الواقع على خط النار في دلل (أو حتى ملف) ثم على الأقل لديها دعم Windows simpe نسبيا لدمج الملفات داخل المكتبة.

وهذه الآلية الموارد التي تسمح أشياء مثل معلومات الإصدار والرموز لتكون جزءا لا يتجزأ ضمن التنفيذية يمكن أن تسمح قطع تعسفية من البيانات. وبما أنني لا أعرف ما بيئة التطوير الذي تستخدمه، لا أستطيع أن أقول بالضبط كيفية القيام بذلك. ولكن تحدث تقريبا، وكنت بحاجة إلى إنشاء مورد مخصص مع نوع من "FILE" أو شيء من هذا القبيل المعقول والإشارة إليها في إكس تريد تضمين.

وبعد ذلك، عندما تريد استخراجها، وكنت أكتب شيئا مثل

HRSRC hResource = FindResource(NULL, MAKEINTRESOURCE(IDR_MY_EMBEDDED_FILE), "FILE");
HGLOBAL hResourceData = LoadResource(NULL, hResource);
LPVOID pData = LockResource(hResourceData);
HANDLE hFile = CreateFile("DestinationPath\\Helper.exe", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
DWORD dwBytesWritten = 0;
WriteFile(hFile, pData, SizeofResource(NULL, hResource), &dwBytesWritten, NULL);
CloseHandle(hFile);

و(ملء الخاص بك المرجوة المسار، اسم الملف، وأي تدقيق الأخطاء المناسب طبعا)

وبعد ذلك، يوجد إكس المساعد كملف إكس العادي وحتى تتمكن من تنفيذ ذلك ولكن تفعل عادة.

لإزالة الملف بعد الاستخدام، يجب التحقيق في الأعلام لCreateFile، ولا سيما FILE_FLAG_DELETE_ON_CLOSE. كنت قد ننظر أيضا في استخدام MoveFileEx عند الجمع بين العلم MOVEFILE_DELAY_UNTIL_REBOOT مع مرت NULL عن اسم الملف الجديد. وبالطبع، يمكنك دائما حذفها في التعليمات البرمجية الخاصة بك إذا يمكن أن أقول لكم عندما القابل للتنفيذ قد انتهت.

وأنا لا أعرف ما يكفي عن التنفيذية لينكس، لذلك أنا لا أعرف إذا كان ميزة مشابهة متوفرة هناك.

إذا لينكس لا يوفر أي آلية ملائمة و / أو إذا لم هذه الفكرة تتناسب مع احتياجاتك في ويندوز، ثم افترض أن لديك فكرة توليد مجموعة تشار غير موقعة من محتويات إكس المساعد يكون القادم أفضل طريقة لتضمين إكس في مكتبتك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top