سؤال

ولما لم أجد جوابا إلى السؤال سابقا هنا أنا أحاول مقاربة مختلفة.

هل هناك أي وسيلة لتبادل الذاكرة بين اثنين من العمليات ؟

العملية الثانية يحصل على المعلومات من حقنة لأنه إرث البرنامج أنه لم تدعم بعد الآن.

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

هل هذا ممكن ؟ كيف ؟

رمز تقدير.

تحرير:

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

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

المحلول

يمكنك محاولة الذاكرة المعنونة الملف.

هذا يعطي أكثر قليلا خطوة بخطوة بالتفصيل.

نصائح أخرى

على الرغم من أن ويندوز يدعم الذاكرة المشتركة من خلال تعيين ملف API, لا يمكنك بسهولة حقن مشتركة خرائط الذاكرة إلى عملية أخرى مباشرة ، MapViewOfFileEx لا تأخذ عملية حجة.

ومع ذلك ، يمكنك حقن بعض البيانات من خلال تخصيص الذاكرة في عملية أخرى باستخدام VirtualAllocEx و WriteProcessMemory.إذا كنت تريد نسخ في التعامل مع باستخدام DuplicateHandle, ثم حقن كعب الذي يدعو MapViewOfFileEx, هل يمكن وضع الذاكرة المشتركة رسم الخرائط في عملية أخرى.لأنه يبدو وكأنه سوف تكون حقن رمز على أي حال ، يجب أن تعمل بشكل جيد بالنسبة لك.

لتلخيص, سوف تحتاج إلى:

  • إنشاء مجهول الذاكرة المشتركة الجزء التعامل معها من خلال الاتصال CreateFileMapping مع INVALID_HANDLE_VALUE على hFile و NULL lpName.
  • نسخ هذا التعامل في عملية الهدف مع DuplicateHandle
  • تخصيص بعض الذاكرة باستخدام رمز VirtualAllocEx, مع flAllocationType = MEM_COMMIT | MEM_RESERVE و flProtect = PAGE_EXECUTE_READWRITE
  • كتابة كعب البرمجية في هذه الذاكرة ، باستخدام WriteProcessMemory.هذا العقب من المرجح أن تحتاج إلى أن تكون مكتوبة في المجمع.تمرير مقبض من DuplicateHandle قبل الكتابة هنا في مكان ما.
  • تنفيذ كعب باستخدام CreateRemoteThread.كعب ثم يجب استخدام التعامل معها الحصول على دعوة MapViewOfFileEx.العمليات ثم شيوعا قسم الذاكرة المشتركة.

قد تجد أنه أسهل قليلا إذا كان كعب الأحمال خارجي مكتبة - هذا هو الأمر ببساطة استدعاء LoadLibrary (إيجاد عنوان LoadLibrary ترك ممارسة القارئ) و القيام بالعمل الخاص بك من المكتبة dllmain نقطة الدخول.في هذه الحالة باستخدام اسمه الذاكرة المشتركة من المرجح أن يكون أبسط من تحريك DuplicateHandle.انظر المقالة MSDN على CreateFileMapping لمزيد من التفاصيل, ولكن أساسا تمر INVALID_HANDLE_VALUE على hFile و اسم lpName.

تحرير:منذ مشكلتك تمرير البيانات الفعلية ليس حقن رمز, وهنا عدد قليل من الخيارات.

  1. استخدام متغير الحجم الذاكرة المشتركة.الخاص كعب يحصل حجم و إما اسم أو التعامل مع الذاكرة المشتركة.هذا هو مناسبة إذا كنت في حاجة فقط تبادل البيانات مرة واحدة. علما بأن حجم الذاكرة المشتركة شريحة لا يمكن تغييرها بسهولة بعد الخلق.
  2. استخدام المسمى.الخاص كعب يحصل اسم أو التعامل مع الأنابيب.ثم يمكنك استخدام مناسب بروتوكول تبادل متغير الحجم كتل - على سبيل المثال ، كتابة size_t على طول ، تليها الرسالة الفعلية.أو استخدام PIPE_TYPE_MESSAGE و PIPE_READMODE_MESSAGE, ومشاهدة ERROR_MORE_DATA لتحديد مكان الرسائل الغاية.هذا هو مناسبة إذا كنت في حاجة لتبادل البيانات عدة مرات.

تحرير 2:وهنا رسم كيفية تطبيق مقبض أو مؤشر تخزين كعب:

.db B8            ;; mov eax, imm32
.dl handle_value  ;; fill this in (located at the start of the image + one byte)
;; handle value is now in eax, do with it as you will
;; more code follows...

يمكن أيضا استخدام اسم ثابت, الذي هو على الارجح أبسط.

يمكنك استخدام الذاكرة المشتركة

هل حاولت استخدام أنابيب (الذاكرة) أو حتى التسلسل (على الأشياء الخاصة بك)?يمكنك استخدام الملفات لإدارة الذاكرة بين العمليات.مآخذ هي أيضا جيدة للحصول على الاتصالات بين العمليات.

تعيين ذاكرة هو الطريق للذهاب ، حتى أنك لا تحتاج إلى إنشاء الدائم مساحة الذاكرة, الذاكرة قطاع يخرج من النطاق عند جميع عمليات تبادل يتم إيقاف تشغيل.هناك طرق أخرى أيضا.وسيلة سريعة وقذرة من تمرير البيانات من التطبيق ج إلى آخر فقط استخدام نظام التشغيل.في سطر الأوامر اكتب app1 | app2.هذا يسبب app2 أن تكون وجهة الإخراج من التطبيق1 أو المنخفض على printf الأمر من التطبيق1 سترسل إلى app2 (وهذا ما يسمى الأنابيب).

يمكنك محاولة استخدام دفعة.بين العمليات التواصل بين العمليتين.ولكن لحقن رمز في القائمة سابقا ، وليس برامج معتمدة ، ربما سيكون لديك لاستخدام @bdonlan طريقة استخدام WriteProcessMemory.

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

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

انظر هذا MSDN عينة المادة للحصول على بعض الأفكار حول كيفية استخدام الذاكرة المشتركة الفضاء للسيطرة على العالم.إيه, واجهة مع البرامج القديمة.أو أيا كان :) حظا سعيدا مهما كنت في نهاية المطاف القيام!

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