Reverse Code Engineering

逆向工程代码 обратная код машиностроения

Reverse Code Engineering

逆向工程代码 обратная код машиностроения

Reverse Code Engineering

Share what I know............... learn what I don’t

آخرین نظرات

پکر و آنپکر

جمعه, ۲۹ آبان ۱۳۹۴، ۰۹:۵۷ ق.ظ
با سلام خدمت دوستان.
اول از همه ازتون عذر میخوام که مدتی نبودم.
امروز رو قراره مختصری در مورد پکر ها توضیح بدم.

پکرها رو احتمالا فقط reverse کارها نمیشناسند افرادی که با مبحث نرم افزار سروکار دارند این ابزار رومیشناسند.

دلایلی که ما از پکرها استفاده می کنیم:
1- برای کاهش سایز فایلمون (البته این مورد با افزایش حافظه و قدرت سخت افزار دیگه دلیل قانع کننده ای نیست)
2- فرار از کشف و آنالیز شدن (این کار هم جنبه مثبت داره و هم جنبه ی منفی. جنبه ی مثبتش استفاده کردن برنامه نویس ها مخصوصا ایرانی ها برای سخت تر کردن مراحل کرک و ... و جنبه ی منفی اون bypass کردن آنتی ویروس و سخت ترکردن تحلیل بدافزار میتونه باشه)

تعریف کلی پکر:
گرفتن یک فایل اجرایی و فشرده سازی آن.
برای سخت تر شدن تحلیل پکر میتونه فایل اجرایی رو رمز کنه یا از تکنیک های anti reversing مثل آنتی دیباگ , آنتی دیس و ... استفاده کنه.
پکر میتونه کل یه فایل اجرایی رو پک کنه یا اینکه فقط یه سری سکشن های خاص مثل سکشن code رو پک کنه.
همه ی اینها به هدف پکر بستگی داره.
این روند یه طرفه هستش !؟ 
باید این مراحل برعکس بشه تا بتونیم فایل رو قابل اجرا بکنیم وگرنه یه فایل اجرایی فشرده شده که ساختار PE اون دیگه قابل تشخیص نیست رو که نمیشه اجرا کرد!

اینجاست که Unpacking Stub وارد میشه:
یه فایل اجرایی معمولی در ویندوز توسط لودر ویندوز بارگزاری میشه.
Unpacking Stub یه مجموعه کدی هستش که به فایل پک شده اضافه میشه و مسئول بارگزاری و اجرای شدن فایل پک شده هستش.
پس در یک فایل پک شده: 
لودر ویندوز میاد Unpacking Stub رو لود میشه و این هم میاد فایل پک شده رو بارگزاری میکنه.

وظایف Unpacking Stub :
* آنپک کردن فایل پک شده به داخل حافظه
* resolve کردن import ها
* انتقال جریان اجرایی به entry point اصلی (OEP)

آنپک کردن فایل پک شده به داخل حافظه :
عملکرد این مرحله میتونه برای هر پکر متفاوت باشه ولی هدف یکی هستش: آنپک کردن فایل و قرار دادن اون در حافظه.

Resolve کردن import ها :
وقتی یه فایلی پک میشه پس import table اون هم تخریب میشه و دیگه نمیتونه از کتابخانه ها و توابع اونا استفاده کنه.

Unpacking Stub وظیفه ی بازسازی رو داره به چند روش زیر:

1- احتمالا فایل های پک شده ای رو دیدید که فقط 2 تابع LoadLibary و GetProcAddress رو دارند. با تابع اول میشه یه DLL رو لود کرد و با تابع دوم میشه آدرس تابع رو بدست آورد. Unpacking Stub کتابخانه ها و توابع مورد نیاز برنامه رو با این دو تابع مهیا میکنه.

2- بعضی از پکر ها اصلا import هارو تخریب نمیکنند یعنی همونی هستش توی فایل اصلی وجود داره . با این کار دیگه وظیفه لودر ویندوز هستش که این توابع و کتابخانه ها رو مهیا کنه نه Unpacking Stub

3- نگهداری یک تابع از هر DLL .
با اینکار تمام کتابخانه ها لود میشند فقط باید با استفاده از GetProcAddress آدرس هارو بدست آورد.

4- روش دیگه از بین بردن کل import هاست. یعنی دیگه هیچ تابعی وجود نداره. در اینجا Unpacking Stub مجبوره از روش های دیگه (بدون استفاده از تابع) خودش رو توابع برسونه. این روش در شلکد ها هم استفاده میشه.

انتقال جریان اجرایی به entry point اصلی (OEP) :
زمانی که Unpacking Stub کارش تموم میشه حالا باید روند اجرا رو به کد های اصلی بده. 
این انتقال جریان اجرایی اصولا با استفاده از دستورات پرش مثل jmp, call , ret و ... صورت میگیره که بهشون tail jump هم میگن.
پیدا کردن tail jump ها توی بعضی از پکرها سادس و میتونید با یه نگاه به انتهای کد توی دیباگر پیداش کنید.




نکته :
همیشه ظاهر و محتویات برنامه آنپک شده با برنامه ی اصلی که پک نشده متفاوت هستش. این تفاوت ها رو توی PE header , نام و تعداد سکشن ها و ... امکان داره مشاهده کنید.

نشانه های برنامه ی پک شده:
1- برنامه دارای توابع ورودی (import) خیلی کم هستش. (به قسمت resolve کردن import ها مراجعه کنید)

2- زمانی که فایل رو در IDA باز میکنیم کد های کمی مشاهده کنیم یا هنگام باز کردن فایل در ollydbg با هشدار "احتمال پک بودن برنامه" مواجع بشیم.

3- نام سکشن های برنامه نامتعارف باشه یا اسم یه پکر مشخص باشه (مثل UPX0) 

4- برنامه دارای سایز سکشن نامتعارف باشه.

5- بدست آوردن آنتروپی. هرچی آنتروپی بیشتر باشه احتمال پک بودن برنامه هم بیشتر هستش.

6- ...

آنپک کردن:

سه روش برای آنپک کردن وجود داره:
1- automated static unpacking
2- automated dynamic unpacking
3- manual dynamic unpacking

روش اول میشه گفت سریعترین روش هستش و اگه کارکنه  بهترین روش هستش ولی مسلما روی پکرهای محدودی ازین روش میشه استفاده کرد البته نه همه ی ورژن هاشون : NSPack, UPX, UPack 

در روش دوم به برنامه پک شده اجازه اجرا شدن داده میشه تا Unpacking Stub وظیفش رو انجام بده و پس از اتمام اون از برنامه ی آنپک شده دامپ گرفته میشه.توی این روش مهمترین مسئله یافتن انتهای Unpacking Stub هستش که اگه اشتباه این کار انجام بشه فایل آنپک شده ناقص خواهد بود.

روش سوم مطمئن ترین روش هستش چون همه چیز بصورت دستی انجام میشه.
دو روش رایج برای انجام این کار:
1- جستجوی الگوریتم پک و نوشتن برنامه ای که عکس آنرا انجام دهد
2- اجرای برنامه ی پک شده و دامپ گرفتن و فیکس کردن PE header (بازسازی import table و تغییر EP برنامه به OEP )


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

موفق باشید.
Pcrlth0n

نظرات (۰)

هیچ نظری هنوز ثبت نشده است
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی