سؤال

أنا أعرف /sbin /init لديه حماية خاصة ضد Sigkill و Sigstop من kernel لأسباب واضحة.

لقد حاولت إخبار kernel أنني أريد أن أتلقى sigstop مع IOCTL () (على غرار SIGABRT و SIGSEGV REQS في MAIN ()):

if (ioctl (0, KDSIGACCEPT, SIGSTOP) == 0) {
    nih_signal_set_handler (SIGSTOP, stop_handler);

ولكن لا تصل الإيقاف إلى Stop_Handler () (من كل ما أعرفه ، حيث أن NiH_Error () لم يتم طباعته في سجلات).

في stop_handler () ، أقوم بإعادة تعيين توقف التنهد إلى sig_dfl (وإلا فإنه سيعود إلى معالجنا على أي حال) ، ولكن هذا ربما يؤدي إلى تجاهله من قبل kernel مرة أخرى.

كيف أخبر kernel أريد أن توقف؟

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

المحلول

ستحتاج إلى إخراج علامة Signal_unkillable من أعلام Signal_Struct الخاصة ببنيتها المهمة.

افتراضيًا (أي دائمًا على أنظمة Linux غير المعدلة) تم تعيين علامة Signal_unkillable على أعلام Signal_struct الخاصة بـ Inist.

يمكنك كتابة وحدة kernel التي من شأنها أن تكسب هيكل مهمة init لتغييرها ، ثم يمكنك إرسال إشارة توقف إلى init.

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


التوضيح: هذا هو بنية in-kernel وليست جزءًا من مصدر init ، كما أنه لا يمكن الوصول إليه أو مرئيه من UsserPace. لتغييره ، ستحتاج إلى كتابة بعض رمز kernel أو تصحيح kernel. سيكون من التافهة إلى حد ما ، كما أتصور ، كتابة وحدة نواة تخترقها فقط.

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