تجارب مع واجهة COM المخفية وآلية LxBus IPC في WSL. مستوحى بشكل كبير من مشروع lxss لمعلم النواة Alex Ionescu . هذا المشروع مجرد مفهوم، وليس برنامجًا مطورًا بالكامل ويجب استخدامه لأغراض الاختبار.
استنساخ هذا المستودع. افتح ملف الحل (.sln) أو ملف المشروع (.vcxproj) في Visual Studio وقم بإنشائه. بدلاً من ذلك، قم بتشغيل موجه أوامر مطور Visual Studio، وانتقل إلى المجلد المستنسخ وقم بتشغيل الأمر msbuild
. يمكن أيضًا إنشاء هذا المشروع باستخدام سلسلة أدوات mingw-w64. افتح الوحدة الطرفية في المجلد المستنسخ وقم بتشغيل الأمر make
. ستكون الثنائيات في مجلد /bin
.
قم بتنزيل الملف الثنائي من صفحة الإصدار، ولا توجد خطوات تثبيت مطلوبة. يعرض هذا المشروع فقط طرق COM المخفية والتي قد تتغير في إصدار Windows المستقبلي. يتوافق جدول COM vtable، المستخدم في هذا المشروع، مع أحدث إصدار من Windows 10 20H1 Insider Preview ، وهو الإصدار 18917 وما فوق. فيما يلي خيارات WslReverse:
Usage: WslReverse.exe [-] [option] [argument]
Options:
-b, --bus [Distro] Create own LxBus server (as administrator).
-d, --get-id [Distro] Get distribution ID.
-e, --export [Distro] [File Name]
Exports selected distribution to a tar file.
-G, --get-default Get default distribution ID.
-g, --get-config [Distro] Get distribution configuration.
-h, --help Show this help information.
-i, --install [Distro] [Install Folder] [File Name]
Install tar file as a new distribution.
-l, --list List all distributions with pending ones.
-r, --run [Distro] Run bash in provided distribution.
-S, --set-default [Distro] Set default distribution.
-s, --set-config [Distro] Set configuration for distribution.
-t, --terminate [Distro] Terminate running distribution.
-u, --uninstall [Distro] Uninstall distribution.
توجد معظم التعريفات في ملفات الرأس LxBus.h
و WinInternal.h
. تخطيط المشروع للملفات المصدر:
شائع:
الواجهة الأمامية:
الخلفية:
ملفات_لينكس:
وسكلي:
لاستخدام LxBus، قم باستيراد ملف التسجيل LxCoreFlags. ثم أعد تشغيل جهاز الكمبيوتر. قم بتجميع LxBusClient.c مع make
في WSL. قم بتنفيذ WslRevese باستخدام خيار -b
أو --bus
كمسؤول وLxBusClient كمستخدم جذر في WSL. يقوم هذان الثنائيان بتبادل بعض الرسائل بين WSL وجانب Windows باستخدام LxBus عبر. سائق LxCore. وهنا بعض منهم:
رقم الخطوة | خادم LxBus (كمسؤول) | عميل LxBus (كجذر) |
---|---|---|
1 | قم بتسجيل خادم LxBus، وانتظر العميل | افتح جهاز lxss، واتصل بالخادم |
2 | قراءة الرسالة من عميل LxBus | اكتب رسالة إلى خادم LxBus |
3 | اكتب رسالة إلى عميل LxBus | قراءة الرسالة من خادم LxBus |
4 | أنبوب مارشال W، يُقرأ من أنبوب R-end | Unmarshal W-end Pipe، اكتب رسالة |
5 | أنبوب مارشال R-end، اكتب إلى أنبوب W-end | Unmarshal أنبوب R-end، اقرأ الرسالة |
6 | إلغاء تنظيم واصفات ملفات الإدخال/الإخراج القياسية | واصفات ملفات الإدخال/الإخراج القياسية من Marshal |
7 | Unmarshal والحصول على PID من جانب العميل | المشير PID الحالي |
8 | رسالة وحدة التحكم المارشال | إلغاء تنظيم رسالة وحدة التحكم |
9 | إنشاء خادم LxBus غير مسمى | يتبع ... |
10 | رمز شوكة المارشال | رمز شوكة Unmarshal |
للحصول على شرح مفصل، راجع العرض التقديمي الذي قدمه Alex Ionescu @34min في BlackHat USA 2016. هناك العديد من الأشياء التي يمكن القيام بها باستخدام آلية LxBus IPC. ما هو الشيء المثير للاهتمام الذي تريد القيام به مع LxBus؟ ؟
يعمل هذا مع WSL1 فقط لأن LxCore لا يتعامل مباشرة مع WSL2. قم أولاً باستيراد ملف التسجيل LxCoreFlags. ثم قم بتمكين تصحيح أخطاء وضع kernel المحلي باستخدام هذين الأمرين كمسؤول وإعادة تشغيل جهاز الكمبيوتر.
bcdedit /debug on
bcdedit /dbgsettings local
يؤدي ذلك إلى تمكين بعض إشارات تسجيل DWORD. خلف الكواليس، يتحقق LxCore بشكل أساسي مما إذا كان كل من PrintSysLevel
و PrintLogLevel
صفرًا وأن TraceLastSyscall
موجود. بالنسبة إلى نفس الجهاز المضيف، استخدم DebugView كمسؤول أو استخدم KD لـ VM.
قم بتشغيل أي توزيع WSL1 وشاهد السجلات وكل مكالمات النظام وdmesg. الوظائف الكامنة وراء تنسيق السجلات هذه هي كما يلي:
DbgPrintEx(0, 0, "LX: (%p, %p) %s", PEPROCESS, PKTHREAD, Syscall);
DbgPrintEx(0, 0, "LX: (%p, %p) /dev/kmsg: %Z", PEPROCESS, PKTHREAD, Version);
DbgPrintEx(0, 0, "LX: (%p, %p) /dev/log: %d: %Z: %Zn", PEPROCESS, PKTHREAD, x, y, z);
DbgPrintEx(0, 0, "LX: (%p, %p) (%Z) %sn", PEPROCESS, PKTHREAD, Command, LxCoreFunction);
اسم المزود | دليل الموفر | اسم الملف |
---|---|---|
Microsoft.Windows.Lxss.Manager | {B99CDB5A-039C-5046-E672-1A0DE0A40211} | LxssManager.dll |
Microsoft.Windows.Lxss.Heartbeat | {0451AB4F-F74D-4008-B491-EB2E5F5D8B89} | LxssManager.dll |
Microsoft.Windows.Subsystem.LxCore | {0CD1C309-0878-4515-83DB-749843B3F5C9} | LxCore.sys |
Microsoft.Windows.Subsystem.Lxss | {D90B9468-67F0-5B3B-42CC-82AC81FFD960} | WSL.exe |
يستخدم هذا المشروع بعض التعريفات وأنواع البيانات من ما يلي. شكرا ل:
WslReverse مرخص بموجب رخصة جنو العامة v3. يتم توفير نسخة كاملة من الترخيص في الترخيص.
WslReverse -- Experiments with COM interface and LxBus IPC mechanism in WSL.
Copyright (c) 2018-19 Biswapriyo Nath
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.