هو أول الخيط الذي يحصل لتشغيل داخل Win32 عملية "الأولية الموضوع"?تحتاج إلى فهم دلالات
-
13-12-2019 - |
سؤال
إنشاء عملية استخدام CreateProcess()
مع CREATE_SUSPENDED
ثم المضي قدما لإنشاء التصحيح قليلا من التعليمات البرمجية داخل بعد عملية تحميل DLL و استدعاء دالة (المصدرة من أن DLL) باستخدام VirtualAllocEx()
(مع ..., MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE
), WriteProcessMemory()
, ثم اتصل FlushInstructionCache()
على أن التصحيح من الذاكرة مع رمز.
بعد أن أسميه CreateRemoteThread()
لاستدعاء هذا الرمز ، وخلق لي hRemoteThread
.يجب التحقق من أن التعليمات البرمجية عن بعد يعمل على النحو المنشود. ملاحظة: هذا الرمز يعود ببساطة, فإنه لا يدعو أي واجهات برمجة التطبيقات الأخرى من LoadLibrary()
و GetProcAddress()
, تليها يدعو المصدرة كعب وظيفة حاليا ببساطة إرجاع القيمة التي سوف ثم الحصول على تمرير مثل حالة خروج من الموضوع.
الآن يأتي غريبة الملاحظة:تذكر أن PROCESS_INFORMATION::hThread
لا تزال معلقة.عندما كنت ببساطة تجاهل hRemoteThread
's رمز الإنهاء و أيضا لا انتظر حتى خروج كل يذهب "بخير".روتين المكالمات CreateRemoteThread()
يعود PROCESS_INFORMATION::hThread
يحصل استؤنفت (عن بعد) برنامج يحصل في الواقع إلى تشغيل.
ومع ذلك ، إذا كنت الاتصال WaitForSingleObject(hRemoteThread, INFINITE)
أو القيام بما يلي (الذي له نفس التأثير):
DWORD exitCode = STILL_ACTIVE;
while(STILL_ACTIVE == exitCode)
{
Sleep(500);
if(!GetExitCodeThread(hRemoteThread, &exitCode))
break;
}
تليها CloseHandle()
وهذا يؤدي إلى hRemoteThread
قبل الانتهاء PROCESS_INFORMATION::hThread
يحصل استؤنفت العملية ببساطة "يختفي".وهو ما يكفي للسماح hRemoteThread
لإنهاء بطريقة أو بأخرى دون PROCESS_INFORMATION::hThread
تسبب عملية الموت.
هذا يبدو مثير للريبة مثل حالة سباق منذ ظل ظروف معينة hRemoteThread
قد يكون لا يزال أسرع وأكثر عملية من المرجح أن لا يزال "تختفي" ، حتى لو تركت الكود كما هو.
هل هذا يعني أن الموضوع الأول الذي يحصل على تشغيل في إطار عملية يصبح تلقائيا الأولية الموضوع أن هناك قواعد خاصة الابتدائي الخيط ؟
كنت دائما تحت انطباع بأن عملية ينتهي عند آخر خيط يموت, لا عندما خاصة موضوع يموت.
لاحظ أيضا: هناك دعوة إلى ExitProcess()
تشارك هنا بأي طريقة لأن hRemoteThread
يعود ببساطة ، PROCESS_INFORMATION::hThread
لا يزال موقوفا في حين أنا انتظر hRemoteThread
للعودة.
يحدث هذا في Windows XP SP3 32bit.
تحرير: لقد حاولت فقط Sysinternals عملية مراقبة لمعرفة ما يحدث وأنا لا يمكن التحقق من ملاحظاتي من قبل.حقن رمز لا تحطم أو أي شيء بدلا من ذلك أرى أنه إذا أنا لا أنتظر موضوع لا الخروج قبل إغلاق البرنامج حيث أصبح الرمز حقن.أنا أفكر ما إذا كانت الدعوة إلى CloseHandle(hRemoteThread)
يجب تأجيل أو شيء ...
تحرير+1: ليس CloseHandle()
.إذا تركت هذا مجرد اختبار سلوك لا تتغير عندما انتظار مؤشر ترابط إلى النهاية.
المحلول
أول موضوع لتشغيل ليست خاصة.
على سبيل المثال ، إنشاء وحدة التحكم التطبيق الذي يخلق تعليق الخيط و ينهي الموضوع الأصلي (عن طريق استدعاء ExitThread).هذه العملية لم تنتهي (على ويندوز 7 على أي حال).
أو جعل موضوع جديد انتظر لمدة خمس ثوان ثم الخروج.كما هو متوقع فإن هذه العملية سوف يعيش لمدة خمس ثوان والخروج عندما الثانوية ينهي الموضوع.
أنا لا أعرف ما يحدث مع المثال الخاص بك.أسهل طريقة لتجنب العرق هو جعل موضوع جديد استئناف الموضوع الأصلي.
المضاربة الآن أنا أتساءل عما إذا كان ما تفعلونه ليس من المرجح أن يسبب مشاكل على أي حال.على سبيل المثال, ماذا يحدث DllMain
ويدعو ضمنيا تحميل Dll ؟ هم بشكل غير متوقع يحدث على موضوع الخطأ, يتم تخطي, أم أنها أجلت حتى بعد التعليمات البرمجية تشغيل مؤشر الترابط الرئيسي يبدأ ؟
نصائح أخرى
احتمالات جيدة أن موضوع مع main
(أو ما يعادلها) وظيفة المكالمات ExitProcess
(إما صراحة أو في مكتبة وقت التشغيل). ExitProcess
, حسنا المخارج العملية بأكملها ، بما في ذلك قتل جميع المواضيع.منذ الخيط الرئيسي لا يعرف عن حقن رمز, لا تنتظر حتى الانتهاء.
أنا لا أعرف أن هناك طريقة جيدة لجعل الترابط الرئيسي الانتظار بالنسبة لك لإكمال...