سؤال

باستخدام Windows Hooks ، أرسل رسائل إلى طلبي ، والتي يتم إخطارها بأحداث Windows بواسطة كل تطبيق على النظام.

لتنفيذ مارشال معلمات الرسائل ، أستخدم الذكريات المشتركة. مكالمات العملية الخارجية DuplicateHandle, ، ولكن لمشاركة المقبض مع مثيل التطبيق الخاص بي ، يجب أن يتصل OpenProcess مع متطلبات امتياز Process_DUP_Handle.

في الواقع ، يكون كل تطبيق قادرًا على إرسال الرسائل باستخدام هذه البنية ، حتى لو كنت بحاجة إلى تمكين SEDEBUGPRIVILEGE إلى العملية الخارجية. إنه يعمل في الواقع ، باستثناء عملية "Explorer" ، التي لا تحتوي على رمز Sedebugprivilege ...

وثائق تعديل ttokenprivileges تنص على:

لا يمكن أن تضيف وظيفة AdjustOkenPrivileges امتيازات جديدة إلى رمز الوصول. يمكنه فقط تمكين أو تعطيل الامتيازات الحالية للرمز المميز. لتحديد امتيازات الرمز المميز ، اتصل بوظيفة getTokenInformation.

لذا ، فإن السؤال هو ... كيفية إضافة رمز SEDEBUGPRIVILEGE إلى عملية "Explorer" ، أو بدلاً من ذلك ، كيفية السماح "Explorer" بالاتصال OpenProcess(PROCESS_DUP_HANDLE, FALSE, pId)?

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

المحلول

لا أفهم لماذا لا تستخدم اسم الشيئ ذكريات مشتركه. إذا كانت كائنات الذاكرة المشتركة الخاصة بك تحتوي على اسم ، فيمكن فتح هذه الكائنات دون استخدام DuplicateHandle.

إذا كان عليك استخدام DuplicateHandle وتحتاج أن تكون قادرًا على الاستخدام OpenProcess(PROCESS_DUP_HANDLE, FALSE, pId) داخل أي عملية أجد أنك يجب ألا تستخدمها SeDebugPrivilege. بدلا من ذلك يجب عليك يعطي الأذن من PROCESS_DUP_HANDLE للجميع لهذه العملية مع pId. إذا قمت بإنشاء عملية يمكنك تحديد واصف الأمان. إذا تم إنشاء العملية بالفعل ، فيمكنك استخدامها OpenProcess, GetSecurityInfo (يرى http://msdn.microsoft.com/en-us/library/aa446654.aspx) و SetSecurityInfo لتعديل واصف الأمن للعملية.

لاختبار هذا النهج ، يمكنك فقط بدء تشغيل المستكشف (انظر http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx) مع الحقوق الإدارية ، علامة تبويب الأمان المفتوحة للعملية المحددة (العملية مع pId) وتعديل واصف الأمن. بعد ذلك ستكون جميع العمليات قادرة على استخدامها OpenProcess(PROCESS_DUP_HANDLE, FALSE, pId) دون تمكين SeDebugPrivilege.

نصائح أخرى

هل هذا ما تحاول إنجازه؟

  1. قم بإنشاء كتلة من الذاكرة المشتركة في العملية "الخارجية".
  2. استخدم DupLicateHandle لإنشاء مقبض لتلك الذاكرة في التطبيق الخاص بك
  3. استخدم رسالة نافذة لإرسال قيمة المقبض إلى التطبيق الخاص بك
  4. الوصول إلى الذاكرة المشتركة في التطبيق الخاص بك

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

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