ماژولی برای آنالیز ایستای فایل های اجرایی
PeFile
یک ماژول بسیار مفید به زبان پایتون برای آنالیز static فایل اجرایی یا همون PE , که باهاش میشه به هدر ها و عناصر دیگه مثل جدول ورودی و ... دسترسی داشت.
برای کار با این ماژول و ابزارهایی که برای آنالیز ایستاتیک فایل های اجرایی تهیه شده اند, نیاز به آشنایی حدالامکان نسبی با ساختار این فایلها هستش.
میتونید توی همین وبلاگ مقاله آشنایی با فایل های اجرایی رو پیدا کنید.
این ماژول رو می تونید از اینجا دانلود کنید
چند مثال:
ماژول pefile دارای چندین کلاس هستش که میشه گفت پرکاربردترینش کلاس PE هستش که میشه اطلاعات زیادی رو از فایل اجرایی بدست آورد. در زیر چند نمونه از استفاده هاشو توضیح میدم.
1-برای لود کردن یک فایل اجرایی,کافیه از کلاس PE مثل زیر استفاده کنید:
pe = pefile.PE('module.dll')
pe = pefile.PE(name='module.dll')
همچنین می تونید از داده ها در بافر نیز استفاده کنید:
2-بررسی هدر ها
>>> pe = pefile.PE('C:\\notepad.exe')
>>> hex(pe.OPTIONAL_HEADER.ImageBase)
['0x1000000L']
>>> hex(pe.OPTIONAL_HEADER.AddressOfEntryPoint)
['0x6AE0L']
>>> hex(pe.OPTIONAL_HEADER.NumberOfRvaAndSizes )
['0x10L']
>>> hex(pe.FILE_HEADER.NumberOfSections)
['0x3']
3- بررسی سکشن ها:
... print (section.Name,
hex(section.VirtualAddress),
hex(section.Misc_VirtualSize),
section.SizeOfRawData )
...
('.text', '0x1000L', '0x6D72L', 28160L)
('.data', '0x8000L', '0x1BA8L', 1536L)
('.rsrc', '0xA000L', '0x8948L', 35328L)
4- بررسی توابع ورودی :
... print entry.dll
... for imp in entry.imports:
... print '\t', hex(imp.address), imp.name
...
comdlg32.dll
0x10012A0L PageSetupDlgW
0x10012A4L FindTextW
0x10012A8L PrintDlgExW
[snip]
SHELL32.dll
0x1001154L DragFinish
0x1001158L DragQueryFileW
یا یه مثال دیگه:
print hex(pe.OPTIONAL_HEADER.ImageBase + exp.address), exp.name, exp.ordinal
0x7ca0ab4f SHUpdateRecycleBinIcon 336
0x7cab44c0 SHValidateUNC 173
0x7ca7b0aa SheChangeDirA 337
0x7ca7b665 SheChangeDirExA 338
0x7ca7b3e1 SheChangeDirExW 339
0x7ca7aec6 SheChangeDirW 340
0x7ca8baae SheConvertPathW 341
میتونید کل اطلاعات فایل رو با یکی از 2 متد زیر بدست بیارید:
کلاس PE تعداد زیادی متد داره که میشه باهاش اطلاعات مختلفی رو بدست آورد مثلا بدست آوردن Checksum فایل:
95152L
یا بدست آوردن اطلاعات جزئی از RVA یا آفست و ...
ماشااله اونقد متد داره که نمیشه دونه دونه توضیح داد.ولی کلا کار با pefile آسونه کافیه یه نگاه به سورس کدش بندازید.
به غیر از کلاس PE کلاس های دیگه ای هم هستند که فک نکنم نیاز به توضیح داشته باشند چونکه زیاد به کار نمیان و بیشترشون توسط خود کلاس PE استفاده شدن.