PDA

View Full Version : حساس کردن برنامه نسبت به تغییر تاریخ سیستم



Hadizadeh
چهارشنبه 21 دی 1384, 20:48 عصر
با سلام. بعضی از نسخه های آزمایشی برنامه ها ، دارای قابلیتی هستند که در صورت عقب کشاندن تاریخ سیستم ، در هنگام اجرا واکنش نشان می دهند. به نظر شما راهی وجود داره که بدون ذخیره تاریخ فعلی سیستم در یک فایل خاص یا رجیستری ، بتوان قابلیت بالا را به نرم افزار خود اضافه کرد؟

Inprise
چهارشنبه 21 دی 1384, 22:50 عصر
تو بهر حال چاره ای نداری جز دریافت تاریخ از سیستم عامل یا تو لایه های پائین تر ، از سخت افزار و هر دو براحتی قابل تغییرند ، و چون نرم افزار نمیتونه به علوم غیبیه و ملهمه مجهز باشه ، چاره ای نداره جز اینکه تاریخ رو یه جائی ثبت کنه ؛ این روزها کسی درگیر این نکته نیست که تاریخ رو چطور بدست بیاره ، درگیری اصلی روی نحوهء ذخیره کردن اون و جلوگیری از تغییر و دستکاری اونه ، با روشهای مختلف Anti-debug و Anti-Patch .

Hadizadeh
چهارشنبه 21 دی 1384, 23:50 عصر
ممنونم از پاسخ شما. یه راهی که بعضی ها پیشنهاد می کنند ، مقایسه تاریخ فعلی فایل های رجیستری با زمان آخرین اجرای برنامه است. ولی من فکر می کنم روش موثری نباشه. به عنوان مثال فرض کنید برنامه رو امروز یکبار اجرا می کنیم. حالا تاریخ سیستم رو عقب می بریم و فایل اصلی برنامه رو هم دوباره یه جای دیگه کپی می کنیم تا زمان آخرین دسترسی اون با تاریخ جدید ست بشه ، حالا سیستم رو از نو بوت می کنیم تا تاریخ فایل های رجیستری هم عوض بشه. حالا به نظر شما اگه برنامه رو از نو اجرا کنیم ، چی میشه؟ لطفا توجه کنید که من نمی خام تاریخ ها رو تو یه فایل یا رجیستری ذخیره کنم چون به راحتی مانیتور میشه. فرمایش شما متینه ولی بعضی از برنامه ها هستند که بدون نیاز به ذخیره تاریخ خاصی ، دارای این قابلیت هستند. حالا به نظر شما دیگه چه راهی وجود داره؟

Inprise
چهارشنبه 21 دی 1384, 23:59 عصر
هیچ برنامه ای بدون ذخیرهء و برداشت تاریخ نمیتونه گذشت زمان رو بفهمه .

Hadizadeh
پنج شنبه 22 دی 1384, 00:17 صبح
من یه برنامه دارم که حدس می زنم از این روش استفاده میکنه. برای اطمینان مانیتورش کردم. ولی خبری از دسترسی به فایل نیست. از Filemon استفاده میکنم. شاید درست این کار رو انجام نمی دم. تو این برنامه یه سری اسم ها مثل: FASTIO_QUERY_OPEN و IRP_MJ_Create و FASTIO_QUERY_STANDARD_INFO ،IRP_MJ_CLEANUP و IRP_MJ_WRITE وجود داره. شما معنی دقیق اونها رو می دونید؟ همچنین جلوی هر فایل اجرایی یه عدد مثل شماره پورت نوشته شده ، نمی دونم اونها چی هستند مثلا:explorer.exe:1524
ممنون می شم کمکم کنید.

Inprise
پنج شنبه 22 دی 1384, 00:21 صبح
وقتی درایور فایل سیستم پیام IRP_MJ_WRITE رو هندل میکنه ، یعنی یه جائی یه چیزی داره نوشته میشه ، و وقتی این پیام متعلق به کانتکست پروسه تو هست ، یعنی بهر حال برنامه ات Activity با مضمون Write داره ؛ اما لزوما" این به معنای تائید آنچه تو جواب قبلیم گفتم نیست ؛ در هر حال بدون در نظر گرفتن ابعاد فنی ، بلحاظ منطقی ، برنامه باید بعد از گذشت x روز ، بتونه گذشت X روز رو درک کنی ، کافیه به این نکته دقت کنی که ، درک کردن معنی ِ‌x روز برای نرم افزار مقدور نیست ، الا اینکه یه جائی بنویسه ، دفعه بعدی بخونه ، و بفهمه x اصولا" یعنی چی .

Hadizadeh
پنج شنبه 22 دی 1384, 00:50 صبح
ممنونم. فکر کنم دارم به جواب نزدیک می شم. فقط مفهوم IRP_MJ_DIRECTORY_CONTROL در برنامه Filemon چیه؟

Inprise
پنج شنبه 22 دی 1384, 01:03 صبح
قسمت اصلی Filemon یک ماژول کرنل مود هست که حتی IRP ها رو اسنیف میکنه ، و این پیامها متعلق به اون ماژوله . در عمل اینها چندان به درد تو نمیخورن چون فقط نشان دهندهء تعامل درایور فایل سیستم و کتابخانه های سطح بالاتری هستند که هنگام اجرای پروسه توسط سیستم عامل ، وارد فضای آدرسی پروسه شده اند ، برنامه ات حتی اگر چیزی ننویسه و چیزی نخونه - تئوریک - باز هم پیامهائی از این دست رو خواهی دید ، چون بهر حال برنامه ات در حال استفاده از Virtual Memory است و محل قرار گرفتن آفست های حافظه مجازی روی دیسکه .

جواب سوالت : پیام IRP_MJ_DIRECTORY_CONTROL پس از دریافت توسط IO Manager دو پیام سطح پائین تر تولید میکنه که توسط اونها میشه محتویات یک دایرکتوری رو بررسی کرد ( توضیح : اینجا منظور از دایرکتوری لزوما اون چیزی که در ادبیات عام بهش دایرکتوری گفته میشه نیست . در فضای کرنل ، یه دارکتوری یک روت آبجکت هست که محل نگهداری یک سری آبجکت دیگه هست ، تعدادی درایور که هر کدام یک آبجکت ِ‌فضای کرنل تلقی میشن ، وقتی همگی از یک نقطع منشعب شده باشن ، اعضای یک دایرکتوری هستند ؛ )

Hadizadeh
پنج شنبه 22 دی 1384, 01:34 صبح
بسیار ممنونم. فکر کنم به جوابم رسیدم. این برنامه در هر بار اجرا تاریخ فعلی سیستم رو با تاریخ تمام فایل های موجود در ریشه اصلی درایو C و همچنین در شاخه تاپ ویندوز مقایسه می کنه. به نظر می رسه اگر تعداد فایل هایی که تاریخ اونها جلوتر از تاریخ فعلی سیستم هست بالاتر از یک حد آستانه باشه ، اونوقت این مطلب گواه اینه که تاریخ سیستم برگشته عقب! نظر شما چیه؟
این مطلب رو از اونجاییکه دیدم تو Filemon فایل های فوق با همون هندل IRP_MJ_DIRECTORY_CONTROL پروسس شدند حدس زدم. ولی هنوز یه جای کار می لنگه. آیا میشه برنامه ای نوشت که قبل از شروع کرنل ویندوز تاریخ سیستم را عوض کنه؟ مثلا هنگام بوت؟
قبل از هر برنامه دیگر؟

Inprise
پنج شنبه 22 دی 1384, 01:45 صبح
اگر در حال حل کردن یک تمرین و یک Crackme هستی ، شاید بشه تصور کرد یکی مایل بوده از چنین روش غیر قابل اعتماد و غیر مطمئنی هم استفاده کنه ، اما در عمل ، بسیاری از برنامه ها ممکنه به بسیاری از منابع سیستم دسترسی نداشته باشند ، به دلیل محدودیت مجوز کاربری یا هر محدودیت دیگری ، و حتی اگر محدودیتی هم وجود نداشته باشه ، چنین مقایسه ای لزوما" به جواب مناسب نمیرسه ؛ بهر حال برای کنترل تغییر تاریخ روشهای متعددی وجود داره ، بعضی از برنامه ها خودشون رو تغییر میدن ، تا دفعات بعدی با بررسی خودشون و قیاس با تاریخ تفاوت رو بفهمن ، بعضی ها یه چیزی یه جائی مینویسن ، بعضی ها هم یک ماژول تو فضای یکی از پروسه های حیاتی سیستم اضافه میکنن که حتی بعد از بسته شدن ، یه نفر باشه و بتونه تغییرات رو بفهمه و در اجرای بعدی بهشون اطلاع بده ( و گاهی حتی ماژولهای سیستم عامل رو Patch میکنند برای رسیدن به همین مقصود ) و ...؛ و تمام این تلاشها رو میشه دید و باهاشون مقابله کرد

در جواب سوالت : تو میتونی کدت رو قبل از Boot Loader ویندوز بگذاری ، میتونی خود کرنل رو Patch کنی و روشهائی مثل این ، اما عموما" به این همه ژانگولر فضائی نیازی نیست ، و با یک کد ساده میشه تاریخ و ساعت رو تغییر دادن ، بدون استفاده از توابع سیستم عامل .

در نهایت ، اگر مساله اینه که تاریخ رو بدون فهمیدن یک برنامه تغییر بدی ، باید اول مشخص کنی اون برنامه چه اجزائی رو نصب میکنه ، آیا یک درایور داره ؟ آیا اون برنامه بدون مجوز ادمین ، و با یک اکانت کاربری کم اختیار هم بدون مشکل کار میکنه و تغییر تاریخ رو میفهمه ؟ اگر اینطور هست میشه یه جور برداشت کرد و اگر نیست جور دیگه ، و در هر حال ، راه حلهای تجاری موجود ، تغییر تاریخ رو به همان روشهائی که عرض شد میفهمند و از حدس و گمان یا برآورد احتمالی استفاده نمیکنند ، چون همانطور که میشه فایل رو Patch کرد تا میزان تغییر تاریخ رو نفهمه ، میشه یک Hook ساده گذاشت تا مشخصات فایلها رو فیلتر کنه ، و روش فرضی تو هم نتونه تاریخ معقولی از فایل سیستم بدست بیاره ، حتی شاید این روش دوم ، ساده تر از Unpack کردن و Patch‌ و نوشتن احتمالی یک Loader و غیره و غیره باشه ...

Hadizadeh
پنج شنبه 22 دی 1384, 09:26 صبح
سپاسگذارم. فکر کنم بهترین راه برای منظور من همون استفاده از Patch هست. ولی مفهوم دقیق Hook رو متوجه نشدم.
1- آیا اون مشخصات فایل ها نظیر صفات و تاریخ اونها رو از دید سیستم عامل فیلتر می کنه یا برنامه ای که روتین دست یابی به مشخصات فایل رو احضار می کنه؟
2-همچنین از کجا می شه بفهیم که یک برنامه درایو مخصوص داره؟
3-مشهورترین راه یا برنامه برای Patch یک برنامه چیه؟ به نظرم تو Patch می تونی آخرین مقایسه رو غیر فعال کنی. درسته؟
4-من کاربر Admin هستم و برنامه نیز تغییر تاریخ رو می فهمه. چه جوری باید سطح دسترسی اونو محدود کنم؟ مثلا نتونه تو رجیستری چیزی بنویسه!
در رابطه با اون مطلبی که فرمودید ، ممکنه یه ماژول کمکی به سیستم اضافه کنه ، فکر کنم اگه لیست فایل های استارت آپ رو تو msconfig حذف کنی ، اون ماژول هم در بوت بعدی نمی تونه لود بشه. پس روش مناسبی نیست. مگر اینکه یکی از فایل های اصلی سیستم مثل explorer رو Patch کنه.
5- Boot Loader Windows کجاست؟ می خام یک فایل exe رو قبل از اون بذارم برای اجرا.
باز هم از صبر شما وپاسخ های دقیق شما ممنونم.

Inprise
پنج شنبه 22 دی 1384, 18:00 عصر
کلمهء Hook در ادبیات امنیت نرم افزار معنی وسیعی داره ، و ممکنه تو موارد مختلف ، به معنای روندی باشه که جای دیگه صادق نیست ، ولی عموما" Function Hook یا API Hook به معنای نوعی شنود ، و عکس العمل در مقابل فراخوانی توابع یا API هاست . وقتی میشنوی که کسی میگه فلان API رو Hook کن و بعدش فلان عمل رو انجام بده ، یعنی با روشهای موجود ، گوش کن ، و هر وقت اون API صدا زده شد ، عمل خاصی رو انجام بده . یعنی اگر در حوزهء شبکه ، یک اسنیفر چیزی است که ترافیک شبکه رو شنود میکنه ، وقتی در مورد توابع خصوصا API های سیستم عامل حرف میزنیم ، Hook ، نوعی اسنیفر است که امکان انجام عکس العمل رو هم داره . Hook ها دو جور هستند ؛ آنهائی که Local‌ اند و آنهائی که Global‌اند . Local Hook ها در محیط و فضای آدرسی یک پروسه یا Thread خاص کار میکنند ؛ مثال : تو در برنامه ات از یک DLL خاص استفاده میکنی و به دلیلی مایلی هر وقت اون DLL توسط اجزاء برنامهء خودت یا فرد دیگری ، از حافظه خارج شد ، تو متوجه بشی ، پس یک Hook روی تابع Unload‌ اون DLL نصب میکنی و در موقع لازم عمل لازم رو انجام میدی ؛ Global Hook ها اما محدود به یک پروسه نیستند و میتونن روی کل سیستم عامل و نرم افزارهای موجود نظارت و عمل کنند . به عنوان مثال میتونی یک Keyboard Hook ایجاد کنی که هرگاه کلید A در هر حال در هر برنامه ای به هر شکلی نصب شد ، تو بفهمی ، و حتی عکس العمل خاصی انجام بدی . برای اینکه بفهمی حالا چطور میشه در عمل Hook نوشت بهتره برای ویندوز ، به MSDN مراجعه کنی و تاپیکهائی که قبلا" مطرح شدن رو مطالعه کنی

جواب سوالاتت :

1- اگر برنامه ات در حالت Guest بدون مشکل ، و به همان شکل سابق کار میکنه ، یعنی درایور نداره .

2- برای اجرا شدن هنگام اجرای سیستم عامل لازم نیست کسی برنامه رو به شکل تابلو روی رجیستری ثبت کنه که تو بتونی با msconfig ببینی اش ، این روشها دیگه مدتهاست منسوخ شده . روشهای بهتری وجود دارن که مقابله باهاشون دشوار تره

3- نمیتونی فایل exe رو قبل از Boot Loader ویندوز بگذاری . یک فایل exe در واقع یک PE است که صرفا" در محیط ویندوز قابل اجراست . اگر بخواهی کدی رو قبل از Boor Loader ویندوز اجرا کنی ، باید یک کد ساده و Real Mode با اسمبلی بنویسی ، معادل باینری اش رو تو فضای کوچکی که پس از فراخوانی اولیه BIOS روی حافظه فیزیکی میمونه بنویسی ، و قبل از Boot Sector ویندوز یک Jump به آدرس مذکور بگذاری و البته پس از اجرای اون کد مجددا" به Boot Sector ویندوز پرش کنی ، کار ساده ای نیست ؛ ولی eEye سال قبل در Blackhat یک Technology Preview از چنین کدی رو پرزنت کرد پیش از اجرای سیستم عامل و با Patch کردن مرحله به مرحله فرآیند بوت میتونست ، ضمن اجرای سیستم عامل ، کنترل پردازنده و دسترسی نا محدود به سخت افزار رو حفظ کنه ؛ میتونی با نام Bootroot Rootkit (http://www.eeye.com/html/resources/downloads/other/eeyebootroot.zip)روی سایت eEye پیداش کنی ؛ شاید اگر فرصت بیشتری پیدا کنم یه مقاله در مورد نحوهء عملکردش بنویسم . ( توصیه : به این چیزها فکر نکن . )

Hadizadeh
پنج شنبه 22 دی 1384, 18:42 عصر
از پاسخ های بسیار عالی شما واقعا ممنونم. اونطوری که پیداست باید به توصیه شما گوش کنم و فکرمو رو این چیزها مشغول نکنم. پس تمام چیزهایی را که قبلا مطرح کردم بای پس می کنم و میرم سراغ Patch کردن. چون اگه یه مقدماتی از اونو بلد باشم ، راحت تر می تونم برای برنامه هایی که می نویسم ، قفل طراحی کنم! اگه بخواهید یک برنامه یا یک مرجع آن لاین جهت این کار معرفی کنید، چی پیشنهاد می دهید؟ شما یک جا گفتید که SoftICE به درد غیر حرفه ای ها نمی خوره. یک جایگزین خوب برای اون دارید؟
خلاصه کلام اینکه ، اگه بخواهیم همون برنامه کذایی که قبلا گفتم رو فلج کنیم به نحوی که در قادر به مقایسه تاریخ های مرتبط نباشه ، باید چه کار کنیم؟! چون بالاخره یک جا شرط نهایی وجود داره که اگه بتونیم اون شرط رو عوض کنیم ، خوب قضیه حله!!! به نظرم شما پتانسیل این رو دارید که یک مقاله جامع برای این جور کارها بنویسید! طرفدار پروپا قرص هم کلی داره!

Inprise
پنج شنبه 22 دی 1384, 18:55 عصر
برای شروع کافیه که تاپیکهای Sticky همین بخش رو مطالعه کنی ، خصوصا" درسهای اول و دوم و سوم ؛ احتمالا" جواب خیلی از سوالاتت رو خواهی گرفت و مسیر شروع رو پیدا میکنی . تاپیک دیگری به معرفی کتابهای خوب مرتبط با امنیت نرم افزار اختصاص داره که به دردت خواهد خورد .

خوش باشی

Hadizadeh
پنج شنبه 22 دی 1384, 22:31 عصر
من اون فایل(eEyeBootRoot.zip) رو دانلود کردم. جالب به نظر می رسه. برای همین خواستم تستش کنم. تو فایل Readme اون نوشته، که فایل ebrk.iso رو باید روی یک CD رایت کرد و سپس سیستم رو با اون CD بوت کرد. من این کار رو با برنامه Nero انجام دادم ولی سیستم CD رو به عنوان یک سیستم Bootable نشناخت. به نظر شما باید چه کار کرد؟ آیا باید فایل دیگری رو هم با اون رایت کرد یا نه؟

Inprise
پنج شنبه 22 دی 1384, 23:18 عصر
همانطور که گفتم این فقط یک Preview از نحوهء پیاده سازی چنین موجودی است ، نه یک کد آماده برای کاربرد . فایل isoی مذکور حاوی یک Boot Sector آلوده به Bootroot است که پس از اجرا به بوت سکتور ویندوز Jump میکنه ؛ من تستش نکردم و eEye‌ هم مدعی نیست که این کد به همین شکل قابل کاربرده ، اما بهر حال فیلمهای موجود از Session ارائهء این کد ، نشون میدن داره کار میکنه ، شخصا" فرصت کار باهاش رو نداشتم و فقط در موردش خوندم .

aref_saee
سه شنبه 22 اسفند 1385, 14:07 عصر
با سلام ، من یک ایده دارم که براتون میزارم:
میشه تو برنا ها ه کمک رجیستری و ایجاد فایلهای INI هر بار که سیستم بالا میاد شمارشگر cmos رو ذخیره کرد ، البته منظورم قالب تاریخ به روش خود سیستم . و هر بار که برنامه اجرا میشه اون رو چک کرد .
موفق باشید