DuplicateHandle: بحاجة إلى OpenProcess ، ولكن يتم رفض الوصول
-
25-09-2019 - |
سؤال
باستخدام 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
.
نصائح أخرى
هل هذا ما تحاول إنجازه؟
- قم بإنشاء كتلة من الذاكرة المشتركة في العملية "الخارجية".
- استخدم DupLicateHandle لإنشاء مقبض لتلك الذاكرة في التطبيق الخاص بك
- استخدم رسالة نافذة لإرسال قيمة المقبض إلى التطبيق الخاص بك
- الوصول إلى الذاكرة المشتركة في التطبيق الخاص بك
إذا فهمت بشكل صحيح ، فأنت لست بحاجة إلى فتح المقبض على عملية التقديم الخاصة بك على الإطلاق. بدلاً من ذلك ، ما عليك سوى إعطاء كتلة الذاكرة المشتركة اسمًا حتميًا ، مثل sharedmem_xxx حيث يكون xxx هو PID للعملية الخارجية. ثم ، أرسل PID إلى التطبيق الخاص بك باستخدام رسالة نافذة. يمكن بعد ذلك إعادة إنشاء الاسم واستخدامه لفتح كتلة الذاكرة المشتركة.