كتلة معلومات مؤشر الترابط Win32

كتلة معلومات الخيط ( TIB ) أو كتلة بيئة الخيط ( TEB ) هي بنية بيانات في نظام التشغيل Win32 على معالجات x86، تخزن معلومات حول الخيط قيد التشغيل حاليًا . وهي مشتقة من بنية مماثلة في نظام التشغيل OS/2 ، ومتوافقة معها على أنظمة 32 بت . [ 1 ]

لا يوجد توثيق رسمي لـ TIB في أنظمة Windows 9x . يتضمن Windows NT series DDK (وكذلك تطبيق MinGW / ReactOSNT_TIB ) بنية بيانات winnt.hتوثق الجزء المستقل عن النظام الفرعي. حتى قبل توثيق TIB بشكل فعلي، بدأت العديد من التطبيقات باستخدام حقوله التي تُعد جزءًا من واجهة برمجة التطبيقات (API) . يُشار إلى الحقل الأول الذي يحتوي على إطار SEH ، على وجه الخصوص، بواسطة الكود الذي ينتجه مُصرّف Microsoft نفسه. [ 1 ] الجزء الخاص بنظام Win32 الفرعي من TEB غير موثق، لكن Wine يتضمن تعريفًا لـ TEB winternl.h. [ 2 ]

يمكن استخدام TIB للحصول على معلومات كثيرة حول العملية دون استدعاء واجهة برمجة تطبيقات Win32. ومن الأمثلة على ذلك محاكاة [اسم العملية] GetLastError(). GetVersion()ومن خلال المؤشر إلى PEB، يمكن الوصول إلى جداول الاستيراد (IAT)، ومعاملات بدء تشغيل العملية، واسم الصورة، وما إلى ذلك. ويتم الوصول إليه من سجل مقطع FS في أنظمة Windows 32 بت، ومن GS في أنظمة Windows 64 بت.

محتويات ملف TIB على نظام التشغيل ويندوز

يستند هذا الجدول إلى عمل Wine على مكونات نظام التشغيل Microsoft Windows الداخلية. [ 2 ]

بايت/ النوعالإزاحة (32 بت، نظام الملفات)الإزاحة (64 بت، GS) إصدارات ويندوزوصف
مؤشرFS:[0x00]GS:[0x00]ويندوز 9x وإن تيإطار معالجة الاستثناءات المهيكلة الحالي (SEH)

ملاحظة: يستخدم إصدار 64 بت من نظام التشغيل Windows عملية فك المكدس التي تتم في وضع النواة بدلاً من ذلك.

مؤشرFS:[0x04]GS:[0x08]ويندوز 9x وإن تيقاعدة المكدس / أسفل المكدس (عنوان عالي)
مؤشرFS:[0x08]GS:[0x10]ويندوز 9x وإن تيحد المكدس / سقف المكدس (عنوان منخفض)
مؤشرFS:[0x0C]GS:[0x18]العهد الجديدSubSystemTib
مؤشرFS:[0x10]GS:[0x20]العهد الجديدبيانات الألياف
مؤشرFS:[0x14]GS:[0x28]ويندوز 9x وإن تيخانة بيانات عشوائية
مؤشرFS:[0x18]GS:[0x30]ويندوز 9x وإن تيالعنوان الخطي لـ TEB
نهاية الجزء المستقل عن نظام التشغيل NT ؛ الأجزاء أدناه تعتمد على Win32
مؤشرFS:[0x1C]GS:[0x38]العهد الجديدمؤشر البيئة
مؤشرFS:[0x20]GS:[0x40]العهد الجديدمعرّف العملية (في بعض توزيعات ويندوز، يُستخدم هذا الحقل كـ DebugContext)
4FS:[0x24]GS:[0x48]العهد الجديدمعرف الخيط الحالي
مؤشرFS:[0x28]GS:[0x50]العهد الجديدمعالج RPC نشط
مؤشرFS:[0x2C]GS:[0x58]ويندوز 9x وإن تيالعنوان الخطي لمصفوفة التخزين المحلية للخيط
مؤشرFS:[0x30]GS:[0x60]العهد الجديدالعنوان الخطي لكتلة بيئة العملية (PEB)
4FS:[0x34]GS:[0x68]العهد الجديدرقم الخطأ الأخير
4FS:[0x38]GS:[0x6C]العهد الجديدعدد الأقسام الحيوية المملوكة
مؤشرFS:[0x3C]GS:[0x70]العهد الجديدعنوان سلسلة اتصال عميل CSR
مؤشرFS:[0x40]GS:[0x78]العهد الجديدمعلومات عن خيوط Win32
124FS:[0x44]GS:[0x80]NT، نبيذمعلومات عميل Win32 (NT)، بيانات user32 الخاصة (Wine)، 0x60 = LastError (Win95&98)، 0x74 = LastError (WinME)
مؤشرFS:[0xC0]GS:[0x100]العهد الجديدمحجوز لـ Wow64. يحتوي على مؤشر إلى FastSysCallفي Wow64.
4FS:[0xC4]GS:[0x108]العهد الجديداللغة الحالية
4FS:[0xC8]GS:[0x10C]العهد الجديدسجل حالة برامج FP
216FS:[0xCC]GS:[0x110]NT، نبيذمحجوز لنظام التشغيل (NT)، بيانات kernel32 الخاصة (Wine) هنا: FS:[0x124] 4 مؤشر NT إلى بنية KTHREAD( )ETHREAD
4FS:[0x1A4]GS:[0x2C0]العهد الجديدرمز الاستثناء
18FS:[0x1A8]GS:[0x2C8]العهد الجديدمكدس سياق التنشيط
24FS:[0x1BC]GS:[0x2E8]NT، نبيذبايتات احتياطية (NT)، بيانات ntdll الخاصة (Wine)
40FS:[0x1D4]GS:[0x300]NT، نبيذمحجوز لنظام التشغيل (NT)، بيانات ntdll الخاصة (Wine)
1248FS:[0x1FC]GS:[0x350]NT، نبيذGDI TEB Batch (نظام التشغيل)، البيانات الخاصة vm86 (النبيذ)
4FS:[0x6DC]GS:[0x838]العهد الجديدمنطقة GDI
4FS:[0x6E0]GS:[0x840]العهد الجديدقلم GDI
4FS:[0x6E4]GS:[0x848]العهد الجديدفرشاة GDI
4FS:[0x6E8]GS:[0x850]العهد الجديدمعرف العملية الحقيقي
4FS:[0x6EC]GS:[0x858]العهد الجديدمعرف الموضوع الحقيقي
4FS:[0x6F0]GS:[0x860]العهد الجديدمعالج العملية المخزن مؤقتًا في GDI
4FS:[0x6F4]GS:[0x868]العهد الجديدمعرّف عملية عميل GDI (PID)
4FS:[0x6F8]GS:[0x86C]العهد الجديدمعرّف مؤشر ترابط عميل GDI (TID)
4FS:[0x6FC]GS:[0x870]العهد الجديدمعلومات لغة خيوط GDI
20FS:[0x700]GS:[0x878]العهد الجديدمخصص لتطبيق المستخدم
1248FS:[0x714]GS:[0x890]العهد الجديدمحجوز لـ GL (انظر مرجع النبيذ للاطلاع على التفاصيل الداخلية) [ 2 ]
4FS:[0xBF4]GS:[0x1250]العهد الجديدقيمة الحالة الأخيرة
532FS:[0xBF8]GS:[0x1258]العهد الجديدUNICODE_STRINGالمخزن المؤقت الثابت
مؤشرFS:[0xE0C]GS:[0x1478]العهد الجديديُعرف أيضًا باسم DeallocationStack، وهو يُحدد عنوان البداية الفعلي لمخزن المكدس، والذي يُحدد بدوره الحد الأقصى الحقيقي للمكدس. هذا الحد أقل ببضع صفحات من حقل حد المكدس، لأن الأخير يتضمن صفحات الحماية المستخدمة لإدارة نمو المكدس. [ 3 ]
مؤشر[]FS:[0xE10]GS:[0x1480]العهد الجديدفتحات TLS، 4/8 بايت لكل فتحة، 64 فتحة
8FS:[0xF10]GS:[0x1680]العهد الجديدروابط TLS ( LIST_ENTRYالبنية)
4FS:[0xF18]GS:[0x1690]العهد الجديدVDM
4FS:[0xF1C]GS:[0x1698]العهد الجديدمحجوز لـ RPC
4FS:[0xF28]GS:[0x16B0]العهد الجديدوضع خطأ الخيط ( RtlSetThreadErrorMode)
4FS:[0xF78]GS:[0x1748]العهد الجديدبايتات المكدس المضمونة
هذا ليس الجدول الكامل؛ راجع مرجع Wine للاطلاع على جميع الحقول حتى FS:[0xfb4] / GS:[17c8]. [ 2 ] تعمل إصدارات Windows الأحدث على توسيع حجم TIB، ليصل إلى 0x1000/0x1838 في Windows 10. وقد أُزيلت بعض الحقول الملحقة، مما أدى إلى تعريفات متضاربة. [ 4 ]

يشير نظام الملفات (FS) (للأنظمة 32 بت) أو نظام الملفات (GS) (للأنظمة 64 بت) إلى ملف TIB مُضمّن في كتلة بيانات تُعرف باسم TDB (قاعدة بيانات الخيوط). يحتوي ملف TIB على سلسلة معالجة الاستثناءات الخاصة بالخيط ومؤشر إلى TLS (التخزين المحلي للخيط). يختلف التخزين المحلي للخيط عن التخزين المحلي للغة C.

معلومات المكدس المخزنة في TIB

يجب أن يكون بإمكان العملية تحريك مكدس سلاسلها طالما أنها تُحدّث المعلومات المخزنة في جدول معلومات السلاسل (TIB) وفقًا لذلك. تُعدّ بعض الحقول أساسية في هذا الشأن: قاعدة المكدس، وحدود المكدس، ومكدس إلغاء التخصيص، وبايتات المكدس المضمونة، والمخزنة على التوالي عند الإزاحات 0x8و 0x10و 0x1478في 0x174864 بت. تقرأ وظائف نواة ويندوز المختلفة هذه القيم وتكتبها، خاصةً لتمييز تجاوزات المكدس عن أخطاء صفحات القراءة/الكتابة الأخرى (ستؤدي قراءة أو كتابة صفحة محمية ضمن حدود المكدس في بايتات المكدس المضمونة إلى توليد استثناء تجاوز المكدس بدلاً من انتهاك الوصول). يُعدّ مكدس إلغاء التخصيص مهمًا لأن واجهة برمجة تطبيقات ويندوز تسمح بتغيير عدد الصفحات المحمية: SetThreadStackGuaranteeتسمح الدالة بقراءة المساحة الحالية وتوسيعها. لقراءتها، تقرأ الحقل GuaranteedStackBytes، ولتوسيعها، تستخدم لإلغاء تخصيص صفحات المكدس. DeallocationStackقد يؤدي تعيين حدود المكدس دون تعيين SetThreadStackGuaranteeإلى سلوك غير متوقع في . على سبيل المثال، سيتم استبدال حدود المكدس بقيم خاطئة. تستدعي مكتبات مختلفة SetThreadStackGuarantee، على سبيل المثال، يستخدمها .NET CLR لإعداد مكدس سلاسلها.

الوصول إلى TIB

يمكن الوصول إلى TIB الخاص بالخيط الحالي كإزاحة لسجل المقطع FS (x86) أو GS (x64).

ليس من الشائع الوصول إلى حقول TIB عن طريق إزاحة من FS:[0]، بل يتم أولاً الحصول على مؤشر مرجعي خطي ذاتي إليها مخزن في FS:[18h]. يمكن استخدام هذا المؤشر مع عمليات حسابية على المؤشرات أو تحويله إلى مؤشر بنية .

باستخدام Microsoft Windows SDK أو ما شابه، يمكن للمبرمج استخدام دالة مضمنة معرفة في winnt.hnamed NtCurrentTebوالتي تُرجع عنوان كتلة معلومات مؤشر الترابط الحالية كـ NT_TIB *. [ 5 ]

فيما يلي طرق الوصول البديلة لبنى IA-32 :

// gcc (تجميع مضمن على نمط AT&T). void * getTIB ( void ) { register void * pTIB ; #if defined(__x86_64__) || defined(__amd64__) __asm__ ( "movq %%gs:0x30, %0" : "=r" ( pTIB )); #elif defined(__i386__) __asm__ ( "movl %%fs:0x18, %0" : "=r" ( pTIB )); #else #error بنية غير مدعومة #endif return pTIB ; }
// gcc (مساحات العناوين المسماة، كما هو الحال في إصدار التجميع المضمن على -O1 أو -ftree-ter). void * getTIB ( void ) { #if defined(__x86_64__) || defined(__amd64__) #ifndef __SEG_GS #error إصدار GCC غير مدعوم #endif return * ( void * __seg_gs * ) 0x30 ; #elif defined(__i386__) #ifndef __SEG_FS #error إصدار GCC غير مدعوم #endif return * ( void * __seg_fs * ) 0x18 ; #else #error بنية غير مدعومة #endif }
// Microsoft C __declspec ( naked ) void * getTIB () { __asm ​​mov EAX , FS : [ 18 h ] __asm ​​ret }
// استخدام وظائف مايكروسوفت الداخلية بدلاً من التجميع المضمن (يعمل مع معماريتي X86 و X64) void * getTIB () { #ifdef _M_IX86 return ( void * ) __readfsdword ( 0x18 ); #elif _M_AMD64 return ( void * ) __readgsqword ( 0x30 ); #else #error معمارية غير مدعومة #endif }

مراجع

  1. 1 2 بيترك، مات (مايو 1996). "تحت الغطاء" . مجلة أنظمة مايكروسوفت . مؤرشف من الأصل في 14 يونيو 2009. تم الاسترجاع في 7 يوليو 2010 .
  2. 1 2 3 4 "wine winternl.h: typedef struct _TEB" . GitHub . wine-mirror. 29 أكتوبر 2019.
  3. "نظرة فاحصة على صفحة حماية المكدس" . 3 فبراير 2022.
  4. تشابيل، جيف. "TEB" .
  5. "دالة NtCurrentTeb" . وثائق مايكروسوفت . تم الاطلاع عليها بتاريخ 20 نوفمبر 2019 .

للمزيد من القراءة