Win32 API

حذف رد پای یک ویروس!

سلام دوستان!برنامه نویسان و برنامه ننویسان،تی ام یو ای ها و غیر تی ام یو ای ها!

این اولین جلسه Win32API هست.امروز می خواهیم رد پای یک ویروس رو از سیستممون پاک کنیم، ولی رد پای چه ویروسی؟؟؟؟

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

این ویروس به این صورت عمل می کنه که فایل های شما رو هم سیستمی  و هم مخفی می کنه ، وقتی فایل ها این بلا سرشون بیاد باید برید Folder Option و بعد سربرگ View اون وسط ،مسط ها تیک Hide protected operating system files  رو بردارید تا بتونید فایل ها و پوشه ها رو یه جورایی ببینید ، ولی حتی بعد از این کار هم خیلی از برنامه ها نمی تونن فایل شما رو پیدا کنن و آیکونی براش نمایش نمی دن

در این حالت بد ترین اتفاقی که میافته اینه که شما می رید رو فایل یا پوشه مورد کلیک راست می کنید تا برید تیک Hidden رو بردارید ولی می بینید که نمیشه (چون فایل سیستمیه ) و  این حالتیه که انگار یه لگن آب یخ روتون خالی کرده باشن :)، بهترین کاری که میشه در این موقع انجام داد فرستادن چند فحش برای شادی روح برنامه نویسان مایکروسافته !

خب سوالی که پیش میاد اینه که این فایل (چه فایل معمولی ،چه پوشه)چی جوری هم مخفی شده و هم سیستمی ، و اگه با برنامه ای میشه این کار رو کرد با برنامه ای نمیشه عکس این کار رو کرد؟؟؟

اینجاست پای Win32API میاد وسط (شاید هم به اون شکل نیاد وسط ، به قولی همیشه راه سومی هم هست :) )

ولی API چیست؟؟؟

API یعنی Application Programming Interface

در حقیقت API مجموعه از توابع است که به برنامه نویس کمک می کنه که یه سری کارا  رو خودش انجام نده بلکه از توابع آماده استفاده کنه ، Win32API توابعی هستند که سیستم عامل ویندوز (اگه بشه اسمش رو گذاشت سیستم عامل :) ) در اختیار ما قرار می ده ، 

Win32API کلی تابع داره که همه جور کاری میشه باهاشون کرد تو ویندوز ، یه نمونه اش همین آقا (یا خانم ، نمی دونم ) ویروسه که ذکر خیرش بود!

یه نمونه اش همون پنجره ،منجره های ای که میرید تو ویژوال استدیو زارت درگ اند دراپ می کنید و حالش رو می برید ( بله ، اینا هم win32api هستند ، منتها این بار محیط برنامه نویسی داره ازشون استفاده می کنه بدون اینکه به روی ما بیاره)

و ...

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

kernel32.DLL

user32.DLL

Shell32.DLL

,... کلی از این دی ال ال ، می ال ال های مزخرف!!!!!!!!!

امروز ما می خواهیم برای یه بار هم که شده از این توابع استفاده کنیم ، آرزو به دل نمونیم!

می خواهیم توی #C از همین توابع استفاده کنیم تا رد پای اون ویروسه بده رو حذف کنیم.

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

یک:

استفاده از API 

اولین کاری که برای استفاده از توابع API باید انجام بدیم اینه که صریحاً این موضوع رو به #C بگیم:) ، به صورت زیر :

دومین کار اینه که امضای تابعی که می خواهیم ازش استفاده کنیم رو بیاریم،اینجا سخت ترین قسمت کاره به چند دلیل:

1) باید بدونیم از چه تابعی می خواهیم استفاده کنیم!!!!!!!

2) باید بدونیم این تابعی که می خواهیم ازش استفاده کنیم کجا قرار داره!!!!

3) باید امضای دقیقش رو بلد باشیم

برای مثال برای اینکاری که ما می خواهیم انجام بدیم ما می خواهیم صفات فایل رو تغییر بدیم ، برای اینکار باید از تابع زیر استفاده کنیم:

SetFileAttributes

همچنین باید بدونیم که این تابع تو kernel32.dll قرار گرفته.

امضاش رو هم باید بدونیم که به صورت زیره:

حالا باید بدونیم چه جوری میشه به #C گفت که " آقا ما می خواهیم برنامه ممون این تابع رو بشناسه" !!!!!!

برای اینکار اول dll مربوطه رو لود می کنیم ( با استفاده از DllImport ) و بعد هم امضای تابع رو به static extern میاریم ، یعنی اینکه بدنه این تابع یه جای دیگه وجود داره!

این جور تعریف متد رو باید بزاریم کنار بقیه متد  ها (چون در عمل فرقی با هم نباید داشته باشن)!

خب این تابع دو تا پارامتر می گیره:

اولی آدرس فایل

دومی صفتی که می خواهیم به فایل اعمال کنیم ، چند تا از صفت ها به صورت زیر هستند:

Archive      0x20

Hidden       0x2

Noraml       0x80

Readonly     0x1

System       0x4

اگه بخواهیم چند تا صفت رو به یک فایل اعمال کنیم این مقادیر رو با هم OR می کنیم ( با استفاده از | )

برای مثال همین ویروسه!!! این کار رو می کرد:

که file_path مسیر همون فایل بدبختیه که دچار اون سرنوشت شوم میشه (همی مخفی هم سیستمی)

و ما برای رفع این مشکل باید این کار رو بکنیم:

که file_path آدرس فایلیه که می خواهیم طلسمش رو بشکونیم :) 

خب بیایید همه این حرف ها رو بزاریم کنار هم و دست به کار شیم ، اول برید تو #C یه پروژه جدید ایجاد کنید(من اسمش رو گذاشتم MakeVisible) ، یه فریم طراحی کنید به صورتی که یه TextBx و دو تا دکمه داشته باشه ، یه چیزی تو مایه های این:

حالا برید اون مقدار کد هایی که لازمه تا امضای تابع رو تو برنامه ممون داشه باشیم بزنید:

حالا باید یکی از دکمه ها رو عملیاتی کنیم ، برای مثال روی دکمه ONE دوبار کلیک می کنیم و کد زیر رو می زنیم:

خب تا همینجا ، به اون چیزی که می خواستیم رسیدیم ، اگه برنامه رو اجرا کنید و آدرس فایلی که به صورت سیستمی مخفی شده رو توی TextBox وارد کنید و رو دکمه ONE کلیک کنید ، فایل مورد نظر باید به صورت یک فایل معمولی در بیاد.

ولی خب بزارید یه مقدار چیزای بیشتری یاد بگیریم:

1) اول اینکه برای این کاری می خواستیم انجام بدیم لازم نبود win32API بلد باشیم ، با استفاده از خود #C هم می تونستیم صفت های فایل رو عوض کنیم ، ولی خب هدف آشنایی با win32API بود ، در ضمن همیشه اینطوری نیست که بشه به جای استفاده از win32API یک روش جایگزین پیدا کرد.

و اما روش جایگزین:

برای تغییر صفت فایل می تونستیم به صورت زیر عمل کنیم ( که نیاز به استفاده از دی ال ال ،می ال ال هم نداره):

2) دوم ، بیایید یه کم بیشتر با برنامه نویسی حال کنیم ، برای اینکار دکمه ALL رو هم عملیاتی می کنیم ، می خواهیم کاری کنیم که اگه رو این دکمه کلیک کردیم و آدرسی فایلی که وارد کردیم مربوط به یک پوشه بود ، اون پوشه و تمام محتویات فایل های داخلیش به صورت normal در بیان ، برای اینکار اول روی ALL دوبار-کلیک می کنیم و کد زیر رو توش می زنیم:

تابع recNormal یه تابع بازگشتیه که خودمون می نویسیمش ، این تابع به صورت بازگشتی هی چک می کنه اگه زیر پوشه ای وجود داشته باشه برای اون زیر پوشه ها مجدداً خودش رو فراخوانی می کنه! (همین)

اگه دوست داشتید می تونید تابع بازگشتی زیر رو تغییر بدید و با نسخه غیر بازگشتیش رو با استفاده از پشته بنویسید ، در هر صورت این جور کارا دیگه به عهده خودتون :)!

اولین کاری باید بکنید اینه که IO رو به برنامه اضافه کنید:

using    System.IO

بعد هم نوشتن تابع بازگشتی که هلوهه :)!

تابع بازگشتی یه پارامتر به صورت string می گیره که آدرس فایله ،

وقتی وارد تابع بازگشتی می شیم اولین کاری که می کنیم اینه که همین فایل رو به صورت normal در میاریم:

دومین کاری که می کنیم اینه که همین تابع رو برای تمام فایل های داخلی این فایل هم فراخوانی می کنیم (البته اگه این آدرس مربوط به یک پوشه باشه میشه یه همچین کاری کرد)

برای به دست آوردن اسم تمام فایل های داخلی از Directory.getFiles استفاده می کنیم:

سومین کار اینه که همون کار بالا رو برای پوشه های داخلی هم انجام بدیم:

 

{

D:

خب اینم از این ، تو جلسه های بعد سعی می کنیم کارای بهتری با win32API انجام بدیم.

کد رو هم می تونید از اینجا دانلود کنید:

http://safecomp.persiangig.com/document/MakeVisible.rar

---------------------------------------------------------------------------------------------




گزارش تخلف
بعدی