PDA

View Full Version : Hook کردن یک API Function خاص



sh_roohani
دوشنبه 09 خرداد 1384, 12:45 عصر
سلام،
من انواع Hook رو توی MSDN مطالعه کردم، تو اینترنت هم یکی دو تا مثال پیدا کردم که البته هر کردوم یه پلت فرم بودن که یه نفر بر اساس یه نیاز ساخته بود و چون فکر می کرد خواننده هم باید مثل خودش همه اون تجربه و دانش رو داشته باشه، خیلی خلاصه یه چیزایی گفته بود. اما بالاخره آخرش نفهمیدم چطوری می شه یه تابع API خاص رو Hook کرد. توی فرومهای برنامه نویس هم گشتم، فقط چند تا سوال درباره Hook بود و یکیش مربوط به سوال من بود (تو قسمت VB) که اون نیاز به تسلط به اسمبلی داشت!

اصل قضیه اینه که من می خوام کدی بنویسم که هر وقت یه تغییر تو یه دایرکتوری اتفاق می افته، مثلا یه فایل یا یه زیر دایرکتوری تغییر نام پیدا می کنه یا یه دایرکتوری جدید ایجاد می شه یا یه فایل پاک می شه یا ... اون Hook تابع Callback منو صدا کنه و بگه چه تابع APIی صدا شده یا اینکه مثلا من اون Hook رو واسه CreateFile یا WriteFile نصب کنم. اصلا همچین کاری شدنیه؟

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

Blaster
دوشنبه 09 خرداد 1384, 13:29 عصر
سلام،
قبل از هر چیزی ایا اون sh توی اسمتون مخفف شهرام نیست ؟ :mrgreen:
اما در مورد سوال شما ، فکر نمی کنم بشه یک تابع خاص رو Hook کرد چون انواع Hook مشخص شده هستند. ولی شاید یکی از اون انواع Hook موقع ساخته شدن فایل فراخوانی بشه. من اگر جای شما بودم برای هر نوع Hook یه تابع می نوشتم و بلاخره یه جوابی می گرفتم. ولی حتما نتیجه کار رو به Blaster اطلاع می دادم. :mrgreen:

sh_roohani
دوشنبه 09 خرداد 1384, 13:40 عصر
سلام دوباره،

اولا، شما از بچه های فارسی لینوکس یا کلوب دات کام نیستین؟
ثانیا، همین الان یه مثال (http://www.codeguru.com/Cpp/W-P/dll/hooking/article.php/c127/) پیدا کردم که تابع DirectDrawCreate رو Hook می کنه. حالا دارم روش کار می کنم. از بقیه قابل درک تره.
ثالثا، ای به چشم! به محض اینکه به نتیجه برسم، همینجا به عرضتون می رسونم.
:mrgreen:

Blaster
دوشنبه 09 خرداد 1384, 16:43 عصر
سلام،
جواب اولا شما :oops: .
اما در مورد Hook کردن یک API ، فکر می کنم شما باید یه کمی ASM بلد باشید . این امکان وجود داره که کد ASM مورد نظر رو وارد یک تابع API کرد و تابع خاصی رو همون اول شروع به کار API اجرا کرد. در حقیقت چند بایت به اول تابع API اضافه میشه و تابع Hook رو Load می کنه!
اما در مورد بعضی از توابع API درایورهایی وجود داره که میشه با کمک اونها یک API رو Hook کرد ونیازی هم به ASM نیست ! وچون تابع DirectDrawCreate از مجموعه DirectX هست ممکنه که برای اون درایوری خاص وجود داشته باشه ونشه اون رو به تمام API ها تعمیم داد.
اگه نتونستم کمکی بکنم شرمنده ، کله من تا همین جا میفهمه! :sorry:

sh_roohani
دوشنبه 09 خرداد 1384, 16:48 عصر
بله از صبح تا حالا کل پیشرفت بنده در Hook کردن توابع API محدود به همین شده که این واقعیت ناگوار ASM رو بپذیرم :(
خوب البته نباید خیلی نا امید هم بود، اینم خودش پیشرفتیه :mrgreen:
شاید فردا مسئله حل بشه.
در ضمن شرمنده نفرمایید، خیلی هم کمک کردید. :flower:

Inprise
دوشنبه 09 خرداد 1384, 17:23 عصر
اصل قضیه اینه که من می خوام کدی بنویسم که هر وقت یه تغییر تو یه دایرکتوری اتفاق می افته، مثلا یه فایل یا یه زیر دایرکتوری تغییر نام پیدا می کنه یا یه دایرکتوری جدید ایجاد می شه یا یه فایل پاک می شه یا ... اون Hook تابع Callback منو صدا کنه و بگه چه تابع APIی صدا شده یا اینکه مثلا من اون Hook رو واسه CreateFile یا WriteFile نصب کنم. اصلا همچین کاری شدنیه؟

برای دریافت خبر تغییر در دایرکتوری مورد نظرت میتونی از تابع FindFirstChangeNotification و برای تکمیل روند از FindNextChangeNotification و FindCloseChangeNotification استفاده کنی ؛ مثالهای مناسبی تو MSDN وجود داره .

برای بقیه سوالاتت ، درخواست و جزئیات مورد نظرت رو بدون پرداختن به حاشیه و حال و احوال با این اون بنویس تا بتونم کمکت کنم .

موفق باشید

sh_roohani
دوشنبه 09 خرداد 1384, 17:28 عصر
ممنون از راهنماییتون.
من این دوتا تابع رو چک کردم، ولی اونا فقط می گن یه اتفاقی افتاده، حتی اگه واسه هر کدوم از رویدادها مثل تغییر نام، پاک کردن، ایجاد کردن و ... یه thread جداگانه هم بسازیم، باز هم در نهایت فقط می تونیم بفهمیم که مثلا یه تغییر نام اتفاق افتاده، اما کی و کجا رو نمی تونیم بفهمیم. ReadDirectoryChangesW هم که فقط تو NT-based ها کار می کنه. اینطوری بود که من فکر کردم هیچی hook نمی شه.

Inprise
دوشنبه 09 خرداد 1384, 17:36 عصر
با استفاده از این توابع فایل یا دایرکتوری تغییر داده شده قابل بررسی هستند ، نوع و زمان تغییر هم براحتی قابل دریافته (http://www.codeproject.com/file/FileSpyArticle.asp).

sh_roohani
دوشنبه 09 خرداد 1384, 17:39 عصر
این درسته اگه شما فقط یه فایل یا یه دایرکتوری رو بخواین بررسی کنین. اما اگه تمام یه درخت دایرکتوری مد نظرتون باشه، باز هم این توابع بهتون می گن دقیقا کدوم فایل یا دایرکتوری دچار چه جور تغییری شده؟