PDA

View Full Version : تعیین میزان دسترسی به فایل و فولدر و درایو



Batman
پنج شنبه 24 بهمن 1387, 00:15 صبح
با سلام و خسته نباشید خدمت دوستان.
شاید در ابتدا به نظر بیاد که این تاپیک تکراریه.ولی واقعا به این شکل نیست.
میخوام سوالی رو مطرح کنم که شاید بارها مطرح و دربارش بحث شده اما هیچ نتیجه ای دربر نداشته.
چجوری میشه میزان دسترسی روی فایلها و فولدرها و درایو رو بررسی کرد.
مثلا یه فایل رو نشه حذف و ویرایش و یا کپی کرد و یا اینکه یه درایو رو full access و یا no access کرد مثل کارهایی که نرم افزار folder guard یا نرم افزارهایی شبیه به اون انجام میدن.
توی تاپیکهای دیگه همه دوستان فقط میگن که با توابع api میشه این کارها رو انجام داد.اما هیچکس نمیگه که چطوری.
خواهشا اگر کمک کاربردی دارین مطرح کنین و یا اینکه اگر راه حلی درباره استفاده از توابع api دارین پست بزنید.
با تشکر.

مهران موسوی
پنج شنبه 24 بهمن 1387, 00:38 صبح
دوست عزیز من هم خواستار گفتگو با دوستان در این زمینه بود در تاپیک زیر


http://barnamenevis.org/forum/showthread.php?t=147058

ولی متاسفانه یا کسی در این زمینه اطلاعاتی نداره یا دوستان همکاری نمیکنن ...

AliReza Vafakhah
پنج شنبه 24 بهمن 1387, 02:03 صبح
من هم با شما دوستان موافقم اما نمی دونم چرا اگر از دوستان همت کنن و جواب بدن، جوابی که میدن اینه :

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

حداقل اون هوک یا API رو یکی توضیح بده و یه نمونه کد بگذاره.

مهران موسوی
پنج شنبه 24 بهمن 1387, 04:29 صبح
من هم با شما دوستان موافقم اما نمی دونم چرا اگر از دوستان همت کنن و جواب بدن، جوابی که میدن اینه :

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

حداقل اون هوک یا API رو یکی توضیح بده و یه نمونه کد بگذاره.


هوک چاره ساز نیست .

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



CopyFileA
CopyFileExA
CopyFileW
CopyFileExW

MoveFileA
MoveFileW
MoveFileExA
MoveFileExW

MoveFileWithProgressA
MoveFileWithProgressW

CreateFileA
CreateFileW



تمامی توابع بالا رو هوک کردم ( در قالب یک DLL با Code Injection تابع LoadLibrary رو به پروسه ها تزریق کردم تا DLL بهشون تزریق بشه به قول معروف DLL Injection .... این روش با بیشتر برنامه ها مشکل داره و بعضی اوقات در هنگام کار برنامه ها ی مختلف باعث کرش کردنشون میشه و ... )

لازم به ذکر هست که من مدتهاست که از روشهای مختلف هوک به صورت حرفه ای در قالب های مختلف استفاده میکنم . این روش برای انجام این کار جوابگو هست ولی به هیچ عنوان بهینه نخواهد بود .

من برای این کار ( محدود کردن دسترسی و کپی برداری و ایجاد فایل در بعضی درایوها ) حتی یک سرویس کنترل کننده ی هوک ها رو نوشتم به این صورت که تمامی DLL های اینجکت شده رو به صورت هوشمند کنترل میکرد .. همه ی DLL ها Event داشتن و تا تابع های هوک شده صدا زده میشد با قرار دادن مقادیر خاص و از پیش تعرف شده توسط خودم در Global Variables سرویس کنترل کننده ی هوک ها رو با خبر میکردن و عملیات تعریف شده انجام میشد ... ولی متاسفانه چون CreateFile یک تابع مهم هست و برنامه ها برای مقاصد مختلف ازش استفاده میکنن این کار باعث شد که بعضی از برنامه ها دچار مشکل بشن از یک طرف پیاده سازی هوک ها برای نسخه های یونیکد توابع هم یک دردسر خاص خودش رو داشت و سر و کله زدن با مقادیر یونیکد اونم در دی ال ال های دلفی که اگه یکمی توی کد نویسی دقت نکنی حافظه از جانب داده های دینامیک سر ریز میشه و هزار تا مشکل پیش میاره !!! خلاصه این شد که نتیجه گرفتم هوک توی این زمینه نمیتونه کمک حال خوبی باشه ....

حالا شاید توابع بهتری برای هوک کردن باشه ولی تا اونجایی که تجربه ی من توی API Programing قد میده بهترین توابع برای محدود کردن ایجاد و کپی برداری از فایل در یک درایو خاص همینا بود ... البته چند تا تابع دیگه هم هست که اونا هم از این توابع برای کاراشون استفاده میکنن که وقتی اینا تحت کنترل هستن ÷س اونا هم نمیتونن از چشمان تیر بین سرویس کنترل کننده در برن .... !!! مثلا ( SHFileOperationA و نسخه ی یونیکد اون که از توابع CopyFile و MoveFile استفاده میکنن و .... )

بدون شک راه های استانداری یا API هایی برای این کار هست که برنامه های قفل گذاری بر روی درایو ها و .. از اونا استفاده میکنن .

اسم API ها و یک توضیح مختصرش هم موجود باشه ادم میره دنبالش و خلاصه حل میشه ولی متاسفانه دوستان یاری نمیکنن ....

منتظر همکاری دوستان هم هستیم .. معمولا اقای کشاورز توی این زمینه ها نظرات و نکات خوبی رو اشاره میکنن ولی نمیدونم چرا ازشون خبری نیست ... الله اعلم .... !!!

Felony
پنج شنبه 24 بهمن 1387, 06:38 صبح
من در مورد قفل کردن درایو و از دسترس در آوردنش قبلا تو تاپیک زیر بحث کردم و یه نمونه سورس هم گزاشتم که به خوبس کار میکنه .

لینک تاپیک (http://barnamenevis.org/forum/showthread.php?t=106240)

مهران موسوی
پنج شنبه 24 بهمن 1387, 11:01 صبح
SilverSoft عزیز روشی که شما گفتی زیاد هم کار امد نیست . برای پی بردن به دلیلش به لینکی که در پست #2 دادم رجوع کنید و اونجا رو خوب مطالعه کنید . ما دنبال یک روش استاندار و به قول دوستان تغییر سطح دسترسی به اطلاعات بر روی دیسک سخت هستیم .

vcldeveloper
پنج شنبه 24 بهمن 1387, 16:24 عصر
حالا شاید توابع بهتری برای هوک کردن باشه ولی تا اونجایی که تجربه ی من توی API Programing قد میده بهترین توابع برای محدود کردن ایجاد و کپی برداری از فایل در یک درایو خاص همینا بود ... البته چند تا تابع دیگه هم هست که اونا هم از این توابع برای کاراشون استفاده میکنن که وقتی اینا تحت کنترل هستن ÷س اونا هم نمیتونن از چشمان تیر بین سرویس کنترل کننده در برن .... !!! مثلا ( SHFileOperationA و نسخه ی یونیکد اون که از توابع CopyFile و MoveFile استفاده میکنن و .... )

به احتمال خیلی زیاد، برنامه هایی مثل Kaspersky وقت خودشان را صرف هوک کردن تک تک توابع مربوط به فایل در user mode نمی کنند، و توابع مربوطه را در سطح کرنل هوک می کنند.


معمولا اقای کشاورز توی این زمینه ها نظرات و نکات خوبی رو اشاره میکنن ولی نمیدونم چرا ازشون خبری نیست
من استفاده از هوک توابع در برنامه هام نمی کنم، و اطلاع چندانی درباره جزئیاتش ندارم.

lord_viper
پنج شنبه 24 بهمن 1387, 18:23 عصر
شما هم باید توابع findfirstfile و findnextfile رو هوک کنین نه توابع مربوط به ساخت فایل و کپی فایل رو اونقدری که من شنیدم وقتی شما وارد پوشه ای میشین برای لیست شدن محتویات اون از این توابع استفاده میشه یا هوک کردن این تابع میتونین پوشه ها و فایلهایی که نباید نمایش داده بشه رو از لیست برنامه در خواست کننده حذف کنید

مهران موسوی
پنج شنبه 24 بهمن 1387, 23:37 عصر
شما هم باید توابع findfirstfile و findnextfile رو هوک کنین نه توابع مربوط به ساخت فایل و کپی فایل رو اونقدری که من شنیدم وقتی شما وارد پوشه ای میشین برای لیست شدن محتویات اون از این توابع استفاده میشه یا هوک کردن این تابع میتونین پوشه ها و فایلهایی که نباید نمایش داده بشه رو از لیست برنامه در خواست کننده حذف کنید


لطفا بیشتر به موضوع تاپیک و بحث ما توجه کنید !!!

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

lord_viper
جمعه 25 بهمن 1387, 10:13 صبح
برای کپی شدن معمولا فایلها به clipboard منتقل میشوند و برای استفاده از فایلها معمولا فایلها open می شوند
OpenFile

در مورد hook معمولا تزریق به پروسه انجام نمیشه بلکه به کرنل ویندوز انجام میشه چون شما باید توابع خودتونو با توابع کرنل عوض کنین درسته که inject تو hookapi استفاده میشه ولی inject کردن به معنی hook کردن نیست

مهران موسوی
جمعه 25 بهمن 1387, 14:29 عصر
برای کپی شدن معمولا فایلها به clipboard منتقل میشوند و برای استفاده از فایلها معمولا فایلها open می شوند
OpenFileدوست عزیز وقتی یک فایل رو کپی میکنیم و اینجور بیان میکنیم که فایل به کلیپ برد منتقل شده در واقع به کار بردن عبارت ( فایل به کلیپ برد منتقل شده ) اشتباه هست . در واقع مسیر فایل به کلیپ برد منتقل میشه . کلیپ برد سه قسمت داره یکی برای نگهداری متن و یکی برای نگهداری مسیر فایلهایی که کپی یا کات شدن و یکی هم برای نگهداری تصاویر طرح بیتی که از نرم افزارهای ویرایش تصویر به کلیپ برد منتقل میشن در نتیجه وقتی در محیط رابط کاربری سیستم عامل ویندوز عملیات کپی برداری از یک فایل رو انجام میدیم مسیر فایل در قسمتی از کلیپ برد که وظیفه ی نگهداری مسیر فایل رو داره قرار میگیره و بلافاصله بعد از عملیات paste کردن فایل کپی یا کات شده بسته به نوع عملیات از توابع زیر برای انتقال فایل استفاده میشه :

در حالتی که کپی شده باشه :


CopyFileA
CopyFileExA
CopyFileW
CopyFileExWدر حالتی که کات شده باشه :


MoveFileA
MoveFileW
MoveFileExA
MoveFileExW

MoveFileWithProgressA
MoveFileWithProgressWالبته تابع OpenFile هم میتونه مفید باشه ولی چون بنده نیاز به پردازش دقیق نوع عملیات انجام شده داشتم بهترین راه هوک کردن توابع انتقال فایل بود . :چشمک:


در مورد hook معمولا تزریق به پروسه انجام نمیشه بلکه به کرنل ویندوز انجام میشه چون شما باید توابع خودتونو با توابع کرنل عوض کنین درسته که inject تو hookapi استفاده میشه ولی inject کردن به معنی hook کردن نیستمیشه واضح تر توضیح بدید ؟ منظورتون از کرنل ویندوز همون ntoskernel هست ؟ یعنی اگه توابع رو به اون تزریق کنیم و جایگزین توابع استاندار خودش کنیم هر برنامه ای بخواد توابع جایگزین شده رو صدا بزنه توابع ما صدا زده میشه ؟ اگه اینطوری هست که میگین مگه توابع در فایلهای DLL و در کتابخانه هایی مثل Kernel32 یا user32 و ... نیستن ؟ طبیعتا هر برنامه که نیاز بهشون داشته باشه یک نمونه از اون رو در حافظه ی کد خودش با توابع LoadLibrary یا شاید هم به صورت ایستا بارگذاری میکنه ! پس اگه ما بخواییم یک Global Hook داشته باشیم طبیعتا باید مستقیما ادرس تابع در DLL Export مربوط به کتابخانه ی مورد نظر رو به ادرس تابع خودمون Redirect کنیم .. ولی در این صورت با مشکلات محدودیت در استفاده از منابع و ... رو به رو میشیم که برای حل این مشکلات از DLL Injection استفاده میکنیم و ...

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

lord_viper
جمعه 25 بهمن 1387, 22:46 عصر
دقیقا hookapi توابع شما درون kernel32 و user32 تزریق میشن شما با استفاده از getprocessadder ادرس تابع ورد نظر رو بدست میارین و تابع خودتونو دقیقا به همون نقطه تزریق میکنین هر برنامه ای که اجرا میشه loader لابیرری های مورد نیاز اونو تو فضای ادرسیش load میکنه و iat اونو بازنویسی میکنه تابع شما در ادرس توابع مورد نظر قرار داره پس نیازی به دستکاری export table نیست فقط تابع شما باید ادرس محل دقیق تابع رو داشته باشه تا اطلاعات در خواستی رو به اون پاس بده و خروجی رو برای فرستادن به برنامه از اون بگیره
تو سایت www.codeproject.com یک نمونه رو البته کدش به c++ هست کامل توضیح داده
اگه میخواهی راحت کار کنی از کامپوننت madshi واسه hook و اینا استفاده کن