تفکرات صفر و یکی

نوشته های من در مورد سیستم عامل، درایور نویسی، مهندسی معکوس، امنیت و هر چیز سطح پایین دیگر

تفکرات صفر و یکی

نوشته های من در مورد سیستم عامل، درایور نویسی، مهندسی معکوس، امنیت و هر چیز سطح پایین دیگر

آخرین نظرات

چگونه با Device Simulation Framework یک USB مجازی بسازیم

دوشنبه, ۹ تیر ۱۳۹۳، ۰۹:۲۷ ق.ظ

اخیرا برای پروژه ای می خواستم یک دستگاه مجازی USB بسازم. این دستگاه باید مثل دستگاه واقعی عمل می کرد. در واقع یکسری خصوصیاتی که در هنگام متصل کردن دستگاه USB به کامپیوتر (اصطلاحا host) بین این دو رد و بدل میشود  را بتوان به طریقی شبیه سازی کرد. می دونستم داخل بسته WDK فرم ورکی وجود داره که این قبیل کارها را می توان با آن انجام داد ولی هیچ موقع فرصتی پیدا نمی  کردم که باهاش کار کنم. به هر حال این پست معرفی است برای این فرم ورک.

دنبال آموزشی برای استفاده از این فرم ورک بودم که این مقاله را پیدا کردم که به نظرم برای معرفی این فرم ورک مناسب بود برای اینکه اینجا ترجمه ای ازش قرار بدهم.


این فرم ورک در کنار بخش های مختلفی که دارد دارای یک درایور از نوع Lower Filter Driver می باشد(قبلا مختصری در پست device stack توضیح دادم فیلتر درایور چیست). این درایور برای USB Controller در ویندوز نوشته شده است که کارش شبیه سازی تمام ارتباط ها و فعالیت هایی است که ویندوز با یک دستگاه واقعی USB انجام می دهد.  در واقع از دید درایور هیچ تفاوتی بین دستگاه ایجاد شده با DSF و یک دستگاه واقعی وجود ندارد.

حالا چگونه این فرم ورک می تواند دستگاه USB را شبیه سازی کند بدون آنکه آن را بشناسد؟ در واقع این فرم ورک تمام ارتباطات انجام گرفته را به یک برنامه سطح کاربر انتقال می دهم که این برنامه سطح کاربر می تواند به هر زبانی که از COM (Component Object Model) پشتیبانی می کند نوشته شود. به این صورت می توانید رفتار دستگاه شبیه سازی شده را کنترل کنید. در تصویر زیر ارتباط بین بخش های مختلف قابل مشاهده است. (عکس برگرفته از MSDN)

نصب DSF

DSF همراه بسته WDK است که از سایت ماکروسافت قابل دانلود می باشد (من در این پست در مورد WDK و لینک های دانلودش توضیحاتی داده ام). که فقط روی ویندوزهای نسخه XP Sp2 به بالا (نسخه های x64 هم شامل می شود) قابل نصب است. (در مقاله به این نکته اشاره می شود که DSF همراه WDK نصب نمی شود و باید جداگانه آن را نصب کرد. در WDK ورژن 7.1 اینگونه نیست ولی اگر ورژنی از WDK استفاده میکنید که به این صورت بود از پوشه dsf داخل WDK فایل  dsfx86runtime.msi یا dsfx64runtime.msi را نصب کنید.).

 بعد از نصب با cmd به مسیر زیر بروید

\Program Files\dsf\softehci

و این دستور را وارد کنید.

softehcicfg.exe

این دستور باعث ایجاد یک USB Controller مجازی در device tree (رجوع به آموزش در مورد device stack) می شود. که می توانید در Device Manager آن را ببینید. سیستم ممکن است از شما برای این دستگاه جدید درخواست درایور کند در این صورت مسیر C:\Windows را به آن بدهید. بعد از اینکه درایورها به درستی نصب شوند شما باید در Device Manager دو دستگاه جدید به نام های Microsoft USB 2.0 EHCI Host Controller Simulator و USB Root Hub را مانند شکل زیر ببینید.

استفاده از VBScript برای نوشتن دستگاه ها

برای شبیه سازی دستگاه ها،‌ DSF یکسری componennts بر پایه آبجکتهای COM می سازد . مانند Devices, Configurations, Interfaces, Endpoints, Descriptors و غیره. اگر قبلا firmware برای USB نوشته باشید می دانید منظورم از این عبارات چیست (اگر اطلاعات بیشتری در این مورد می خواهید می توانید مستنداتی که اینجا قرار گرفته را بخوانید.). شما همچنین می توانید componennts های خود را بنویسید و هر دستگاه USB ای را شبیه سازی کنید. همراه frameware یکسری سورس از نحوه درست کردن این قبیل دستگاه ها قرار گرفته که از این مسیر بسته WDK قابل دسترسی هستند.

[WINDDK Directory Path]\src\test\dsf\usb

برای استفاده از هر کدام احتیاج به یک زبان برنامه نویسی دارید که از اینترفیس های COM پشتیبانی کند.

برای نمونه مثالی که برای کیبرد آماده شده است نگاهی بیاندازیم. برای این کار به مسیر زیر بروید

\Program Files\dsf\usbhid

و دستور زیر را وارد کنید

cscript Create1.1Kbd.wsf

یکسری مراحل است که باید دنبال کنید. اگر برای اولین بار است که این کار را انجام می دهید ویندوز ممکن است سوالی در مورد نصب درایورهای دستگاه های جدید از شما بپرسد. این اسکریپت این دو دستگاه با نام های Generic USB Hub و  USB Microsoft Natural Keyboard را می سازد که که در تصویر پایین قابل مشاهده است

قبل از اینکه دستگاه ایجاد شده را حذف کنید می توانید با ابزار IRP_TRACKER نگاهی به IRP های رد بدل شده بیاندازید. برای این کار ابزار را اجرا کنید از منوی File گزینه Select Device را انتخاب کنید. بعد از لیست تیک کنار \Device\kbdclass را بزنید.  با این کار IRPهایی مربوط به Keyboard را می توانیم مشاهده کنیم.

و با اجرای این دستور داخل یک cmd  دیگر

cscript Use1.1Kbd.wsf

می توان به Keyboard جدید درخواست خود را ارسال کنید. با فشردن کلید های کیبرد خنده خروجی این ابزار بعد از وارد کردن عبارت "Hello World"

  • موافقین ۲ مخالفین ۰
  • ۹۳/۰۴/۰۹
  • ۵۷۹۶ نمایش
  • آرش اسلامی

DSF

Device Simulation Framework

USB

Virtual USB

نظرات (۱۲)

فقط میتونم بگم دمت گرم.
پاسخ:
ممنون :)
سلام . مرسی عالی بود

با این آموزش میشه یه سخت افزار که به شکل com با کامپیوتر ارتباط برقرار می کنه رو درایورشو نوشت و ساخت?

یه جور USB DONGLE !
پاسخ:
خیر نمی شود
سلام.
من مدتی هست که دارم روی قضیه ساخت دستگاه های مجازی مطالعه میکنم اما هنوز به مطلب و مبنع و حتی راهی برای رسیدن به هدفم هم نرسیدم..
هدف من ساخت یک دستگاه مجازی مثلا یک موس هست بطوری که بتوانم دستور های لازم را با استفاده از C# به آن بدهم در حقیقت برنامه سی شارپ من بازی کننده نقش دستگاه باشد.

نکته: من دنبال سروس آماده و یا غیره نیستم میخواهم روش کار و منابعی و راهی که باید برای رسیدن به این هدف دارم را پیدا کنم.

ممنون میشم اگر راهنمایی بفرماید.
پاسخ:
سلام
باید توضیح بیشتری بدین، مثلا هدف چیه دقیقا؟ این موس مجازی قراره تو چه محیطی استفاده بشه؟ اینکه میگین تو #C دستور بدم یعنی مثلا بگین بور فلان مختصات کلیک کن و مثال های مشابه؟
با تشکر
محیط مورد استفاده فقط سیستم عامل ها ماکروسافت و ویندوز 7 و 8 و 8.1 است.
مثال موس مثال جالبی نبود چون میشه با دستور های API سیستم عامل اون رو تغییر داد و خوب شاید غیر منطقی به نظر برسه که با وجود اینکه میشه از دستور ها .net و یا استفاده از api سیستم عامل میتوان رویداد سخت افزاری موس را کنترل کرد چه نیازی به ساخت یک دستگاه مجازی باشه!

هدف: ساخت دستگاه مجازیه که رویداد های اون دستگاه در سی شارپ قابل دسترسی باشه.

یک مثال عینی تر : درساخت یک وبکم مجازی ما نیاز به تصویر داریم که خروجی وبکم آنرا به سیستم عامل بدهد. اگر فقط یک دستگاه مجازی وبکم داشته باشم پس تصویری که قرار است نمایش داده شود را از کجا به سیستم بدهیم. اینجاست که پای برنامه سی شارپ و یا هر برنامه ی سطح بالای دیگه مطرح میشه که نمایش عکس رو در سیستم مجازی شبیه سازی کنه.

برای این مورد میشه مثال های خیلی زیادی زد. مثلا یک بلندگو مجازی یا شاید در بهتر بود یک جوی استیک را مثال میزدم که نیاز به فشرده شدن دکمه دارد.

 مثلا در مثال همان موس ما نیاز داریم که event های موس اتفاق افتد یک موس تنها شبیه سازی شده بدون آنکه کلیکی انجام دهد و یا حرکتی کند موس نخواهد بود(همان طور که گفتم این مثال مثال خوبی نیست )

برنامه C# در حقیقت کنترل کننده اصلی آن درایور مجازی ست. یعنی رویداد ها را ایجاد میکند. (و در صورت لزوم خود نیز به آن پاسخ خواهد داد.)
پاسخ:
خوب DSF ابزار مناسبی هست برای کاری که می خواهید انجام دهید از این جهت که هر دستگاه با رابط USB رو میشه باهاش شبیه سازی کرد. ولی متاسفانه در ویندوز ورژن ۸ به بعد پشتیبانی نمیشه من هم راستش تو اون نسخه از ویندوز امتحان نکردم ببینم همین نسخه dsf بدون مشکل قابل استفاده است یا نه.  خودتون این قضیه رو م یتونید امتحان کنید.

اگر DSF روی نسخه های 8 و 8.1 کار نکرد :
از اونجایی که قبلتر گفتین دنبال سورس آماده نیستین یک راه حل برای مشکل شما مطالعه همین DSF هست. DSF همانطور که داخل پست هم گفتم از یه lower filter driver استفاده میکنه برای شبیه سازی کنترلر usb. که خوب نوشتن درایور براش کمی پیچیده و زمان بر خواهد بود.

ممکنه راه های بهتری باشه ولی به خاطر نداشتن وقت کافی فعلا نمی تونم نظر دقیق تری بدیم.

موفق باشید
دست شما درد نکنه
خیلی به دردم خورد
دست شما درد نکنه
خیلی به دردم خورد
یه برنامه نمونه هم میتونین معرفی کنین که مثلا شبیه سازی رو انجام داده باشه؟
منظورم کد سورس هست
پاسخ:
سلام
ممنون

داخل همین بسته که معرفی کردم مثال و کد وجود دارد. مثلا مسیری که داخل مقاله هم اشاره کردم

اینجا:
C:\Program Files\dsf\usbhid

داخل پوشه یکسری VBScript و فایل dll است. سورس همین فایل های dll هم در این مسیر است

C:\WinDDK\7600.16385.1\src\test\dsf\usb

که با هم یک مثال کامل می شه.
سلام وتشکر از مطلب مفید تان
من می خواستم در محیط ویندوز 10 برنامه ای داشته باشم که دانگل ویا قفل های سخت افزاری که به پورت usb وصل می شوند شبیه سازی کرده وقابل استفاده باشد مثلا یک موس بی سیم را در نظر بگیرید که با استفاده از دانگل خود روی سیستم مورد استفاده قرار می گیرد حال با استفاده از این برنامه می خواهم بعد از شبیه سازی  اگر دانگل موس را از روی سیستم برداریم موس به کتر خود ادامه دهد.

با تشکر
پاسخ:
سلام
قفل سخت و مساله موس که مثلا زدید دو تا موضوع مجزا هستند و ارتباط چندانی به هم ندارند.
در مورد موس از اونجایی که تکنولوژی به کار رفته Wi-Fi نیست که در لپ تاپ بکار رفته در نتیجه بدون دانگل مخصوص موس نمیشه با موس ارتباط برقرار کرد.
در مورد قفل سخت افزاری هم روش کلی نیست که همه قفل ها را بشه شبیه سازی کرد و بستگی به مدل ممکنه بشه نرم افزاری پیدا کرد که این کار رو انجام بده.
سلام. و مرسی از مطالب خوبتون.
مقاله ای راجع به درایور نویسی واسه دانگل مقاله ای میشناسین؟ هیچ اطلاعاتی حتی برای شروغ هم پیدا نکردم.


پاسخ:
سلام

دانگل ها قالبا یک firmware اختصاصی دارن در نتیجه برای کدنویسی اینطوریه که شرکت سازنده دانگل همراهش یک SDK و داکومنت های لازم را میدهد تا بتوان برای دانگل کد نوشت و ارتباط برقرار کرد.
با سلام
من میخوام فلش مموری خودم رو روی با همه ی مشخصات و سریال فلش شبیه سازی کنم
آیا همچین چیزی امکانش هست؟
سلام
وقت بخیر
من دو تا دسته بی سیم دارم که هر دوتا دانگلشون متاسفانه خراب شده
خواستم بدونم راهی هست که بتونم بدون استفاده از دانگل با بلوتوث یا وای فای خوده لپ تاپ ستشون کنم
خیلی برام مهمه لطفا اگه کسی میدونه کمک کنه
مرسی
با سلام
با این روش میشه مثلا یک موس رو  به pc متصل کرد و جرکات موس رو از طریق اینترنت   به pc  دیگه فرستاد .. یعنی اطلاعات ناشی از موقعیت مکانی موس رو که pc اول تجزیه و تحلیل میکنه عینا گرفت و از طریق ایجاد پورت  مجازی usb  و با استفاده از  بستر  اینترنت   به  pc دوم منتقل کرد و جرکت موس در pc دوم مثل حرکت موس در pc اولی باشه؟
پاسخ:
سلام

بله شدنی است فقط در مورد سوال شما روی pc دوم که دریافت کننده است این simulation پیاده میشه و روی pc اول از روش های دیگه برای دریافت اطلاعات موقعیت و رفتار موس باید استفاده کرد.

با سلام.من نرم افزار دارم که با دانگل usb باز میشه و متاسفانه دانگل را در یک حادثه از دست دادم.کسی میتونه این دانگل را دوباره درست کنه.هزینه این کار رو میدم 09123095307

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی