PDA

View Full Version : سوال: عکس العمل به محض اتصال فلش مموری



pooya1072
جمعه 07 اسفند 1388, 20:24 عصر
سلام
می خوام برنامه ای بنویسم که به محض نصب یک فلش مموری به سیستم , محتوای اون رو تست کنه و اگه یک فایل autorun.inf پیدا کرد اون رو پاک کنه; قسمت اصلیش که مشکل منه اینه که چطوری برنامه ای بنویسم که بعد از اجرا توی حافظه منتظر بمونه تا پیام وصل فلش به پورت رو دریافت کنه.اگه کسی می تونه , این تکه از برنامه یا الگوریتم و توابع مورد نیاز رو برام مشخص کنه....از چند تا مهندس کامپیوتر پرسیدم,ولی نتونستن جواب قانع کننده ای بهم بدن.بهتر بگم یا بلد نبودن یا من متوجه نشدم.پس بی زحمت یه مقدار ساده و روان توضیح بدید.
تاکید کنم میخوام برنامه رو بنویسم...دنبال آنتی ویروس نیستم
با تشکر فراوان از شما

crazyfull
جمعه 07 اسفند 1388, 21:32 عصر
با اين GetLogicalDriveStrings API ميتونيد ليست تمام درايوها رو بگيريد و با اين تابع GetDriveType هم ميتونيد نوع درايوها رو به دست بياريد
مونتها بايد از تايمر استفاده کنيد تا از اضافه شدن درايو جديد با خبر بشيد

pooya1072
شنبه 08 اسفند 1388, 03:39 صبح
دوست عزيز
من تا اينجا مي دانم كه بايد برنامه در حافظه منتظر پيامي از پورت ها بماند...تايمر در اينجا اصلا استفاده اي نداره...از بابت تابع ها هم ممنون...ولي مشكل من قسمت اول برنامه است كه عرض كردم...در هر حال ممنون:چشمک:

majjjj
شنبه 08 اسفند 1388, 07:46 صبح
سلام
اقا پویای عزیز جناب crazyfull از مدیران سایت ایران ویج هست اگه ایشون فرمودن باید تو یک تایمر چک کنید منظورشون این بوده که شما مرتب درایورهای جدید رو چک کنی که این کار رو بوسیله یک تایمر انجام بدی
البته این کار رو هم با api ها میتونی انجام بدی و بعدش با کمک api ها فایل اتوران روی فلش رو تشخیص بدی
البته این دلیل نمیشه که ویروسی وجود داره و شما باید پروسس ها رو کنترل کنی

DoctorJay
شنبه 08 اسفند 1388, 16:14 عصر
مشکل شما حل شده دوست عزیز .

دقیقا از تایمر باید استفاده کرد و توی اون تایمر باید از تابع GetDriveType استفاده کنی .

زمانیکه فلش مموری وصل بشه شرط getdrivetype برقرار می شه .

موفق باشی

shask00l
شنبه 08 اسفند 1388, 16:44 عصر
بنظر دوستان استفاده از تایمر برای انجام این کار بار اضافه برای پردازنده ایجاد نمیکنه ؟
فرض کنید فرآیند کشف درایو جدید (استفاده از دوتابع معرفی شده فوق) بوسیله یک تایمر انجام بشه که هر 1 ثانیه اجرا میشه . بنظر من این کار منطقی نیست و باید راه بهتری هم باشه .

parselearn
شنبه 08 اسفند 1388, 16:55 عصر
http://barnamenevis.org/forum/showthread.php?t=31150&highlight=usb
http://barnamenevis.org/forum/showthread.php?t=179774&highlight=usb
http://barnamenevis.org/forum/showthread.php?t=200766&highlight=usb

DoctorJay
یک شنبه 09 اسفند 1388, 12:39 عصر
بنظر دوستان استفاده از تایمر برای انجام این کار بار اضافه برای پردازنده ایجاد نمیکنه ؟
فرض کنید فرآیند کشف درایو جدید (استفاده از دوتابع معرفی شده فوق) بوسیله یک تایمر انجام بشه که هر 1 ثانیه اجرا میشه . بنظر من این کار منطقی نیست و باید راه بهتری هم باشه .

منطقی باشین . به هرحال باید یه عاملی چک کنه که فلش مموری به USB متصل شده یا نه ؟

تایمر لازم نیست حتما 1 باشه , تایمر 3000 واسه اینکار مناسب, همچینم سرعت نمی گیره .

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

جز Timer نشه این کار و انجام داد !

اگه پیشنهادی دارین و بشه این کار توسط Timer انجام نشه خوب بگن دوستان که ما هم

استفاده کنیم .

lordarma
یک شنبه 09 اسفند 1388, 12:49 عصر
منطقی باشین . به هرحال باید یه عاملی چک کنه که فلش مموری به USB متصل شده یا نه ؟

تایمر لازم نیست حتما 1 باشه , تایمر 3000 واسه اینکار مناسب, همچینم سرعت نمی گیره .

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

جز Timer نشه این کار و انجام داد !

اگه پیشنهادی دارین و بشه این کار توسط Timer انجام نشه خوب بگن دوستان که ما هم

استفاده کنیم .

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

DoctorJay
یک شنبه 09 اسفند 1388, 14:51 عصر
خود ویندوز با چه روشی شناسایی می کند؟:متفکر:
فکر نمی کنم تایمر باشد،
احتمالا باید روشی برای گرفتن اطلاعات از پورت باشد...
راستی آنتی ویروس ها به وجود تایمر با ضریب تکرار بالا گیر می دهد،
من هم مایلم همچین کدی را پیدا کنم،
موفق باشید

ببینید , ویندوز بین تمام برنامه های خودش ارتباطات تعریف شده ای داره .

ما اومدیم با یک ابزار برنامه ای نوشتیم, که تایمر یکی از امکاناتی هست که به ما داده شده .

ما نمی تونیم به سیستم عامل بگیم که وقتی فلش مموری وصل شد به برنامه ی من یه پیغام بفرست !!

وظیفه ی برنامه ی شماست که چک کنه که فلش مموری وصل شده یا نه !

راجع به آنتی ویروس هم اینجوریا نیست . اگه چند تا عامل مشکوک پیدا کنه تو برنامتون

اونوقت گیر میده . ( من خودم تو کار ویروس و کرم بودم :خجالت: ( آماتور ) )

بنابراین, من فکر نمی کنم این مسئله بدون تایمر ساده حل بشه , مگه اینکه دوستی

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

جمیعا موفق باشید :لبخندساده:

pooya1072
یک شنبه 09 اسفند 1388, 15:26 عصر
دوستان عزیز
در اینکه مشکل با تایمر حل نمی شه شکی ندارم...در جواب به دوستمون باید بگم دقیقا میشه که از سیستم عامل خواست که با اضافه شدن یک پورت یا هر تغییری در وضعیت سیستم یه پیام به برنامه ما بفرسته..توی آنتی ویروس ها هم از همین روش استفاده میشه.فرض کنید یه فلش مموری آلوده رو به سیستم وصل کنید.یعنی آنتی ویروس باید صبر کنه تا زمانش برسه که فلش رو تست کنه؟ ولی می بینید که با وصل شدن یه فلش آلوده آنتی ویروس سریع فایل autorun مربوط به ویروس رو پاک می کنه.از توابع api میشه استفاده کرد.ولی اگه دقیقا ندونیم کدوم توابعه خیلی سخته.من هم به همین دلیل مزاحم دوستان شدم.دارم به جوابش نزدیک میشم.اگه پیداش کردم برنامش رو میزارم توی سایت..

Babak.Hassanpour
یک شنبه 09 اسفند 1388, 15:48 عصر
بدون تایمر هم میشه
به راحتی افزودن 3 خط کد
بفرمایید:


Private Sub SysInfo1_DeviceArrival(ByVal DeviceType As Long, ByVal DeviceID As Long, ByVal DeviceName As String, ByVal DeviceData As Long)
MsgBox DeviceType & " " & DeviceID & " " & DeviceName
End Sub



فقط کامپوننت Microsoft Sysinfo 6 رو اضافه کنید.
از اینجا به بعد واسه در آوردن نام درایو میشه از روش های مختلفی استفاده کرد.مهم این بود که برای تشخیص اتصال از تایمر استفاده نکنیم که سربار به سیستم اعمال نشه که نکردیم.
موفق باشید و در راه نوشتن ویروس استفاده نکنید.

IamOverlord
یک شنبه 09 اسفند 1388, 16:29 عصر
دوست عزیز در ادامه ی کد بالا چه طور می شه نام درایو وصل شده رو به دست بیاریم؟ :متفکر:

Babak.Hassanpour
یک شنبه 09 اسفند 1388, 17:13 عصر
فکر می کنم قبلا یکی اینو گذاشته بود.شایدم نه.به هر حال بفرمایید.


Option Explicit
Dim drvletter As String

Private Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long

Public Function DriveLetter()
Dim DriveNum As String 'To cycle through drive letters in order
Dim DriveType As Long 'To hold the type of drive it is
Dim TempDrive As String 'Holds the drive info in the loop
DriveNum = 64 'Prime the variable to be used in the loop
Do
DriveNum = DriveNum + 1 ' start at drive zero.

DriveType = GetDriveType(Chr$(DriveNum) & ":\")
' If we are past C: and the drive type is indeterminate, exit the Loop
If DriveType = 1 And DriveNum > 67 Then Exit Do
Select Case DriveType
Case 2: TempDrive = Chr$(DriveNum) & " - Removable Drive"
drvletter = Chr$(DriveNum)

Case 3: TempDrive = Chr$(DriveNum) & " - Fixed Drive"
Case 4: TempDrive = Chr$(DriveNum) & " - Remote Drive"
Case 5: TempDrive = Chr$(DriveNum) & " - CD-ROM Drive"
Case 6: TempDrive = Chr$(DriveNum) & " - RAM Drive"
End Select

Loop

End Function

Private Sub Command1_Click()
Call DriveLetter
MsgBox drvletter
End Sub

pooya1072
دوشنبه 10 اسفند 1388, 02:55 صبح
سلام مجدد
منظور من رو متوجه نشديد.جهت اطلاع اين برنامه بايد از نوع برنامه هاي مقيم در حافظه باشه.برنامه دوست عزيزم بابك هم ديدم.اين برنامه براي هر بار تست كردن بايد يك بار command botton رو كليك كرد.يه سوال ...مگه براي اينكه يه آنتي ويروس يه ويروس رو بگيره شما بايد دكمه ويروس گيري برنامه رو كليك كنيد؟؟؟؟يه كم دقت كنيد...برنامه از اين حرفها خيلي سخت تره.اگه برنامه رو بنويسيد متوجه ميشيد.روال برنامه اينه كه بايد برنامه ما بعد از اجرا توي حافظه قرار بگيره و منتظر بمونه...يعني برنامه رو بده به سيستم عامل.شما با سيستم كارهاي مختلف مي كنيد ...بدون اينكه مشخص باشه برنامه شما در حال اجراست.مثل يه ويروس.به عنوان مثال داريد با سيستمتون يه فيلم نگاه ميكنيد.همزمان يه نفر فلش مموري رو به پورت usb وصل ميكنه.اينجاست كه برنامه شما متوجه ميشه و به شما يه پيغام ميده.خواهش مي كنم به روال بالا كاملا دقت كنيد.اين برنامه با 10 - 12 خط برنامه نوشته نمي شه.خيلي سنگين تره
اميدوارم كاملا خواسته من رو درك كرده باشيد

Babak.Hassanpour
دوشنبه 10 اسفند 1388, 14:37 عصر
سلام مجدد
منظور من رو متوجه نشديد.جهت اطلاع اين برنامه بايد از نوع برنامه هاي مقيم در حافظه باشه.برنامه دوست عزيزم بابك هم ديدم.اين برنامه براي هر بار تست كردن بايد يك بار command botton رو كليك كرد.يه سوال ...مگه براي اينكه يه آنتي ويروس يه ويروس رو بگيره شما بايد دكمه ويروس گيري برنامه رو كليك كنيد؟؟؟؟يه كم دقت كنيد...برنامه از اين حرفها خيلي سخت تره.اگه برنامه رو بنويسيد متوجه ميشيد.روال برنامه اينه كه بايد برنامه ما بعد از اجرا توي حافظه قرار بگيره و منتظر بمونه...يعني برنامه رو بده به سيستم عامل.شما با سيستم كارهاي مختلف مي كنيد ...بدون اينكه مشخص باشه برنامه شما در حال اجراست.مثل يه ويروس.به عنوان مثال داريد با سيستمتون يه فيلم نگاه ميكنيد.همزمان يه نفر فلش مموري رو به پورت usb وصل ميكنه.اينجاست كه برنامه شما متوجه ميشه و به شما يه پيغام ميده.خواهش مي كنم به روال بالا كاملا دقت كنيد.اين برنامه با 10 - 12 خط برنامه نوشته نمي شه.خيلي سنگين تره
اميدوارم كاملا خواسته من رو درك كرده باشيد

به پست 12 (http://barnamenevis.org/forum/showpost.php?p=921318&postcount=12) دقت نکردید گویا ؟!!
در این کد شما فقط از اتصال دستگاه جدید آگاه می شوید.بعد از اونه که باید به دنبال مسیر درایو باشید.همونطور که می بینید قسمت اول؛ بدون تایمر پیاده سازی شده.احتیاج به کلیک روی دکمه هم نداره.

pooya1072
سه شنبه 11 اسفند 1388, 14:55 عصر
دوستان عزیز
من شاغل در شرکتی هستم که یه کامپیوتر در اختیار دارم ,از اونجایی که کار من به صورت شیفت انجام می شه,لذا این کامپیوتر هم در هر شیفت در اختیار یه نفر دیگه است.همکاران دیگه زیاد به کار با کامپیوتر وارد نیستند و همشون هم یک فلش مموری در اختیار دارن و فرت و فرت فلش هاشون رو که در 99% اوقات ویروسیه رو به سیستم می زنن و ما هفته ای یه بار باید در خواست رفع اشکال رو به امور کامپیوتر شرکت بدیم.لابد می پرسید چرا از آنتی ویروس استفاده نمی کنیم,استفاده می کنیم و هر روز هم آپدیت میشه.ولی در تنظیمات اون گزینه access protection رو غیر فعال کردند .(سیستم تحت شبکه است) و ما دسترسی به تنظیمات آنتی ویروس نداریم,لذا من تصمیم گرفتم برنامه ای بنویسم که به محض ورود فلش مموری فایل autorun.inf اون رو حذف کنه...چراکه در 99% موارد این فایل روی فلش مموری..تاکید می کنم...روی فلش مموریها مربوط به ویروسیه که قراره اجرا بشه....دوستان راه های مختلفی ارائه دادن...ولی راه اصلی و صحیحش رو که برخی دوستان مهربونه ما میدونن به دلایل انسان دوستانه ارائه نمی کنن.حالا اگه کسی دیگه از دوستان راه رو می دونه یا توابع مورد نیازش رو میشناسه یه زحمتی بکشه با دید مثبت در اختیار بقیه دوستان بذاره.

xxxxx_xxxxx
سه شنبه 11 اسفند 1388, 20:39 عصر
دوستان راه های مختلفی ارائه دادن...ولی راه اصلی و صحیحش رو که برخی دوستان مهربونه ما میدونن به دلایل انسان دوستانه ارائه نمی کنن.حالا اگه کسی دیگه از دوستان راه رو می دونه یا توابع مورد نیازش رو میشناسه یه زحمتی بکشه با دید مثبت در اختیار بقیه دوستان بذاره.
سلام،
کدی که در پست شماره 12 قرار داره، کاملاً عملی هست، بدون نیاز به تایمر، هر وقت فلش مموری رو متصل کنید، دستور Msgbox اجرا میشه. به شرط آنکه برنامه هم در حال اجرا باشه!
در اون کد، DeviceType نوع دستگاهی هست که به سیستم متصل شده. برای این کار شما، اگر مقدار این پارامتر برابر با 2 باشه یعنی دستگاه از نوع Portable بوده و می تونید فرض کنید که همون فلش مموری هست.

مقداری هم که در DeviceID قرار میگیره یک عدد صحیح از توان های 2 هست. (1 و 2 و 4 و 8 و 16 و 32 و 64 و ...)
این مقدار نشان دهنده letter درایو فلش هست. که به ترتیب اعداد فوق هست. (A و B و C و D و E و F و G و ...)
مثلاً اگر مقدار DeviceID برابر با عدد 512 باشه یعنی درایو فلشتون درایو J هست.

خب حالا که فهمیدید letter درایو فلش چی هست، میتونید تو root همون درایو فایل Autorun.inf رو با دستور kill پاک کنید.

Babak.Hassanpour
سه شنبه 11 اسفند 1388, 21:23 عصر
پیرو راهنمایی دوست و سرور گرانقدر جناب xxxxx_xxxxx برنامه مورد نظر شما به اینصورت در می آید:


Private Sub SysInfo1_DeviceArrival(ByVal DeviceType As Long, ByVal DeviceID As Long, ByVal DeviceName As String, ByVal DeviceData As Long)
On Error Resume Next
Kill Chr(CInt(Log2(DeviceID)) + 65) & ":\Autorun.inf"

End Sub
Private Function Log2(ByVal Number As Double) As Double
Log2 = Log(Number) / Log(2)
End Function

daniyal_1363
پنج شنبه 03 تیر 1389, 19:05 عصر
سلام

برای تکمیل کردن این بحث ...

2 تا سوال

1 - بعد از پاک شدن فایل Autorun.ini اگر فلش رو بلافاصله باز کنیم آیا فایل Exe که توسط Autorun.ini تعریف شده باز هم اجرا میشه ؟ (این کار توی درایور های معمولی سیستم تا زمانی که سیستم ریستار نشده اتفاق میفته یعنی اگه فایل Autorun.ini پاک هم بشه تا زمانی که سیستم ریستار نشده فایل exe اجرا میشه )

2 - چطوری بفهمیم که فایل Autorun.ini چه فایلی رو اجرا میکنه تا بتونیم اون رو هم پاک کنیم ؟:متفکر:

Babak.Hassanpour
پنج شنبه 03 تیر 1389, 19:27 عصر
در مورد قسمت اول چون خودم تست نکردم اظهار نظری نمی کنم
در مورد قسمت دوم به راحتی .کافیه دنبال عبارت :


open=

و رشته روبروی اون رو تا رسیدن به کاراکتر انتهای خط بخونید.این مسیر ونام فایل اجراییه که باید نام درایو رو بصورت:


x:\

به ابتدای اون اضافه کنید تا مسیر مطلق بدست بیاد.

daniyal_1363
پنج شنبه 03 تیر 1389, 19:52 عصر
در مورد قسمت اول چون خودم تست نکردم اظهار نظری نمی کنم
در مورد قسمت دوم به راحتی .کافیه دنبال عبارت :


open=

و رشته روبروی اون رو تا رسیدن به کاراکتر انتهای خط بخونید.این مسیر ونام فایل اجراییه که باید نام درایو رو بصورت:


x:\

به ابتدای اون اضافه کنید تا مسیر مطلق بدست بیاد.

خیلی ممنون ولی
اینکه باید به دنیال چه چیزی بگردم رو میدونم


اینکه چه جوری اون خط رو از اون فایل استخراج کنم نمیدونم ؟

یعنی چه جوری بفهمم که به "Open=" رسیدم و وقتی رسیدم چطوری آدرس کامل فایل اجرایی اون رو که با چند پسوند مختلف از جمله Com، Bat،Exe و ... میتونه باشه رو استخراج کنم ؟
یادمونم باشه که در اسم یک فولدر میشه از "." هم استفاده کرد (یعنی آدرس فایل ما میتونه چندتا ". " داشته باشه )

modirmasool
پنج شنبه 03 تیر 1389, 21:58 عصر
خیلی ممنون ولی
اینکه باید به دنیال چه چیزی بگردم رو میدونم


اینکه چه جوری اون خط رو از اون فایل استخراج کنم نمیدونم ؟

یعنی چه جوری بفهمم که به "Open=" رسیدم و وقتی رسیدم چطوری آدرس کامل فایل اجرایی اون رو که با چند پسوند مختلف از جمله Com، Bat،Exe و ... میتونه باشه رو استخراج کنم ؟
یادمونم باشه که در اسم یک فولدر میشه از "." هم استفاده کرد (یعنی آدرس فایل ما میتونه چندتا ". " داشته باشه )

منظورتون چیه!
ما که کاری به پسوند نداریم. ما باید هرچی که بعد از =open بود رو به عنوان مسیر در نظر بگیریم و اون رو پاک کنیم.

daniyal_1363
جمعه 04 تیر 1389, 11:27 صبح
منظورتون چیه!
ما که کاری به پسوند نداریم. ما باید هرچی که بعد از =open بود رو به عنوان مسیر در نظر بگیریم و اون رو پاک کنیم.

اگه خواستم باشیم بعد از "=Open" هر چی بود رو به عنوان مسیر در نظر بگیرم مطمناً در Autorun های مختلف نمی تونیم آدرس دقیق فایل بدست بیارم

همیشه باید همه جوانب رو در نظر بگیریم

این نمونه رو نگاه کنید




[AutoRun]
OPEN=setup.exe
ICON=AUTORUN.ico
action=AbestAPc
label=Software
shell\open\command=abesta.bat
shell\open=AbestA







بعد از "=Open" طبق نوشته شما آدرس فایل ما این میشه





setup.exe
ICON=AUTORUN.ico
action=AbestAPc
label=Software
shell\open\command=abesta.bat
shell\open=AbestA






من مشکل رو حل کردن

این نمونه علاوه بر پاک کردن فایل Autorun.inf فایل اجرایی که توسط فایل Autorun ادرس دهی شده رو هم پاک میکنه

ولی هنوزم کامل نیست به خاطر امکان وجود فایل Autorun.ini که دیگه وقتش رو ندارم
ولی ساختنش راحته

modirmasool
جمعه 04 تیر 1389, 11:54 صبح
شما خیلی راحت میتونین از input line استفاده کنین.

daniyal_1363
جمعه 04 تیر 1389, 17:40 عصر
شما خیلی راحت میتونین از input line استفاده کنین.

چطوری ؟ میشه توضیح بدین

modirmasool
جمعه 04 تیر 1389, 19:24 عصر
ببینین ما میتونیم بیایم با استفاده از Line Input به جای input کل یه خط رو بگیریم حالا با یه حلقه شروع میکنیم به خواندن خط های دفترچه اتوران و هرکدوم که اولش =open داشت رو ذخیره میکنیم و قسمت =open رو ازش کم میکنیم و در نهایت هرچی باقی مونده باشه مسیر فایل ویروسمون خواهد بود.