pe نوعی فایل میباشد که استاندارد فایل های اجرایی ویندوز از جمله exe و dll و sys و .... میباشد . در این پست ما قصد داریم تا هدر و دیتا های خام این فایل را تا حدودی بررسی نماییم.
در این عکس هدر فایل pe را مشاهده میکنیم .
pe نوعی فایل میباشد که استاندارد فایل های اجرایی ویندوز از جمله exe و dll و sys و .... میباشد . در این پست ما قصد داریم تا هدر و دیتا های خام این فایل را تا حدودی بررسی نماییم.
در این عکس هدر فایل pe را مشاهده میکنیم .
از این به بعد بشتر تمرکز پستهام رو روی کرنل و درایور نویسی و ساختار درون اون میگذارم .
تصمیم داشتم بیشتر درمورد ساختار درون کرنل ویندوز توضیح بدم اما دیدم بیشتر موجب سردرگمی میشه برای همین تصمیم گرفتم با ارائه مثال ، در وقت مناسب ساختار هارو بیشتر توضیح بدم .
اولین پست ررو با یک مثال خیلی خیلی ساده توضیح میدم که خواننده ها بیشتر با روش کامپایل و اجرا و دیدن خروجی درایور آشنا بشن .
typedef struct _DRIVER_OBJECT { PDEVICE_OBJECT DeviceObject; PDRIVER_EXTENSION DriverExtension; PUNICODE_STRING HardwareDatabase; PFAST_IO_DISPATCH FastIoDispatch; PDRIVER_INITIALIZE DriverInit; PDRIVER_STARTIO DriverStartIo; PDRIVER_UNLOAD DriverUnload; PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION+1]; } DRIVER_OBJECT, *PDRIVER_OBJECT;
NTSTATUS WINAPI NtQuerySystemInformation( _In_ SYSTEM_INFORMATION_CLASS SystemInformationClass, _Inout_ PVOID SystemInformation, _In_ ULONG SystemInformationLength, _Out_opt_ PULONG ReturnLength );
سرویس برنامه ای است که که فاقد گرافیک و واسط کاربری میباشد و برنامه ای است که میتواند بصورت لحظه ای یا دائمی ، از قبل از ورود کابر به ویندوز یا در هر لحظه ای فعال و اجرا گردد.
برای شروع چند ساختمان مورد استفاده در آن را بر رسی میکنیم .
ساختمان SERVICE_TABLE_ENTRY:
برای راه اندازی سرویس ، مایکروسافت یک ساختمان دادی ای تشکیل داده که باید آن را پر کنیم الگوی آن به صورت زیر است
typedef struct _SERVICE_TABLE_ENTRY { LPTSTR lpServiceName; LPSERVICE_MAIN_FUNCTION lpServiceProc; } SERVICE_TABLE_ENTRY, *LPSERVICE_TABLE_ENTRY;
داده اول یک استرینگ است که شامل نام سرویس میباشد ، داده دوم نیز باید با تابعی مقدار دهی شود که تابع اصلی سرویس میباشد(در مثال ارائه شده با آن بیشتر آشنا میشویم.
در قسمت های قبل در مورد پایپ و به اشتراک گذاری حافظه در پراسس ها به اندازه کافی صحبت شد . اما در اون روش ما یک کپی از دیتا رو در اختیار پراسس های دیگر قرار میدادیم .
در این قسمت تصمیم داریم تا از روش دیگری استفاده کنیم ، در این روش ما یک آدرس از دیتای مورد نظر خودمون رو بین دو یا چند پراسس به اشتراک میگذاریم(بدون کپی کردن). بدلیل این که کپیی از آنها تهیه نمیکنیم سرعت انتقال بسیار بیشتر از استفاده از پایپ میبشد . اما باید این نکته را نیز در نظر داشت در انتقال حجم های کم این روش میتواند باعث افزایش بی دلیل داده گردد ، دلیل آن هم این است که چون مثلا پیج های حافظه ( اغلب ) به اندازه 4 کیلوبایت میباشد ،اگر ما داده ای را که به اندازه 3 کیلو بایت است را بین پروسس ها شیر کنیم ، مقدار 4 کیلوبایت شیر میگردد (چون هر پیج دارای 4 کیلوبایت است ) ، و بنابر این یک کیلوبایت اضافه شیر میگردد .
HANDLE WINAPI CreateFileMapping( _In_ HANDLE hFile, _In_opt_ LPSECURITY_ATTRIBUTES lpAttributes, _In_ DWORD flProtect, _In_ DWORD dwMaximumSizeHigh, _In_ DWORD dwMaximumSizeLow, _In_opt_ LPCTSTR lpName );
LPVOID WINAPI MapViewOfFile( _In_ HANDLE hFileMappingObject, _In_ DWORD dwDesiredAccess, _In_ DWORD dwFileOffsetHigh, _In_ DWORD dwFileOffsetLow, _In_ SIZE_T dwNumberOfBytesToMap );
void CopyMemory( _In_ PVOID Destination, _In_ const VOID *Source, _In_ SIZE_T Length );
این برنامه در حالت کلی به دو بخش تقسیم میشه که قسمت اول در پشت صحنه بصورت یک سرویس همیشه در حال اجراست و به عنوان یه ناظر بصورت دائم پراسس های اجرا شده در سیستم را ذخیره میکند و زمانی که برنامه کاربر اجرا میگردد این اطلاعات را در اختیار برنامه کاربر قرار میدهد تا قابل مشاهده باشد .
نکته مهم اینکه این برنامه تنها در ویندوز 7 . 8 . 10 64 bit قابل اجرا میباشد .
(خوشحال میشم نظراتتون رو درمورد برنامه اعلام کنید چه نقاط قوت و چه ضعف )
در این پست توضیحات مختصری درمورد سه API ویندوز میدهیم و برای هر یک مثالی میزنیم .
BOOL WINAPI SetProcessAffinityMask( HANDLE hProcess, DWORD_PTR dwProcessAffinityMask );
DWORD_PTR WINAPI SetThreadAffinityMask( HANDLE hThread, DWORD_PTR dwThreadAffinityMask );
void WINAPI GetSystemInfo(
LPSYSTEM_INFO lpSystemInfo
);