PDA

View Full Version : حرفه ای: تفاوت Disassembl, Debugging فایل های exe و dll



lukaskain
جمعه 13 اردیبهشت 1392, 17:25 عصر
با سلام و احترام خدمت همه اساتید

3 سوال می خواستم مطرح کنم

1- تفاوت Disassembl, Debugging فایل های exe و dll با توجه به اینکه هر دو PE فایل هستند اما dll اجرایی نیست در چیست؟
در یک برنامه مانند ollydbg فایل های exe قابلیت اجرا شدن دارند اما فایل های dll خیر، آیا این موضوع تاثیری در عملیات debug دارد؟
هم dll و هم exe در ollydbg قابلیت load شدن دارند اما dll فابلیت run شدن ندارد. تفاوت بین run و load در debugger ها از لحاظ عملیات debugging در چیست؟

2- آیا از روتین های ضد دیباگ مانند توقف وقفه ها، تغییر بردار وقفه ها و هنگ کردن دیباگر و ... می توان در فایل های dll هم استفاده کرد یا خیر؟
آیا این روتین ها در هنگام run شدن عمل می کنند یا در هنگام load شدن؟

3- و نهیتاً فایل های dll را می توان راحت تر Disassembly, Debugging نمود یا exe را؟

از اساتید استدعای راهنمایی دارم

lukaskain
جمعه 13 اردیبهشت 1392, 18:30 عصر
4- Resource کدام یک از دو فایل dll و exe ساده تر است؟

از لحاظ 1- ساختاری 2- اجرایی بودن و نبودن کدام فایل (exe یا dll) :
5- نفوذ پذیر تر است؟
6- قابلیت ایمن سازی در برابر cracker را دارد؟

lukaskain
شنبه 14 اردیبهشت 1392, 11:08 صبح
از مدیران محترم بخش مربوطه تقاضای کمک دارم

BackTrace
شنبه 14 اردیبهشت 1392, 14:57 عصر
سلام، کمی صبور باشید.

منظور شما از Load شدن رو متوجه نمیشم.

1- DLLها یکسری توابع رو Export میکنن. فراخوانی این توابع بدون داشتن اطلاع از prototype اونا دشواره. عموما توابع تعریف شده در فایل EXE در همون فایل مورد استفاده قرار میگیرن(میشه اونا رو Export هم کرد) و دیباگ اونا راحت تره.
2- بله میشه استفاده کرد.
3- اگه یک فایل EXE داشته باشیم و دقیقا همین فایل EXE رو به DLL تبدیل کنیم آنگاه دیباگ فایل EXE آسونتره.
4- تفاوتی نداره.
5- فایلهای Dll و Exe قراره یکسری کد رو اجرا کنن و نفوذپذیری به این کدها بستگی داره. اما از لحاظ ساختار اولی رو میشه مثلا EAT/IAT Hook کرد و دومی رو میشه IAT Hook کرد.
6- هردو.

در هرصورت فایل DLL نوشته میشه که بعدا توسط یک فایل PE دیگه مورد استفاده قرار بگیره در واقع توابع فایل DLL باید اجرا بشن. میشه با تعقیب فراخوانی این توابع اونا رو دیباگ کرد. چون فایل های DLL وابسته هستند و loader ویندوز قابلیت اجرای مستقیم اونا رو نداره، حداقلش اینه که با دابل کلیک اجرا نمیشن اما EXE میتونه تنها به خودش وابسته باشه و loader ویندوز قادر به اجرای مستقیم اونا هست.

lukaskain
یک شنبه 15 اردیبهشت 1392, 18:00 عصر
دوست عزیز از پاسخ گوی شما بسیار ممنون
همون طور که مستحضرید و قطعاً با توجه به پاسخ حرفه ایتون مشخص است اهل فن هستید
DLL یکی از انواع PE می باشد و مجموعه ‌ای از توابع و پروسه ‌هایی است که می ‌تواند از برنامه یا DLL های نظیر خود فراخوانده شود.
فایل های DLL حاوی یک مدخل شروع انتخابی (optional entry point) و پایانی هستند که در زمانی که توسط برنامه ‌های دیگر به درون حافظه لود یا آنلود می ‌شوند قابل اجرا است.

فايل های اجرايی EXE تحت ويندوز با يک قطعه ۵۱۲ بايتی بنام هدر (Header) شروع می شوند که از اين ۵۱۲ بايت فقط ۲۷ بايت اول مورد استفاده قرار مي گیرند و همچنین باید این نکته را در نظر داشت که يک فايل EXE ميتواند از هرجايی که بخواهد اجرا شود و اين از فوايد فايل های EXE می باشد.

می توان نتیجه گرفت:

منظور از load شدن کنترل حافظه، متغیرها و توابع، تراکنش های پردازنده و هارد، ارتباط با کتابخانه های اشتراکی و ... توسط دیباگر هست. به عبارت دیگر زمانی که یک فایل را داخل دیباگر درگ دراپ می کنید و پشته ها نمیش داده می شود.

1- هم فایل exe هم dll در دیباگر load می شود
2- dll قالیت trace ندارد (غیر اجرایی)
3- dll به علت ساختار فایل (توایع منفصل) دیباگ و دی اسمبل به روی اش سریع تر و راحت تر جواب می دهد
4- resource کردن فایل های dll راحت تر است چراکه به طور مثال ناپ نمودن بخشی از از یک تایع عملکرد توابع دیگر را تحت تاثیر قرار نمی دهد و ایجاد باگ اجرایی نمی کند
5- افزودن روتین های ضد دیباگ، ضد مانیتورینگ، ضد کرک در فایل exe به لحاظ منطقی به جهت اجرایی بودن و خصوصاً اجرایی بودن از هر قسمت آسان تر و عملیاتی تر است
6- فایل dll برای اجرا بر روی ram لود می شود و روی حافظه باقی می ماند و توابع آن به راحتی قایل دسترس است، البته مگر اینکه به صورت دستی روی هارد لود کرد، و یا بعد از لود شدن آنلود شود که تا زمان atach به برنامه روی رم قایل رویت هست. (البته فایل exe هم قطعاً از رم استفاده می کند اما به صورت دستوری(!؟))
7- Hijacking که دیگه واقعاً شاهکار باگ dll

در مجموع 6 بر1 امنیت فایل exe به مراتب بالاتر از فایل dll هست؟؟

BackTrace
دوشنبه 16 اردیبهشت 1392, 03:33 صبح
خوشحال میشم مطالب جدیدی یاد بگیرم. به نظر میاد شما دارید تئوریک صحبت میکنید. در زیر مواردی که با دانسته های من متفاوت هست رو ذکر میکنم. همچنین در مواردی که ابهام داشتم سوالاتی ذکر کردم.

این موضوع که فايل های اجرايی EXE تحت ويندوز، با يک قطعه ۵۱۲ بايتی شروع می شوند همواره صادق نیست. گاهی لینکر اندازه این قسمت رو بیشتر میکنه. فقط 27 بایت اول از هدر مورد استفاده قرار میگیره؟ پس 485 بایت دیگه چی میشن؟

منظور از هرکجا چیه؟

1- فایل DLL بدون وجود یک PE دیگر، load نخواهد شد. یک فایل DLL به خودی خود و به تنهایی قابل load نیست.
2- اگر منظور از Trace همان دیباگ باشد، با توجه به نکته 1 تنها به وسیله فراخوانی می توان یک DLL را Trace و BackTrace کرد.
3- همانطور که قبلا گفته شد چون در فایل DLL برای توابع Exportشده اطلاعات Prototype در دست نیست، در نتیجه دیباگ نیز سریع تر و راحت تر نیست. از این گذشته اگر وجود چندین تابع که ارتباطی با هم ندارند را دلیل بر راحت تر بودن دیباگ بگیریم چنین حالتی برای فایل EXE نیز صادق است. مقایسه زمانی باید انجام گیرد که همانطور گفته شد یک فایل EXE داشته باشیم و دقیقا همین فایل EXE رو به DLL تبدیل کرده باشیم.
4- منظور از Resource کردن چیه؟ اگر منظور همان کرک باشد، با توجه به شرط مقایسه که گفته شد، تفاوتی وجود ندارد. شاید DLL کمی وقت گیرتر باشد.
5- فرقی نیست.
6- ؟!

از این لحاظ که اگه امنیت یک فایل EXE زیر سوال بره زیاد روی بقیه برنامه ها تاثیری نداره اما با توجه به استفاده DLLها که عموما به صورت اشتراکی مورد استفاده قرار میگیرن، با زیر سوال رفتن امنیت این فایل DLL درواقع امنیت برنامه هایی که از اون DLL استفاده میکنن نیز زیر سوال خواهد رفت.

hepL3r
دوشنبه 16 اردیبهشت 1392, 15:12 عصر
دیباگ کردن DLL بستگی به توع اون DLL داره، به عنوان مثال اگه DLL توسط یه نرم افزار فراخوانی میشه بهترین راه برای توقف اوی EntryPoint اینه که بایت های ابتدایی را با EB FB عوض کنید در این صورت با یه Pause برنامه تو DLL متوقف میشه. من توی یکی از مقالاتم از این روش استفاده کردم.
راه های دیگه هم وجود دارند مثلا" BreakPoint گذاشتن روی API هایی که توسط DLL فراخوانی میشن ولی روشی که من استفاده میکنم همون EB FB هست.



BR
hepL3r

BackTrace
دوشنبه 16 اردیبهشت 1392, 16:11 عصر
دیباگ کردن DLL بستگی به توع اون DLL داره، به عنوان مثال اگه DLL توسط یه نرم افزار فراخوانی میشه بهترین راه برای توقف اوی EntryPoint اینه که بایت های ابتدایی را با EB FB عوض کنید در این صورت با یه Pause برنامه تو DLL متوقف میشه. من توی یکی از مقالاتم از این روش استفاده کردم.
راه های دیگه هم وجود دارند مثلا" BreakPoint گذاشتن روی API هایی که توسط DLL فراخوانی میشن ولی روشی که من استفاده میکنم همون EB FB هست.



احتمالا منظور شما EBFE هست این روش درواقع جامپ به خود است. کسانی که با برنامه pupe آشنا هستن با این روش هم آشنان.
بهترین راه برای توقف روی Entrypoint یک DLL هم استفاده از خود دیباگر و در زمان رسیدن پیغام LOAD_DLL_DEBUG_EVENT به دیباگر هست.

lukaskain
دوشنبه 16 اردیبهشت 1392, 20:48 عصر
اوکی، بگذارید یکی یکی بریم جلو

فايل های اجرايی EXE تحت ويندوز با يک قطعه ۵۱۲ بايتی بنام هدر (Header) شروع می شوند، دوست عزیز این هدر فایل هست و همه جا ثابت می باشد.
27 بایت اول هم که عرض کردم به شرح ذیل است:
اين ۲۷ بايت نیز به ۱۴ بخش تقسيم مي شوند که از اين ۱۴ بخش ۷ بخش از اهمیت بیشتری برخوردار است. معمولا اگر فايل EXE آلوده به ويروس شود در واقع این بخش ها تغییر می کنند.
مهم ترین بخش، بخش ۱ می باشد که نامش ID می باشد و شامل دو حرف MZ است و در ابتدای تمام فايل های EXE وجود دارد و در صورت عدم وجود اين دو کاراکتر فايل اجرا نمی شود.
دو بخش مهم بعدی بخش های ۲ و ۳ می باشند که در تعيين حجم فايل EXE از آن ها استفاده مي شود. يک فايل EXE به طور منطقی به بخش هايی به نام PAGE يا همان صفحه تقسيم مي شود که هر صفحه شامل ۵۱۲ بايت می باشد. بخش ۳ در حقيقت تعداد صفحات يک فايل EXE را به خود اختصاص می دهد. بخش ۲ شامل تعداد بايت های مورد استفاده در آخرين صفحه فايل می باشد.
بخش های مهم بعدی ۸ و ۹ هستند که شامل Stack Segment يا SS و Stack Pointer يا SP می باشند. زمانی که فايل EXE برای اجرا در حافظه لود مي شود از اين مقادير برای مقدار دهی ثبات های (Registers) همنام با آن ها يعنی SS و SP استفاده مي شود.
دو بخش مهم بعدی هم بخش های ۱۱و ۱۲ هستند که شامل مقادير Code Segment يا CS و Instruction Pointer يا IP می باشند. از اين مقادير برای مقدار دهی ثبات های CS و IP استفاده مي شود. وقتی برنامه برای اجرا در حافظه لود مي شود، سيستم عامل کنترل برنامه را به بخشی که با اين دو ثبات مشخص شده است ارسال می کند و برنامه از آن جا به بعد اجرا مي شود.

و از اینجا نتیجه گرفتم يک فايل EXE ميتواند از هرجايی که بخواهد اجرا شود، (SP Cotrol)


اما موارد مطروحه: به صورت کاملاً عملی عرض می کنم)
1- شما یک فایل dll حاوی تابع جمع دو متغیر real را بکشید و بندازید در olly همین برنامه را بنویسید و exe بیلد کنید و فایل را بکشید بندازید در olly
هر دو فایل در olly لود می شود، (مفهوم لود در olly را بالاتر عرض کردم) در فایل dll تابع با نام اش به صورت کامل قابل دسترسی است (انگار IDE برنامه نویسی را دارید مشاهده می کنید!!!) اما در فایل exe پشته ها اندکی پیچیده تر است (نسبت به dll عرض می کنم)

اگر این مورد را تایید می فرمایید برویم سر موارد بعدی

BackTrace
دوشنبه 16 اردیبهشت 1392, 22:40 عصر
این توضیحاتی که راجع به ساختار فایل PE نوشتید خیلی قدیمیه و مربوط به زمانیه که ما فایلهای EXE و COM داشتیم(مگر اینکه شما دارید درباره RealMode صحبت میکنید). به منابع جدیدتر رجوع کنید. از این گذشته اینکه در منوال ها چی نوشته اهمیتی نداره مهم اینه که آیا فایل توسط Loader ویندوز اجرا میشه یا نه. نحوه برخورد لودر ویندوز با فایل مهمه، این همون چیزیه که باید در منوال ها نوشته بشه.

دلیل لود شدن فایل DLL در Olly وجود برنامه loaddll.exe هست که Olly اونو از تو خودش استخراج میکنه سپس با استفاده از این برنامه فایل DLL رو در حافظه لود میکنه. برای فراخوانی توابع هم شما باید از Call DLL export استفاده کنین. اون خودش آرگومانها و پشته و... رو داره و از اونا استفاده میکنه. همچنین شما باید مطمئن باشید که اطلاعات Debug رو Strip کردین.

پیروز باشید.

lukaskain
سه شنبه 17 اردیبهشت 1392, 09:13 صبح
یعنی شما معتقدید که هدر فایل exe تغییر کرده؟!!!!! الان تمام برنامه هایی که با Delphi7 تا radstudio و VB, Csharpنسخه های Visual Studo و پلتفرم VRM برای جاوا فایل exe تولید می کنند همگی در یک hex editor هدر فایل (http://itee.uq.edu.au/~cristina/students/david/honoursThesis96/bff.htm)exe را به همین ترتیب release می کنه، غیر از این باشه که API ویندوز اصلاً نمی شناستش!!!

در رابطه با لود شدن dll حق با شماست اما بنده اصلاً مورد سوالم اینجا نیست، سوال من اینه که بعد از لود شدن دو فایل کدام یک نسبت به هم راحتر دیباگ می شود؟

lukaskain
پنج شنبه 19 اردیبهشت 1392, 22:24 عصر
پاسخی برای این بحث نیست؟

Raham
پنج شنبه 19 اردیبهشت 1392, 23:08 عصر
با سلام خدمت دوست عزیز


حرفهای شما ترکیبی از RealMode و مباحث آکادمیک و یه سری افکار خودتون هست.
خوشحال میشم چیزایی که می گین رو با مدرک یا منبع ذکر کنید!


اول باید بگم ساختار EXE , DLL یکسان هستش تقریبا. فرق خاصی از نظر ساختار PE ندارن
شامل همون Resource ها هم میشه.

بعد همونطور که دوستان اشاره کردن میزان نفوذ پذیری ربطی به DLL Or EXE نداره . بلکه تحت تاثیر نوع پیاده سازی هستش. یعنی الگوریتم و و کد نویسیتون چطوری باشه

در تاتیک BackTrace باید عرض کنم همانطور که اشاره کردن اصلا ربطی نداره سایز هدر 512 بایت باشه. بستگی به لینکر داره. بعدشم دقیقا بر عکس چیزی که میگین 27 بایت اولش مهم هستش. اتفاقا اون 27 بایت اول چیز مهمی نداره . بقیش مهمه!!


مورد بعدی: شما هرجور حساب کنی DLL قابلیت Trace / Disassembly / Debug رو دارن

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


واسه آلوده سازی (مباحث ویروس) اینطوری نیست که بگیم نقش کلیدی رو هدر بازی می کنه. خیر.
هدر ممکنه در حد اضافه شدن یه سکشن تغییر کنه. مهم کد هایی هستش که تزریق میشه به فایل



بحث اجرا شدن PE از هر مکانی هم وابسته به این هستش که Relocation داشته باشه. که Relocation شرط DLL هستش. اما واسه EXE ضروری نیست معمولا.


اون بحث عملی هم که ذکر کردین همونطور که دوست عزیزمون اشاره کردن بخاطر Debug Data ها هستش. اصلا ربطی به EXE,DLL بودن نداره.


اون مباحث CS,ES,... هم ذکر کردین واسه حالت RealMode هستش. نه تو Protected Mode اونم تو User Mode


یعنی شما معتقدید که هدر فایل exe تغییر کرده؟!!!!! الان تمام برنامه هایی که با Delphi7 تا radstudio و VB, Csharpنسخه های Visual Studo و پلتفرم VRM برای جاوا فایل exe تولید می کنند همگی در یک hex editor هدر فایل exe را به همین ترتیب release می کنه، غیر از این باشه که API ویندوز اصلاً نمی شناستش!!!

ربط این جمله مذبور به مبحث مذکور واسه من قابل هضم نیست! نقش API چیه الان دقیقا؟!


کلا پیشنهاد می کنم یه مقدار ساختار PE رو مطالعه کنید.



موفق باشیم
یا علی

lukaskain
جمعه 20 اردیبهشت 1392, 00:36 صبح
ضمن عرض سلام خدمت شما دوست بسیار عزیز
بنده احساس می کنم همه مباحث در این تاپیک مطرح نمی شود، یعنی با هماهنگی قبلی بین چند تن از عزیزان جریان سازی صورت می گیرد و بدین صورن خلط بحث می شود و برای ایجاد فضای سلطه عده ای خاص جواب هایی خاص می دهند و همان عده از یکدیگر تشکر می کنند. البته بنده از این مشی مبحث همچین استنباطی کردم خدای نکرده جسارت به عزیزان و علاقمندان نباشد.
بنده اصلاً بحثی بر سر فایل های PE ندارم ولی خب موضوع اصلاً داره به سمت دیگه ای هدایت میشه، و چون موضع سوال بنده اصلاً این نیست گمان می کنم اگر همه بحث ها همین جا شفاف صورت گیرد و بنده به عنوان طراح سوال درش دخیل باشم به رای نظر های دیگر ختم نشود. اینکه عزیزی به کلمه re source کردن ایراد وارد می دانند خب خیلی منطقی نیست، در گوگل سرچ بفرمایید تا با این اصطلاح آشنا شوید به جای اینکه از فضای بحث خارج شویم!!
A resource is a source or supply from which benefit is produced
اگر مدیر محترم بخش صلاح می دانند موضع سوال را مجدد طرح نمایم تا عزیزان همفکری نمایند.
همانطور که دوستمون هم اشاره کرند پایه بحث آکادمیک و بخشی از آن نظریه شخصی بنده است که در خصوص آن تحقیق می کنم. اصولاً شکل گیری علم بر همین روال است!
اصرار بر فایل های PE علیرغم اینکه اصلاً مورد سوال بنده نیست و عناوین بنده را مطالعه بفرمایید هیچ سوالی حتی مرتبط نیز مطرح نشده است اما قابل توجه عزیزان تعریف فایل PE (http://msdn.microsoft.com/en-us/magazine/cc301805.aspx) را قرار دادم، منبع هم سایت مایکروسافت هست، و تعاریف بنده دقیقاً بر همین اساس است اما به تفکیک. حالا اینکه عده ای از دوستان تمایل به پذیرفتن این تعریف ندارند یا صلاح می دانند که بر هر واژه ای تعریفی جدید از خود به جای بگذارند بحث دیگری است. مفهوم تعریف جدید و قدیم فایل PE یعنی چه؟ دوست عزیز باید خدمت شما عرض کنم core اصلی ویندوز 8 داس هست. نکند این هم تعریف جدیدی دارد؟


به هر حال خواهش می کنم اگر بحث ها مغرضانه است بنده ادمه ندهم، اگر فضای علمی است بسم الله.
از مدیریت محترم خواهشمند تاپیک را بلاک نفرمایند و با رهنمایی و صلاحدید ادامه بحث را هدایت فرمایند.

lukaskain
یک شنبه 22 اردیبهشت 1392, 21:20 عصر
فايل های اجرايی EXE تحت ويندوز با يک قطعه ۵۱۲ بايتی بنام هدر (Header) شروع می شوند،



این توضیحاتی که راجع به ساختار فایل PE نوشتید خیلی قدیمیه و مربوط به زمانیه که ما فایلهای EXE و COM داشتیم(مگر اینکه شما دارید درباره RealMode صحبت میکنید). به منابع جدیدتر رجوع کنید. از این گذشته اینکه در منوال ها

یک مشکل دیگر که نیز در بحث عزیزان هست و الان متوجه شدم بنده به دنبال مقایسه فایل های dll و exe از لحاظ ساختاری هستم، تعاریف بنده مربوط به فایل exe هست، حالا نمی دانم چرا این تعریف را به فایل PE اصلاق فرمودید، قطعاً عزیزان مستحضر هستند که هر دو فایل dll و exe از نوع PE هستند، حالا و اصلاً تعریف ساختار فایل های exe به عنوان زیر مجموعه ارتباطی به Portable Executable به عنوان شاخه کلی ندارد!