عندما تريد البرامج التي تعمل على Linux استخدام الموارد التي يديرها نظام التشغيل (قراءة الملفات وإنشاء العمليات وما إلى ذلك) ، فإنها تقوم بإجراء مكالمات النظام إلى نظام التشغيل. تعمل استدعاءات النظام على مستوى النواة وتؤدي العمليات اللازمة ، تاركة التحكم مرة أخرى لبرنامج الاستدعاء. توفر أداة strace القدرة على تتبع مكالمات النظام هذه على Linux.
الاستخدام النموذجي لأمر الاستقامة
لمراقبة استدعاءات النظام لتطبيق ما ، ما عليك سوى استدعاء الأمر باستخدام دعامة بالتنسيق التالي:
دعامة ls / tmp
ومع ذلك ، غالبًا ما تكون هناك عمليات تبدأ قبل ذلك بكثير وتستمر في العمل في الخلفية. بسبب أي مشاكل ، قد ترغب في جمع معلومات إضافية مرتبطة بهذه العمليات. يمكنك إرفاق ملفات دعامة إلى أي تطبيق قيد التشغيل عن طريق إعطاء معرف العملية للعملية إلى -p معامل:
strace -p 2759
انتاج:
تتبع المواضيع والشوك من التطبيق
باستخدام strace ، يمكنك التحقق من جميع سلاسل العمليات والعمليات الفرعية الأخرى التي تمثل تفرعًا للتطبيق باستخدام -F علَم.
الدعامة -f -p 2759
انتاج:
تحقق من مكالمات نظام معينة مع دعامة
يمكن أن يكون إخراج الدعامة الافتراضي مزدحمًا جدًا لمتابعة في بعض الأحيان. إذا كنت تريد فقط تتبع مكالمات نظام معينة ، فيمكنك القيام بذلك باستخدام
-e معامل:strace -f -e trace = فتح ، كتابة ، إغلاق ، اتصال ،تحديد -p 19770
لتتبع استدعاءات النظام المتعلقة بعمليات الملفات فقط ، استخدم -e تتبع = ملف:
strace -e trace = ملف -p 19770
لتصفية مكالمات النظام المتعلقة بالشبكة فقط ، حدد -E trace = الشبكة في الأمر:
strace -e trace = الشبكة -p 19770
احصل على معلومات الوقت في ثوان
عند إخراج مكالمات النظام ، يمكنك استخدام ملف -t المعلمة للحصول على معلومات الوقت بدقة في ثوان. في معظم الأوقات ، لن تكون الدقة كافية لاحتياجاتك. في مثل هذه الحالات ، يمكنك استخدام ملف -ت المعلمة للحصول على معلومات الوقت بدقة ميكروثانية:
strace -tt ls / tmp
جمع إحصائيات حول مكالمات النظام
مع ال -ج المعلمة ، يمكنك جمع إحصاءات حول مكالمات النظام للمدة التي تريدها:
ستريس -f -c -p 19770
حفظ السجلات في ملف
إذا قمت بتشغيل strace لفترة طويلة وتريد فحص السجلات الناتجة بمزيد من التفاصيل لاحقًا ، فستحتاج إلى حفظ السجلات. مع ال -o يمكنك تحديد الملف الذي يجب أن يحفظ فيه التتابع السجلات:
strace -f -o /tmp/strace.log -e trace = ملف ls / tmp
عملية منع ptrace
باستخدام استدعاء نظام prctl ، يمكن لأي تطبيق تحت Linux أن يمنع نفسه من التحكم من قبل المستخدمين غير الجذر باستخدام ptrace. إذا مسح التطبيق ملف PR_SET_DUMPABLE وضع علامة لنفسه عبر prctl ، لن يتمكن المستخدمون بخلاف الجذر من التحكم في هذا التطبيق باستخدام ptrace ، حتى لو كان لديهم الحق في الإشارة إلى التطبيق.
يظهر أحد الاستخدامات الأكثر شيوعًا لهذه الميزة في برنامج وكيل مصادقة OpenSSH. وبالتالي ، فإن التحكم في التطبيق عن طريق تطبيق آخر بامتداد ptrace تم منعه عند مصادقة المستخدم.
ptrace والأمان
نظرًا لميزة ptrace المحددة في نموذج عملية Linux التقليدي ، فإن أي برنامج تقوم بتشغيله على نظامك مع المستخدم الخاص بك لديه السلطة لإدخال تعليمات برمجية ضارة فيه. من أبسط أداة xterm إلى تطبيقات متصفح الويب المتقدمة، يمكن أن تتحكم هذه البرامج الضارة في جميع التطبيقات الأخرى قيد التشغيل - بفضل استدعاء نظام ptrace - ونسخ المعلومات المهمة دون أن تلاحظ ذلك.
استجابة لهذا الموقف ، الذي لا يعرفه العديد من المستخدمين ، تم تطوير آلية حماية باستخدام وحدة الأمان المسماة ياما في نواة لينكس.
يمكنك التحكم في الاستجابة لاستدعاء نظام ptrace عبر /proc/sys/kernel/yama/ptrace_scope ملف. بشكل افتراضي ، يكتب هذا الملف القيمة 0.
القيم التالية مقبولة:
قيمة | المعنى |
0 | السلوك التقليدي: جميع التطبيقات التي لها الحق في ptrace يمكن التحقق منها. |
1 | ptrace مقيد: فقط الأصل المباشر للتطبيق أو تطبيقات تصحيح الأخطاء التي يسمح بها التطبيق بامتداد PR_SET_PTRACER الخيار لديها السيطرة. وهكذا ، فإن استخدامات gdb program_name و strace اسم البرنامج سيستمر في العمل ، لكنك لن تتمكن من إرفاق تطبيق قيد التشغيل بعد ذلك. |
2 | Ptrace لمسؤول النظام: فقط التطبيقات مع تعريف CAP_SYS_PTRACE الخاصية أو العمليات الفرعية التي تحدد ملف PTRACE_TRACEME الخيار مع prctl يمكن السيطرة عليها. |
3 | معاق تماما: لا ptrace مسموح به تحت أي ظرف من الظروف. إذا تم تعريف هذه الخاصية مرة واحدة ، فلا يمكنك تغييرها مرة أخرى في وقت التشغيل. |
لا يعرف العديد من المطورين أن التطبيقات يمكنها تعطيل ptrace عبر prctl ، باستثناء المستخدم الجذر. على الرغم من أن البرامج المتعلقة بالأمان مثل وكيل OpenSSH تؤدي هذه العمليات ، فلن يكون من الصواب توقع نفس السلوك من جميع البرامج التي تعمل على النظام.
مؤخرا، بعض توزيعات Linux بدأت في تعيين القيمة الافتراضية لـ ptrace_scope الملف الموصوف أعلاه إلى 1. وبالتالي ، مع تقييد عمليات التتبع ، يتم توفير بيئة عمل أكثر أمانًا في جميع أنحاء النظام.
باستخدام نموذج دعامة
سجل نموذج الطلب أدناه بالاسم ministrace.c. ثم يمكنك تجميعها باستخدام الأمر التالي:
مجلس التعاون الخليجي-oministraceministrace.c
شفرة:
#تضمن <sys / ptrace.h>
#تضمن <sys / reg.h>
#تضمن <sys / انتظر>
#تضمن <sys / types.h>
#تضمن <unistd.h>
#تضمن <stdlib.h>
#تضمن <stdio.h>
#تضمن <يخطئ>
#تضمن <سلسلة. h>
intwait_for_syscall(الطفل pid_t)
{
int الحالة؛
في حين (1) {
ptrace (PTRACE_SYSCALL، child، 0، 0) ،
waitpid (طفل ، &الحالة ، 0) ؛
إذا (WIFSTOPPED (الحالة) && WSTOPSIG (الحالة) & 0x80)
إرجاع0;
إذا (WIFEXITED (الحالة))
إرجاع1;
}
}intطفل(int أرجك شار ** ARGV)
{
شار * أرجس [argc +1];
memcpy (args ، argv ، argc * sizeof (شار*));
args [argc] = باطل;
ptrace (PTRACE_TRACEME) ،
قتل(getpid () ، SIGSTOP) ؛
إرجاع execvp (args [0] ، args) ؛
}intdo_trace(الطفل pid_t)
{
int الحالة ، syscall ، retval ؛
waitpid (طفل ، &الحالة ، 0) ؛
ptrace (PTRACE_SETOPTIONS ، طفل ، 0 ، PTRACE_O_TRACESYSGOOD) ؛
في حين(1) {
لو (wait_for_syscall (طفل)! = 0) فترة راحة;syscall = ptrace (PTRACE_PEEKUSER ، طفل ، sizeof (طويل) * ORIG_RAX) ؛
fprintf (stderr ، "طلب syscall (٪ d) = "، syscall) ؛لو (wait_for_syscall (طفل)! = 0) فترة راحة;
retval = ptrace (PTRACE_PEEKUSER ، طفل ، sizeof (طويل) * RAX) ؛
fprintf (stderr ، "٪د
"، retval) ؛
}
إرجاع0;
}
intالأساسية(int أرجك شار ** ARGV)
{
إذا (argc < 2) {
fprintf (stderr ، "الاستخدام:٪ s prog args
"، argv [0])؛
خروج(1);
}
pid_t child = fork () ؛
إذا (الطفل == 0) {
إرجاع do_child (argc-1، argv +1);
} آخر {
إرجاع do_trace (طفل) ؛
}
}
بعد تجميع التطبيق ، يمكنك تشغيل أي أمر باستخدام ministrace وفحص الناتج:
يمكنك استخدام الدعامة لأغراض عديدة
يمكن أن يساعد strace في العثور على الأخطاء في البرامج التي تستخدم موارد النظام دون داع. وبالمثل ، يمكن أيضًا الكشف عن الخاصية التي يعرضها البرنامج أثناء استخدام موارد نظام التشغيل.
نظرًا لأن strace يستمع مباشرةً إلى مكالمات النظام ، فإنه يمكن أن يكشف عن ديناميكيات وقت التشغيل بغض النظر عما إذا كان رمز البرنامج قيد التشغيل مفتوحًا / مغلقًا. من الممكن الحصول على فكرة عن سبب خطأ البرامج عند بدء استخدام الدعامة.
وبالمثل ، يساعدك strace في فهم سبب إنهاء البرنامج بشكل غير متوقع. لذلك ، يعد التعرف على strace أمرًا مهمًا جدًا في تطوير Linux kernel وإدارة النظام.
قم بإنشاء نظام تشغيل خاص بك باستخدام Linux من Scratch [Linux]
اقرأ التالي
مواضيع ذات صلة
- لينكس
- أوامر لينكس
- نواة لينكس
نبذة عن الكاتب

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