PDA

View Full Version : تغییر در ساختار فایل اجرای توسط Viruse ها،......؟؟؟



saeedIRHA
جمعه 01 اردیبهشت 1385, 10:44 صبح
سلام،
از دوستان کسی میدونه یک سری از Trojan ها یا Virus و...
چطوری میتونن در ساختار فایل اجرای تغییر ایجاد کنن و خودشن رو بچسبونن به فایل ؟؟؟
میخواستم بدونم که اصلاً چطور این مسئله امکان پذیر هست،چون بدونه برهم زدن ساختار فایل
و هیج گونه ایردی در روند اجری این کار رو انجام میدان ،و فایل کاملاً درست اجرا میشه و Virus رو هم
اجرا میکنه بدون هیچ مشکلی!!!!
چون فایل اجرای مثله فایل Text نیست که بشه راحت روش تغییر ایجاد کرد چون شامل یک سری چیز های دیگه از جمله Header ,.... هست،بخاطر همین این برای من جای سؤال داره!؟؟؟؟

با تشکر.

Inprise
جمعه 01 اردیبهشت 1385, 14:05 عصر
کلمهء کلیدی : Binary Infection

از روشهای خاص و/یا ابتکاری که بگذریم ویروسها برای آلوده کردن باینریها روشهای مشخصی دارن که چندان پیچیده نیستند .

Stub : ویروس غیر از کد مخربش حاوی یک Loader Engine هم هست که باینریهای مورد نظرش رو به شدت فشرده میکنه و داخل Loader Engine اش نگهداری میکنه و در صورت اجرای ویروس در عمل برنامه اصلی هم اجرا میشه ؛ این ویروسها روی داس متداول بودند . Stub Virus هائی که این روزها نوشته میشن اونقدر باهوش هستند که قبل از Infection حجم و هدر رو به نحو احسن تغییر بدن .

Overwrite‌ : بعضی از ویروسها بخشهائی از فایل باینری رو بازنویسی میکنن ؛ یک سناریوی ساده اینه که Payload ویروس که حجم فوق العاده کوچکی داره روی یکی از قسمتهای غیر ضروری فایل باینری بازنویسی میشه و EntryPoint برنامه با یک Jmp ساده دستکاری میشه ، تا ضمن اجرای برنامه ویروس هم اجرا بشه .

Extra Section‌ : فرمتهای باینری متداول و معروف مثل PE یا ELF از Section های مختلفی تشکیل شدن که هر کدوم برای مقصود خاصی در نظر گرفته میشن و این امکان وجود داره که به فایل مورد نظر Section‌ ها دیگری رو اضافه کرد ، یعنی همانطور که مثلا" bss. و text. بخشهائی از یک فایل باینری روی لینوکس هستند ، میشه بسادگی بخش اضافه ای به هر نامی به فایل اضافه کرد ، قدم بعدی نحوهء اجرا کردن کدی است که در این بخش وجود داره ؛ گاهی اوقات ویروسها مانند Exploit ها کافیه یک Jmp مناسب پیدا کنن ، و گاهی دستکاری کردن OEP ساده تر هست ، و اینکه چه اتفاقی میفته بستگی داره به ویروس ؛ اولین ویروسی که برای آلوده کردن فایلهای دات نت منتشر شد بنام Win32/Donut از چنین روشی استفاده میکرد . یک Section اضافی و دستکاری نقطه شروع برنامه .

Append : بعضی از ویروسهای بدوی هم بسادگی به انتهای فایلهای باینری ضمیمه میشن ، اغلب ویروسهائی که روی داس و برای آلوده کردن فایلهای Com نوشته میشد همینطور بودند .


Hook : ویروسهای هوشمندتر ، صرفا" DLL ای رو به IAT فایل باینری اجرائی اضافه میکنن که هنگام اجرای فایل ، کمک میکنه DLL لزوما" وارد فضای آدرسی اون پروسه بشه ، یا به کمک رجیستری یا یکی دو تریک دیگر موجود ، از ویندوز میخوان که هنگام اجرا هر برنامه DLL مورد نظر ویروس رو وارد فضای آدرسی اش کنن ، که اگر قبلا" این اتفاق افتاده باشه دفعات بعدی فقط Map میشه ، و این DLL توابع به خصوصی رو Hook میکنه و هنگام اجرا اونها ، کد مورد نظرش رو تحت Context اون پروسه اجرا میکنه ، که اتفاقا" روش مناسبی برای Bypass کردن Host-Based IDS ها و انتی ویروسها هم هست ؛ مثلا" برنامه هائی که توسط کامپایلرهای بورلند نوشته میشن برای فراخوانی API ها بجای Call از Jmp استفاده میکنن [] JMP DWORD PRT ؛ و حالا کافیه Hooker ویروس یا منتظر فراخوانی یک JMP به محدوده آدرسی که معمولا" API ها Map میشن باشه ، تا قبلش JMP خودش رو اجرا کنه و بعد کنترل رو برگردونه ، و بدین ترتیب مشکلی با برنامه هائی که از Memory Packer استفاده میکنن یا بصورت Run-time ‍و دائمی CRC بخشهای خاصی رو چک میکنن وجود نخواهد داشت ؛ بدین ترتیب حتی برنامه هائی مانند Skype که کلیه توابع اصلیشون حتی روی حافظه رمز شده هستند ، میتونن در لحظهء فراخوانی یک API مناسب ، قربانی خوبی برای یک ویروس باشند ، که مایله با دردسر کمتری و بدون جلب توجه آنتی ویروس یا HIDS اجرا بشه ؛ اغلب User Mode Rootkit های مبتنی بر ویندوز دقیقا" همینطور عمل میکنن .

Import Table Infection : کتابخانه هائی که بصورت استاتیک به یک برنامه لینک شده اند ورودی هائی در IAT برنامه باینری اجرائی دارند ، که ویروس با یکبار Inject کردن DLL خودش به فضای یکی از پروسه های معروف و همیشه-در-حال-اجرا ، و تغییر ادرس توابع IAT میتونه باعث بشه به محض اجرای برنامه ، کد آلوده اجرا بشه ؛ این تکنیک محدودیتهای بیشتری داره ، و اغلب Exploit ها ازش استفاده میکنند ، مثلا VNC Injector Module در MetaSploit Framework .

TLS : روی معماریها و سیستمهای عامل محدودی - مثلا" خانواده ویندوز NT - تابع اصلی برنامه یا همان Main خودمان لزوما" اولین چیزی نیست که اجرا میشه . لودر سیستم عامل بخشی از هدر فایل بنام Thread Local Storage Directory‌رو میگرده و اگر برای یکی از Thread های برنامه نقطه شروع مستقلی در نظر گرفته شده بود ابتدا او رو اجرا میکنه و آنگاه سراغ OEP برنامه میاد . Win32/Chiton از این روش استفاده میکرد .

اغلب ویروسها با ترکیبی از روشهای مذکور فعالیت میکنند ؛ بازنویسی هدر فایل باینری کار ساده ای است ، ساختارهای هدرهای فرمتهائی نظیر PE و ELF و COFF براحتی در دسترس هستند ، برای نوشتن روی فایل ، یا نوشتن روی حافظه ، چه داخل یک پروسه ، چه روی پروسه های غریبه هم توابعی توسط سیستم عامل فراهم شده ؛ مسئلهء مبهمی وجود نداره .

sinpin
جمعه 01 اردیبهشت 1385, 15:41 عصر
با سلام
آقای Inprise (http://www.barnamenevis.org/forum/member.php?u=1341) اگر ممکنه در مورد نحوه فشرده سازی فایل های pe توضیحی بفرمایید. برای مثال نجوه کار برنامه aspack
متشکرم...

saeedIRHA
جمعه 01 اردیبهشت 1385, 20:38 عصر
سلام دوست عزیز Inprise ،
جوابتون بسیار عالی و هیجان انگیز بود،ولی چند تا سؤال برام مطرح شد،
من خودم سعی کردم با نوشتن یک برنامه روش Append کردن رو امتحان کنم،وقتی هم که کد رو Disassemble
میکنم حتا میبینم که کد من اضافه شده به فایل که میخوام اما در زمان اجرا کد من رو Run نمیکنه،
ولی برنامه Crash هم نمیکنه،رو این حساب نمیدونم علتش چی میتونه باشه!
ناگفته نماند که من سعی کردم 2 تا فایل Executable رو به هم بچسبونم،
و شما فک میکنید که کجایه کار اشکال داشته باشه ؟!

سؤالی که مرتبط با سؤال اولم هست اینکه آیا Virus ها برای تغییر دادن فایل اجرای Payload خودشن رو به ساختار فایل اضافه میکنن؟!؟!درست مثله همون روشی که Exploit ها در Shellcode شون ازش استفاده میکنن؟!!؟؟!
یا اینکه امکان این هم هست که بشه کل فایل اجرای رو به یک فایل دیگه اضافه کرد؟!؟!

و از همه مهمتر چطور میشه مکان مناسب برای اضافه کردن فایل رو شناسی کرد؟!؟!
با توجه به توضیحاتی که دادین ممنون میشام اگر محبت کنید و یک مثال هم بزنید.
که متوجه بشام چگونه و کجای فایل تغییر پیدا کرده.
یک سؤال دیگه هم که برای من پیش امد اینکه چطور میشه یک فایل نوشته شده با C رو به Payload
تبدیل کرد؟!؟!؟چون تا اونجا که من دیده بودم اینکارو با توجه به Opcode هایه فایل انجام میشه داد،
و در یک برنامه Compile شده ی C خیلی چیز هایه دیگه هم به فایل link شدن!!!!!
و با Disassemble کردنشن آدم متوجه این مسئله میشه ، با وجوده یک سری NULL بایت ها و
یک سری آدرس های که اصلاً مرتبط نیستن به اصل کد ما!

ممنون از توجهتون!

Inprise
جمعه 01 اردیبهشت 1385, 21:56 عصر
برای اضافه کردن کد به باینری اجرائیت کافی نیست که فقط کدت رو به فایل اضافه کنی . قاعدتا" منطق برنامه اصلیت حکم میکنه پس از اتمام کارش کنترل رو به سیستم عامل برگردونه و کد تو شانسی برای اجرا نداره ؛ بدیهیه که باید قبل از خروج از روال اصلی برنامه اصلی یک پرش به ابتدای کد اضافه شده توسط خودت بکنی ، و کدت باید شرایط مناسبی داشته باشه ، به عنوان مثال اگه ازAPI استفاده کردی باید مشخص باشه که مسئله آدرس دهی رو چطور حل میکنی و ...مواردی نظیر این
بله . اصولا" ویروس و اکسپلویت دو مفهوم مجزا نیستند .
برای شناسائی مکان مناسب در فایل باینری قاعده کلی ای وجود نداره . میتونی فایل رو بگردی و هر جا بایتهائی غیر ضروری به تناوب وجود داشت کدت رو جایگزین کنی و امیدوار و خوشبین باشی که مسئله خاصی پیش نمیاد ، یا Section‌جدیدی به باینری اضافه کنی و ...
برای اضافه کردن باینری به یک فایل اجرائی یک سری قاعده عمومی وجود داره . اول نحوه دسترسی به API یا توابع CRT هست ، توابع رو مستقیم صدا میکنی ؟ پس مسئله لینک رو چطور حل میکنی ؟ توابع رو در زمان اجرا فراخوانی میکنی ؟ اگه قبلا" فراخوانی شده باشند چی ؟ این مساله با مسالهء افرادی که به نوشتن Payload یک اکسپلویت فکر میکنن مشترکه . لابد مستندات مورد علاقه ات در این زمینه به روشهای متداول حل این مساله اشاره کرده اند که با مراجعه بهشون مسئله ات حل میشه .
بدون تردید بهترین راهنما برای دستکاری کردن یک فایل اجرائی روی ویندوز با نگاهی به مسائل امنیتی چیزی نیست بجز این :
برای اضافه کردن کد به باینری اجرائیت کافی نیست که فقط کدت رو به فایل اضافه کنی . قاعدتا" منطق برنامه اصلیت حکم میکنه پس از اتمام کارش کنترل رو به سیستم عامل برگردونه و کد تو شانسی برای اجرا نداره ؛ بدیهیه که باید قبل از خروج از روال اصلی برنامه اصلی یک پرش به ابتدای کد اضافه شده توسط خودت بکنی ، و کدت باید شرایط مناسبی داشته باشه ، به عنوان مثال اگه ازAPI استفاده کردی باید مشخص باشه که مسئله آدرس دهی رو چطور حل میکنی و ...مواردی نظیر این
بله . اصولا" ویروس و اکسپلویت دو مفهوم مجزا نیستند .
برای شناسائی مکان مناسب در فایل باینری قاعده کلی ای وجود نداره . میتونی فایل رو بگردی و هر جا بایتهائی غیر ضروری به تناوب وجود داشت کدت رو جایگزین کنی و امیدوار و خوشبین باشی که مسئله خاصی پیش نمیاد ، یا Section‌جدیدی به باینری اضافه کنی و ...
برای اضافه کردن باینری به یک فایل اجرائی یک سری قاعده عمومی وجود داره . اول نحوه دسترسی به API یا توابع CRT هست ، توابع رو مستقیم صدا میکنی ؟ پس مسئله لینک رو چطور حل میکنی ؟ توابع رو در زمان اجرا فراخوانی میکنی ؟ اگه قبلا" فراخوانی شده باشند چی ؟ این مساله با مسالهء افرادی که به نوشتن Payload یک اکسپلویت فکر میکنن مشترکه . لابد مستندات مورد علاقه ات در این زمینه به روشهای متداول حل این مساله اشاره کرده اند که با مراجعه بهشون مسئله ات حل میشه .
بدون تردید بهترین راهنما برای دستکاری کردن یک فایل اجرائی روی ویندوز با نگاهی به مسائل امنیتی چیزی نیست بجز این : Make your owner PE Protector (http://www.codeproject.com/cpp/peprotector1.asp) ( از حضرت اشکبیز دانه کار )به دقت مطالعه اش کن و از کدهاش استفاده کن . بعیده ابهامی باقی بمونه موفق باشی

saeedIRHA
شنبه 02 اردیبهشت 1385, 01:14 صبح
سلام دوست عزیز Inprise ،
واقعاً ممنون بسیار بسیار مفید بود مطالبتون!!
فقط یک چیز موند اونم اینکه ، متأسفانه مستنداتی که من در این ضمینه ای که بسیار بهش علاقه دارم در اختیار دارم هیچ اشاره به طراحی Payload ها، به اون صورت نکرده و فقط چند تا اشاره به نحوه گرفتن Shell یا Bind کردش کرده، و همه این کارارو توسط کد اصلیش که اون هم به زبانه Assembly بوده انجام داده، رو این حساب من میخوام بدونم کده هایه نوشته شده با C رو چطور میشه به Payload تبدیل کرد.؟؟؟؟
چون در Linux وقتی بخوایم کده C رو به Assembly تبدیل کنیم با "gcc -S" این کار امکان پذیر هست،
ولی با کده هایه نوشته شده با C در Windows باید چه کرد؟؟
باز هم تشکرات فراون!!

Inprise
شنبه 02 اردیبهشت 1385, 08:37 صبح
برای mingw و بورلند سی و کامپایلر سی اینتل همان S- کافی ست و برای ویژوال سی از nmake استفاده کن ؛ و در هر حال چه روی ویندوز و چه روی لینوکس ، Assembly Listing یک باینری لزوما" یک Playload مناسب برای اجرا وقتی یک پروسهء دیگه Host باشه نیست ؛

saeedIRHA
شنبه 02 اردیبهشت 1385, 10:11 صبح
سلام ،
واقعاً احسنت،خیلی خیلی عالی مسلط هستین،واقعاً من یکی از آرزوهام هست که بتونم انقدر تسلط پیدا کنم!
فقط به نظرتون چطوری میتونم یک Payload خوب طراحی کنم؟!
منبع خوبی در این مورد در ذهن دارید که بتونه برام مفید باشه ؟

باز هم تشکر از وقتتون!

Inprise
شنبه 02 اردیبهشت 1385, 14:19 عصر
مراجعی که تو بخش کتابخونه معرفی کردم نه مفید که لازم هستند ؛ اما روتین مشخص و محدودی برای روش نوشتن یک Payload خوب وجود نداره ؛ این مساله کاملا" به شرایط و محیط بستگی داره . یک مثال : فایروالی که ذکر نامش ضروری نیست دارای یک رابط مدیریتی است که با مجوز SYSTEM اجرا میشه ، که البته ضروری هم نیست ؛ ولی یکی از Edit Box هاش که برای ورود به رابط مدیریتی پسورد قبول میکنه نسبت به Shatter Attack آسیب پذیر هست ، یعنی Payload ات رو با تابع PostMessage به اون ادیت باکس پاس میکنی و اون برنامه اونقدر سخاوتمند هست که حتی اگر تو Guest باشی ، شلکدت رو با مجوزی که باهاش اجرا شده ، یعنی SYSTEM اجرا کنه . چون مجوز برنامه Host ات SYSTEM هات و Security Context اون پروسه حاوی کلیه مجوزهای امنیتی لازم - من جمله Debug Privilage - هست ، به API دیگری غیر از چیزهائی که داخل Kernel32 و User32 هست احتیاج نداری و این دو کتابخانه هم قبلا" فراخوانی شده اند . اینجا فقط به یک Payload ساده نیاز داریم ؛ Base Address دو کتابخانهء Kernel32 و User32 روی هر نسخهء ویندوز ثابت هست ، پس اگر Payload بخواد که روی ویندوزهای 2000 و اکس پی با موفقیت اجرا بشه کافیه که در مجموع چهار ادرس مختلف رو بررسی کنه ، برای هر کتابخانه دو آدرس ؛ این آدرسها قبلا" محاسبه شدن و مثلا" متااسپلویت بانک اطلاعاتی خوبی از این آدرسها داره . پس از ذخیره آدرس صحیح Base این دو کتابخانه باید محل ( آدرس ) توابعی مانند LoadLibrary و GetProcAddress و ReadFile و Send و سری توابع WSA برای سوکت و ...پیدا بشن ، و این نهایتا" بستگی داره به اینکه Payload میخواد چیکار کنه ؛ و بعد از داشتن لیستی از آدرس توابع ، کافیه که اونها رو با آرگومانهای مورد نیاز اجرا کنی ، مثلا" برای یک سناریوی ساده ، کافیه که یک درخواست ساده وب ارسال کنی و تروجانت رو از سایت وبت داونلود کنی و اجرا و نصبش کنی ، که داشتن آدرس توابعی مانند LoadLibrary و GetProcAddress برای فراخوانی WinSock32 و ShellExecute برای اجرای تروجان کافیه ، و فرضا" اگر قراره کد روی ویندوز 98 اجرا بشه ، چون سری توابع VirtualAlloc اونجا وجود ندارن نمیشه تروجان رو مستقیم از روی حافظه اجرا کرد پس باید برای نوشتن فایل هم تابع مناسبی رو پیدا کرد و اگر قرار باشه روی ویندوزهای 2000 و اکس پی اجرا بشه چون میشه کد داونلود شده رو روی حافظه نوشت و از همونجا اجرا کرد یافتن آدرسی برای نوشتن فایل لازم نیست و ...مواردی از این قبیل . کد نهایی Payload مناسبی برای سناریوی مذکور خواهد بود . اما همیشه Payload های فوق العاده ساده و محدودی که برای وظایف خاصی در نظر گرفته شدن وجود دارن ، مثلا" تو Wondiws Assembly Components ای که تیم LSD ( همان تیم لهستانی که باگ RPC ویندوز رو کشف کرد ) منتشر کرده اند Payload های مناسبی برای ایجاد کردن سوکت ، یا ریموت شل و مواردی از این قبیل وجود دارند ، که نهایتا" یک Payload خوب و عملیاتی ، از ترکیب دانش در مورد مقصد ، و Payload های سادهء موجود بوجود میاد .

saeedIRHA
شنبه 02 اردیبهشت 1385, 15:41 عصر
بسیار سپاسگزارم دوست عزیز،
امیدوارم باز هم بتونیم از اطلاعات مفیدتون استفاده کنیم.

sinpin
شنبه 02 اردیبهشت 1385, 20:21 عصر
ممنون
مفید بود. منم استفاده کردم.