PDA

View Full Version : مجموعه مقالات(!) در مورد برنامه نویسی win32



r00tkit
سه شنبه 26 بهمن 1389, 15:12 عصر
سلام
از این به بعد قصد دارم اخر هفته ها یه مقالهی کوچیک فقط در حد اشنایی اولیه و معرفی مفاهیم در مورد برنامه نویسی با C تو ویندوز بنویسم !!!

هر کی نظر داشت یا موضوعی رو دوست داشت در موردش صحبت بشه با پیام خصوصی بگه

اگه کسی دیگه ای هم توان نوشته چند خط مطلب رو داره دریغ نکنه !! همین نوشتن هاس که می مونه :) فقط نوشته ها کپی برداری نباشه خودتون بنویسید و مهم تر اینکه چیزی که می نویسین چیز خیلی مبتدی نباشه

نمی دونم همهی مقاله ها تو همین تاپیک باشن یا یه تاپیک داشته باشیم به عنوان index و هر مطلب تو یه تاپیک جدا نوشته بشه فقط لطفا اگه مدیری خواست تغییر بده این مطالب رو نبره تو قسمت منابع ، مراجع و مقالات مفید تالار (http://barnamenevis.org/showthread.php?233161-%D9%85%D9%86%D8%A7%D8%A8%D8%B9-%D8%8C-%D9%85%D8%B1%D8%A7%D8%AC%D8%B9-%D9%88-%D9%85%D9%82%D8%A7%D9%84%D8%A7%D8%AA-%D9%85%D9%81%DB%8C%D8%AF-%D8%AA%D8%A7%D9%84%D8%A7%D8%B1)




چون نمی دونم چه مطالبی زیاد به درد می خوره خودم همین جوری یه چیزی رو انتخاب کردم

موضوع این هفته : دیباگر ها چی جوری کار می کنن؟ ما چی جوری یه دیباگر بنویسیم؟

چند Terminology:
Debugger (http://en.wikipedia.org/wiki/Debugger): دیباگر برنامه ای هستش که کمک می کنه ما خطا ها و باگ های برنامه دیگه پیدا کنیم و به ما این اجازه رو می ده که روند اجرای برنامه رو در دست داشته باشیم (http://en.wikipedia.org/wiki/Stepping_%28debugging%29) و به بررسی مموری و متغیر ها و دیگر اجزاء پروسس و تریدها بپردازیم( اطلاعات دیگه از جمله تقسیم بندی دیباگر ها و لیست دیباگر ها رو در اینک ویکی بخونید)

symbol files (http://msdn.microsoft.com/en-us/library/aa363368%28v=vs.85%29.aspx): فایلی که اطلاعات دیباگ در ان ذخیره می شه

:

debugging functions (http://msdn.microsoft.com/en-us/library/ms679303%28VS.85%29.aspx) می تونه استفاده بشه تا یه دیباگر event-driven نوشته بشه ،event-driven یعنی دیباگر زمانی که یه event (http://msdn.microsoft.com/en-us/library/ms679302%28VS.85%29.aspx)اتفاق افتاد مطلع می شه این اطلاع باعث می شه دیباگر برای هر event کار مناسب رو انجام بده از جمله این event می شه به لود کردن یه DLL یه exception اشاره کرد

توابع دیباگ به سه قسمت process, thread و exception-handling تقسیم مش شود:

process:تابع CreateProcess (http://msdn.microsoft.com/en-us/library/ms682425%28VS.85%29.aspx)باعث می شه دیباگر یه پروسس بسازه و شروع به دیباگ ان کنه پارامتر fdwCreate در CreateProcess نوع شروع پروسس در بیان می کنه و اگه این فلگ DEBUG_PROCESS باشه پروسس بعد ایجاد شدن خود پروسس و همهی فرزند هاش رو دیباگ می کنه

تابع OpenProcess (http://msdn.microsoft.com/en-us/library/ms684320%28VS.85%29.aspx)استفاده می شه برای بدست اوردن یه Handle از یه پروسس در حال اجرا و دیباگر می تونه با استفاده از DebugActiveProcess (http://barnamenevis.org/debugactiveprocess.htm) و هندل بدست امده از تابع قبلی خودش رو به پروسس در حال اجرا اتچ کنه ( بچسبونه )

معمولا دیباگر ها تابع OpenProcess (http://msdn.microsoft.com/en-us/library/ms684320%28VS.85%29.aspx)رو با فلگ های PROCESS_VM_READ و PROCESS_VM_WRITE اجرا می کنن که باعث می شه دیباگر با استفاده از توابع ReadProcessMemory (http://msdn.microsoft.com/en-us/library/ms680553%28VS.85%29.aspx) , WriteProcessMemory (http://msdn.microsoft.com/en-us/library/ms681674%28VS.85%29.aspx) بتونه قسمت هایی از حافظه رو بخونه و توش بنویسه دقیقا همون کاری که تو Olly انجام میدیم

Thread : تابع CreateThread (http://msdn.microsoft.com/en-us/library/ms682453%28VS.85%29.aspx) برای پروسس یه thread جدید میسازه دیباگر ها معمولا نیاز دارن تا register های نخ رو مشاهده و تغییر بدن برای اینکا باید یه هندل به ترید داشته باشن برای این کار از تابع DuplicateHandle (http://msdn.microsoft.com/en-us/library/ms724251%28VS.85%29.aspx) استفاده می کنن ( این تابع DuplicateHandle (http://msdn.microsoft.com/en-us/library/ms724251%28VS.85%29.aspx) نکات زیادی داره اگه می تونین Chapter 6 اخرین قسمت از کتاب Windows via C/C++ رو بخونید برای تبدیل هندل غیر واقعی به هندل واقعی ، یه گاه هم به کتاب windows internals صفحهی 149 به بعد بندازید بد نیست )

خوب بعد بدست اوردن handle دیباگر ما با استفاده از GetThreadContext (http://msdn.microsoft.com/en-us/library/ms679362%28VS.85%29.aspx) و SetThreadContext (http://msdn.microsoft.com/en-us/library/ms680632%28VS.85%29.aspx) می تونه رجستر های ترید رو بخونه و تغییر بده این

این توابع یه استراکچر از نوع CONTEXT می ده که شامل رجستر ها هستش مثل :



DWORD Edi;
DWORD Esi;
DWORD Ebx;
DWORD Edx;
DWORD Ecx;
DWORD Eax;


که بعضی خفن ها از این تابع به عنوان یه تکنیک انتی دیباگ استفاده می کنن دیگه نگه debug register

خوب دوتا تابع دیگه هم هست SuspendThread , ResumeThread که نیازی نیست در موردشون توضیح داد
----
ادامه شب :)