« بررسی ساختار طنز در آثار نثر ابوالقاسم حالت- فایل ... | فایل پایان نامه کارشناسی ارشد : پروژه های پژوهشی و تحقیقاتی دانشگاه ها در مورد ارائه مدلی برای گزینش استراتژی ... » |
۰۰۴۰۱۰۰A ADD BYTE PTR DS:[EAX],AL
۰۰۴۰۱۰۰C ADD BYTE PTR DS:[EAX],AL
۰۰۴۰۱۰۰E ADD BYTE PTR DS:[EAX],AL
شکل۳-۲ بایت های دستور نگهداری شده در نقطه ورودی اصلی پیش از اینکه برنامه اصلی باز شود.
۰۰۴۰۱۰۰۰ CALL Sample84.004010DC
۰۰۴۰۱۰۰۵ TEST EAX,EAX
۰۰۴۰۱۰۰۷ JNZ SHORT Sample84.0040100E
۰۰۴۰۱۰۰۹ CALL Sample84.00401018
۰۰۴۰۱۰۰E PUSH EAX
۰۰۴۰۱۰۰F CALL DWORD PTR DS:[414304] ; kernel32.ExitProcess
۰۰۴۰۱۰۱۵ RETN
شکل ۳-۳ برنامه قابل اجرا را زمان بارگذاری در حافظه است نشان میدهد
حاوی پنهان کردنهای یافت شده در همان آدرس است زمانی که جهش ته درحال انجام میباشد. مورد اجرایی اصلی بازشده است و اکنون دستورهای موجود درآن مکان وجود دارد. این تغییر نشانه دیگری از جهشهای ته میباشد.
روش دیگربرای یافتن جهش ته تنظیم یک نقطه انفصال خواندنی در دسته است. نقطههای انفصال خوانده شده را بخاطر داشته باشید شما باید از نقطه انفصال سختافزار یا نقطه انفصل حافظه OLLYDBG استفاده کنید. بیشتر توابع درنادیده گرفتن شامل بازکردن ریشه بادستور push برخی ترتیبها شروع میشوند که شما میتوانید رای پیشرفت ازآن استفاده کنید. ابتدا نکتهای از آدرس حافظه دردسته ایجاد میکنیم جایی که اولین مقدار نشانده میشود وسپس یک نقطه انفصال در بازخواندن برای آن محل دسته تنظیم کنید.
(( اینجا فقط تکه ای از متن درج شده است. برای خرید متن کامل فایل پایان نامه با فرمت ورد می توانید به سایت nefo.ir مراجعه نمایید و کلمه کلیدی مورد نظرتان را جستجو نمایید. ))
پس از آن نشاندن ابتدایی هرچیز دیگری دردسته در دسته بالاترخواهد بود (دریک آدرس حافظه پایینتر). تنها زمانی که ریشه بازشده کامل شد آن آدرس دسته ازنشانده اصلی دردسترس میباشد. بنابراین آن آدرس از طریق یک دستور pop دردسترس خواهد بود که به نقطه انفصال ضربه میزند واجراراقطع میکند. جهش ته بطورعادی پس از دستور pop است. ضروری است که چندین نوع مختلف نقطه انفصال را درآن آدرس امتحان کرد.
نقطه انفصال سخت افزار درخوانده نمونه خوبی برای تلاش اول است. قابل ذکراست که واسطه Ollydbg به شما اجازه نمیدهد که نقطه انفصال را در پنجره دسته تنظیم کنید. شما باید آدرس دسته را در پنجره نسخه برداری حافظه مشاهده کنید و نقطه انفصال رادرآن تنظیم کنید.
استراتژی دیگر برای پیداکردن نقطه ورودی اصلی بطوردستی تنظیم نقطه انفصال پس از هر حلقه درکد است. این به شما اجازه میدهد که هر دستور اجرا شده بدون اتلاف زمان زیادی که ازطریق همان کد در حلقه را چندین و چندبار مشاهده کنید. بطور عادی کد چندین حلقه دارد شامل
حلقههایی در حلقهها. حلقهها رابا اسکن کردن از طریق کد و تنظیم یک نقطه انفصال پس از هرحلقه مشخص کنید. این روش بطوردستی متمرکز است و طولانیتر از بقیه روشها است اما برای درک آسان است. بزرگترین مشکل این روش تنظیم نقطه انفصال در مکان اشتباه است که سبب اجرا برای تکمیل بدون موفقیت نقطه انفصال میشود. اگر این رخ دهد ناامید نشوید به جایی برگردید که خارج شدید و تنظیمات نقطه انفصال را در راستای فرایند نگه دارید تا نقطه ورودی اصلی را پیدا کنید.
مشکل دیگر فراخوانی تابعی است که هیچگاه باز نمیگردد. زمانی که از فراخوانی یک تابع عبور میکنید برنامه به اجرا ادامه خواهد داد و نقطه انفصال هیچگاه به سرانجام نمیرسد. تنها راه برای آدرس دادن به این شروع دوباره برگشت به همان فراخوانی تابع و رفتن به چای حرکت به بیرون از آن است. حرکت به سوی هر تابع میتواند وقت گیر باشد. پس صلاح است که از آزمایش و خطا برای تعیین آن استفاده کنید زمانی که حرکت به بیرون دارد در برابر حرکت به درون.
استراتژی دیگر برای یافتن جهش ته تنظیم یک نقطه انفصال در Get proc Address است بیشتر بازکنندهها از getproctAddress برای حل ورودیهای تابع اصلی استفاده خواهند کرد. نقطه انفصالی که در Get proc Address موفق هستند در دسته بازشدهاند اما هنوز کدهای زیادی پیش از جهش ته وجود دارد. تنظیم یک نقطه انفصال در Get proc Address به شما اجازه میدهد که مسیر ابتدای دسته بازشده را تغییر دهد که اغلب حاوی پیچیدهترین کدهاست.
روش دیگر تنظیم یک نقطه انفصال درتابع است که میدانید توسط برنامه اصلی فراخوانده خواهد شد و وارونه کار میکند. برای مثال در بیشتر برنامههای ویندوز نقطه ورودی اصلی میتواند درابتدای یک پوشش استاندارد کد یافت شود که خارج از روش اصلی است. چون همیشه پوشش یکسان است میتوانید با تنظیم یک نقطه انفصال دریکی از توابعی که فرا میخوانند آنها را بیابید.
برای برنامههای خط فرمان این پوشش توابع Getversion و Getcommandlime A را در ابتدای فرایند فرا میخواند سپس میتوانید تلاش کنید که آن را جدا کنید زمانی که آن توابع فراخوانده شدهاند. برنامه هنوز بارگذاری نشده است اما میتوانید یک از اولین دستورات Getversion را تنظیم کنید که بخوبی کار میکند. دربرنامههای GUT و getmodulehandlea معمولا اولین تابع برای فراخوانی است. پس ازاینکه برنامه بازشد چارچوب دسته پیشین را آزمایش کنید تاببینید فراخوانی ازکجاست. باشروع در دستور call به دنبال شروع تابع باشید. بیشتر توابع با pushebp شروع میشوند و با movebpesp ادامه مییابند. سعی کنید باشروع آن تابع به عنوان نقطه ورودی اصلی از برنامه نسخه برداری کنید. اگر درست باشد وآن تابع نقطه ورودی اصلی باشد به پایان رسیدهاید. اگر اشتباه کرده باشید برنامه همچنان نسخه برداری میشود زیرا ریشه بازشده به اتمام رسیده است. شما میتوانید برنامه را در idapro ببینید و آن را هدایت کنید. امام ضرورتانمی دانید برنامه از کجا شروع میشود. شاید خوش شانس باشد و idapro بطور خودکار winmain و dllmain را تشخیص دهد.
آخرین تکنیک برای جای دادن نقطه ورودی اصلی استفاده از گزینه Run trace در ollyDbg است. Run trace به شما آخرین عدد اضافی گزینههای نقطه انفصال را میدهد و اجازه میدهد که یک نقطه انفصال را در محدوده وسیعی از آدرسها جای دهید. برای مثال بیشتر بستهها بخش text را برای فایل اصلی جدا میکنند. هیچ چیزی در بخش text در دیسک وجود ندارد اما بخش در پرونده اجرایی قابل حمل باقی میماند چنانکه بارگذار فضایی را برای آن در حافظه ایجاد خواهد کرد. نقطه ورودی اصلی در بین بخش text اصلی است و اغلب اولین دستور فراخوانده شده در بین آن بخش است. گزینه Run trace به شما اجازه میدهد که یک نقطه انفصال برای راه انداز هر زمان که دستوری در بخش text اجرا میشود را تنظیم کنید. زمانی که نقطه انفصال راه اندازی شد، نقطه ورودی اصلی میتواند پیدا شود.
۳-۱۰- اصلاح جدول ورودی بطور دستی
ollyDbg و ImpRec معمولا قادر به بازسازی جدول ورودی با جستجو در میان برنامهها در حافظه برای آنچه شبیه لیستی از توابع ورودی هستند. اما برخی اوقات این موفق نمیشود و نیاز دارید که کمی بیشتر درباره اینکه جدول ورودی برای آنالیز بدافزار چگونه کار میکند یاد بگیرد.
جدول ورودی در اصل دو جدول در حافظه است. جدول اول لیستی از نامها یا ترتیبهای استفاده شده توسط بارگذار است برای تعیین اینکه کدام توابع نیاز هستند. جدول دوم لیستی از آدرسهای تمامی توابع است که وارد شدهاند. زمانی که اجرا میشود تنها جدول دوم نیاز است، پس بسته بند میتواند لیست نامها را برای بینتیجه گذاشتن آنالیز حذف کند. اگر لیست نامها پاک شده باشد نیاز دارید که بطور دستی جدول را دوباره بسازید.
آنالیز بدافزار بدون ورود اطلاعات بسیار دشوار است، پس بهتر است که اطلاعات ورودی را هر زمان که ممکن است اصلاح کنید. سادهترین استراتژی اصلاح ورودیها در یک زمان است. برای انجام آنها، فایل را درIDA Pro بدون هیچ اطلاعات ورودی باز کنید. زمانی که یک فراخوانی را از تابع وارد شده میبینید، آن تابع ورودی را برچسب گذاری کنید. فراخوانی توابع ورودی یک فراخوانی غیر مستقیم به یک آدرس است که خارج از برنامه بازگذاری شده است. همانطور که درشکل ۳-۴ نشان داده شده است.
pusheax
call dword_401244
…
dword_401244: 0x7c4586c8
شکل۳-۴ یک تابع ورودی را فرا می خواند
شکل۳-۴ یک تابع ورودی را زمانی که جدول ورودی بطور کامل بازسازی نشده است را فرا میخوانید.
فهرست یک دستور call با هدفی براساس یک نشانگر DWORD را نشان میدهد. در IDA Pro، ما به DWORD هدایت میشویم و میبینیم که مقداری از ۰X7C4586C8 است که خارج از برنامه بارگذاری شده ما میباشد. سپس ollyDbg را باز میکنیم و به ادرس۰X7C4586C8 هدایت میشویم تا ببینیم چه چیزی آنجاست. ollyDbg آدرس Write File را نشان میدهد و میتوانیم آدرس ورودی را به عنوان imp_Write File برچسب گذاری کنیم پس میدانیم کدام تابع عمل میکند. شما نیاز دارید که برای هر ورودی در میان این مراحل حرکت کنید. ویژگی منبع IDA Pro تمامی فراخوانیها را به توابع وارد شده برچسب گذاری میکند. زمانی که توابع کافی را برچسب گذاری کردید، میتوانید به طور موثری بدافزار را آنالیز کنید. اصلیترین اشکال این روش این است که نیاز دارید توابع زیادی را برچسب گذاری کنید و نمیتوانید به دنبال فراخوانیهایی برای ورودیها باشید تا زمانی که آن را برچسب گذاری کرده باشید. اشکال دیگر این است که نمیتوانید بطور واقعی برنامه باز شده خود را اجرا کنید. زیرا شما میتوانید برنامه باز شده را برای آنالیز پویا استفاده کنید و هنوز میتوانید از برنامه بسته شده برای آنالیز ایستا استفاده کنید. یک استراتژی دیگر که به شما اجازه میدهد برنامههای بازشده را اجرا کنید، بازسازی جدول ورودی بطور دستی است. اگر شما جدول توابع ورودی را پیدا کنید میتوانید جدول ورودی اصلی را با دست دوباره بسازید. شکل فایل پرونده اجرایی قابل حمل یک استاندارد باز است و میتوانید توابع ورودی را در یک زمان وارد کنید یا میتوانید اسکریپتی را برای وارد کردن اطلاعات بنویسید. بزرگترین اشکال این روش این است که میتواند کسل کننده و وقت گیر باشد.
نکته: برخی اوقات صاحبان بدافزار بیش از یک بازکننده استفاده میکنند. این کار را برای آنالیزور دوبرابر میکند، اما با ماندگاری معمولا امکان پذیر است که آنها را باز کرد. استراتژی اسان است: اولین لایه را با بهره گرفتن از دو تکنیکی که توضیح دادیم به عقب برگردانید و سپس این کار را برای بازگرداندن لایه دوم تکرار کنید. استراتژیها یکسان هستند، بدون توجه به تعداد بستههای استفاده شده.
۳-۱۱- راه ها و روش ها برای بسته بندی های رایج
این بخش نمونهای از بسته بندیهای پر طرفدار را پوشش میدهد که زمانی که بدافزار را آنالیز میکنید با آن مواجه میشوید. برای هر بسته بندی پوشش داده شده ما یک توضیح و یک استراتژی برای باز کردن بطور دستی بیان میکنیم. بازکنندههای خودکار برای برخی از اینها لیست شدهاند اما همیشه کار نمی کنند. برای هر بسته بند، استراتژیهایی برای پیدا کردن نقطه ورودی اصلی بیان شده است.
۳-۱۱-۱-UPX1
رایجترین بسته بند استفاده شده برای بدافزار بسته بند نهایی برای اجرا است (UPX. UPX) منبع آزاد، رایگان و برای استفاده راحت است. UPX قابلیت اجرا را فشرده میکند و برای عملکرد فراتر از امنیتی طراحی شده است. UPX مشهور است بخاطر سرعت کاهش فشردگی بالا، اندازه کوچک و نیاز به حافظه کم. UPX برای مشکل بودن مهندسی معکوس طراحی نشده بود و در وضعیت چالش برای آنالیزور بدافزار نیست. بیشتر برنامههای بسته شده با UPX میتوانند با UPX نیز باز شوند و خط فرمان یک گزینه d دارد که میتوانید از آن برای کاهش فشردگی یک UPX بسته شده قابل اجرا استفاده کنید به دلیل غلبه آسان بر آن، UPX یک بسته بند خوب برای یادگیری چگونگی باز کردن بدافزار بطور دستی است. بسیاری از برنامههای مخفیانه برای بسته بندی با UPX طراحی شدهاند. زمانی که آنها بطور واقعی با بسته بند یا نسخه UPX اصلاح شده دیگری بسته بندی شدهاند. در این مورد برنامه UPX قادر به بازکردن اجرا نیست.
شما میتوانید نقطه ورودی اصلی را برای UPX یا استفاده از بیشتر استراتژیهای آمده شده در ابتدای این فصل استفاده کنید. همچنین میتوانید از پیدا کردن نقطه ورودی اصلی با ویژگی بخش جهش در ollyDbg استفاده کنید یا به آسانی از طریق ریشه باز شده به پایین بروید تا جهش ته را ببینید. دو برداری از فایل و بازسازی جدول ورودی با ollyDbg موفق خواهد بود.
۳-۱۱-۲- PE Compact
PE Compact یک بسته بند تجاری طراحی شده برای سرعت و عملکرد است. یک نسخه دانشجویی رایگان قطع شده اغلب توسط نویسندگان بدافزار استفاده میشود. برنامههای بسته شده با این بسته بند میتواند برای باز کردن مشکل باشد زیرا شامل کدهای مبهم و ضد اشکال زاست. پرونده اجرایی قابل حمل Compact چارچوبی متصل کننده دارد که به ابزارهای بخش سوم اجازه میدهد مشارکت کنند و نویسندگان بدافزار اغلب از ابزارهای بخش سوم برای مشکلتر کردن باز کردن استفاده میکنند. باز کردن PE Compact بطور دستی بسیار شبیه باز کردن UPX است. برنامه برخی استثناها را ایجاد میکند، پس نیاز خواهید داشت که تنظیم OllyDbg را برای عبور از این استثناها به برنامه داشته باشید. میتوانید نقطه ورودی اصلی را با جستجوی جهش ته پیدا کنید. از چندین تابع بگذرید و یک جهش ته را که حاوی یک jmpeax همراه با بایتهای زیاد ۰x۰۰ خواهید داشت.
۳-۱۱-۳- ASPack
ASPack برروی امنیت تمرکز دارد و تکنیکهایی را برای مشکل کردن برنامههای باز شده بکار میبرد. ASPack از کد خود اصلاح شده استفاده میکند که آن را برای تنظیم نقطه انفصال و آنالیز مشکل میکند. تنظیم نقطه انفصال میتواند سبب شود برنامههای بسته شده با ASPack بطور نابهنگامی به پایان برسد، اما این برنامه میتواند بطور دستی با بهره گرفتن از نقاط انفصال سخت افزاری تنظیم شده برروی آدرس دسته باز شوند. ASPack بسیار محبوب است زیرا باز کنندهای خودکار بسیاری وجود دارد. تأثیرات آنها متفاوت است اما باز کردن خودکار همیشه برای تلاش به عنوان اولین گزینه ارزش دارد.
اگرچه ممکن است با موفقیت یک فایل ASPack بسته شده را با بهره گرفتن از تکنیکهای خودکار باز کنید، ولی اکثر اوقات نیاز خواهید داشت که فایلها را بطور دستی باز کنید. با باز کردن کد برای ریشه باز کردن شروع کنید. ابتدا در کد، یک دستور PUSHAD را خواهید دید. تعیین کنید کدام آدرسهای دسته برای نگهداری ثبتها استفاده شدهاند و یک نقطه انفصال سخت افزاری را برروی آن آدرسها تنظیم کنید. مطمئن شوید که انفصال برروی یک دستور خوانده شده تنظیم شده است. زمانی که دستور POPADمتناظر فراخوانده شد، نقطه انفصال راه اندازی خواهد شد و شما چند دستور را دور از جهش ته دارید که به نقطه ورودی اصلی میرسد.
۳-۱۱-۴- Petit
Petit در تعداد روشها شبیه ASPack است. Petit از مکانیزم ضد اشکال زایی برای مشکل کردن تعیین نقطه ورودی اصلی استفاده میکند، و کد Petit از استثناهای تک مرحلهای برای رفتن به اشکال زدا استفاده میکند. این میتواند با عبور استثناهای تک مرحلهای به برنامه همانطور که در فصول قبلی توضیح داده شد حل شود. بهترین استراتژی استفاده از نقطه انفصال در دسته برای پیدا کردن نقطه ورودی اصلی است، همانند ASPack. Petit از یک ساختار کد پیچیده استفاده میکند که آن را برای مشاهده نقطه ورودی اصلی در زمان بسته شدن راحت میسازد زیرا کد اصلی برخلاف کد پوشش دهنده Petit عادی به نظر میرسد. Petit همچنین حداقل یک ورودی را از هر مجموعه در جدول ورودی واقعی حفظ میکند. اگرچه این تأثیری بر مشکل بودن باز کردن نمیگذارد، میتوانید به راحتی تعیین کنید بدافزار از کدام DLL بدون باز کردن آن استفاده میکند.
۳-۱۱-۵-WinUpack
فرم در حال بارگذاری ...