بررسی و تشریح Image file checksum
بررسی و تشریح Image file checksum
بخش برنامه نویسی
نویسنده :
یاشار محمودنیا
در ساختار فایل های PE متغیری در بخش های IMAGE_OPTIONAL_HEADER32 و IMAGE_OPTIONAL_HEADER64 بنام CheckSum وجود دارد که وظیفه اعتبار سنجی درایور ها (sys.)، DLL های لود شده در زمان راه اندازی سیستم (Boot Time) و DLL های لود شده در پروسس های حیاتی سیستم را در زمان اجرا دارد.
وظیفه مقدار دهی صحیح Checksum به عهده لینکر می باشد که این مقدار از نوع DWORD و در زمان Link شدن فایل محاسبه و نوشته می شود.
حالا سئوال اینجاست که آیا می توان از این قابلیت برای پیاده سازی File Integrity Check استفاده کرد ؟
پاسخ مثبت است اما باید قبل از آن به نقاط قوت و ضعف این روش جهت پیاده سازی File Integrity Check دقت کنید.
- پیاده سازی آسان
- امنیت پایین
- محدودیت در استفاده از پکر ها و پروتکتور ها
برای به دست آوردن مقدار Checksum از Header و مقداری که محاسبه مجدد می شود، از فانکشن ()MapFileAndCheckSumA استفاده می کنیم.
DWORD IMAGEAPI MapFileAndCheckSumA(
[in] PCSTR Filename,
[out] PDWORD HeaderSum,
[out] PDWORD CheckSum
);
پارامتر اول : ورودی فایل از نوع PCSTR (مسیر به همراه اسم فایل) است.
پارامتر دوم : خروجی از نوع PDWORD جهت ذخیره مقدار Checksum که از Header فایل به دست آمده است.
پارامتر سوم : خروجی از نوع PDWORD برای ذخیره مقدار Checksum که مجدد محاسبه شده است.
پیاده سازی یک متد ساده از File integrity check در محیط ویژوال استادیو و زبان برنامه نویسی ++C
#include
#include
#include
#pragma comment(lib,"ImageHlp.lib")
void main()
{
char szFileName[] = "";
DWORD dwHeaderChecksum, dwCalculatedChecksum;
if (MapFileAndCheckSumA(szFileName, &dwHeaderChecksum, &dwCalculatedChecksum) == CHECKSUM_SUCCESS)
{
printf("Header checksum %0x \n", dwHeaderChecksum);
printf("Calculated checksum %0x \n", dwCalculatedChecksum);
}
system("PAUSE");
}