PE Editor v1.2
Àâòîð: Ìàêñèì Êèñåë¸â a.k.a NEOx (NEOx@Pisem.net)
PE Editor - ýòî ðåäàêòîð èñïîëíÿåìûõ PE (Portable Executables) ôàéëîâ. Ðåäàêòîð îáðàáàòûâàåò íå âåñü ôîðìàò, à òîëüêî çàãîëîâîê PE ôàéëà (PE Header), è òàáëèöó îáúåêòîâ (ñåêöèé) ôàéëà (Object Table). Ñëåäóþùèå âåðñèè ðåäàêòîðà áóäóò îáðàáàòûâàòü òàáëèöû èìïîðòà/ýêñïîðòà, ðåñóðñû è äð.
PE Header èìååò ñëåäóþùóþ ñòðóêòóðó,
typedef
struct
{
DWORD SignatureBytes;
WORD CPUType;
WORD NumOfSections;
DWORD TimeDateStamp;
DWORD PointerToCOFF;
DWORD COFFTableSize;
WORD NTHeaderSize;
WORD Flags;
WORD Magic;
BYTE LinkMajor;
BYTE LinkMinor;
DWORD SizeOfCode;
DWORD SizeOfInitData;
DWORD SizeOfUnInitData;
DWORD EntryPointRVA;
DWORD BaseOfCode;
DWORD BaseOfData;
DWORD ImageBase;
DWORD ObjectAlign;
DWORD FileAlign;
WORD OSMajor;
WORD OSMinor;
WORD USERMajor;
WORD USERMinor;
WORD SubSysMajor;
WORD SubSysMinor;
DWORD Reserved;
DWORD ImageSize;
DWORD HeaderSize;
DWORD FileChecksum;
WORD SubSystem;
WORD DLLFlags;
DWORD StackReserveSize;
DWORD StackCommitSize;
DWORD HeapReserveSize;
DWORD HeapCommitSize;
DWORD LoaderFlags;
DWORD NumOfRVAandSizes;
DWORD ExportTableRVA;
DWORD ExportDataSize;
DWORD ImportTableRVA;
DWORD ImportDataSize;
DWORD ResourceTableRVA;
DWORD ResourceDataSize;
DWORD ExceptionTableRVA;
DWORD ExceptionDataSize;
DWORD SecurityTableRVA;
DWORD SecurityDataSize;
DWORD FixUpTableRVA;
DWORD FixUpDataSize;
DWORD DebugTableRVA;
DWORD DebugDataSize;
DWORD ImageDescriptionRVA;
DWORD DescriptionDataSize;
DWORD MachineSpecificRVA;
DWORD MachnineDataSize;
DWORD TLSRVA;
DWORD TLSDataSize;
DWORD LoadConfigRVA;
DWORD LoadConfigDataSize;
BYTE Reserved01[8];
DWORD IATRVA;
DWORD IATDataSize;
BYTE Reserved02[8];
BYTE Reserved03[8];
BYTE Reserved04[8];
} PEHeader;
Object Table èìååò
ñëåäóþùóþ ñòðóêòóðó,
typedef
struct
{
BYTE ObjectName[8];
DWORD VirtualSize;
DWORD SectionRVA;
DWORD PhysicalSize;
DWORD PhysicalOffset;
BYTE Reserved[10];
DWORD ObjectFlags;
} ObjectEntry;
PE Editor ñîäåðæèò êëàññ CPEFile (PEFile.cpp, PEFile.h) îí íåìíîãî íå óäîáåí â èñïîëüçîâàíèè, íî âñ¸ æå îí ðàáîòàåò.
Ìåòîä BOOL CPEFile::Open(LPCTSTR szPEFile), îòêðûâàåò PE ôàéë äëÿ ÷òåíèÿ è çàïèñè, ñëåäîâàòåëüíî VOID CPEFile::Close(VOID) çàêðûâàåò ôàéë.
Ìåòîä UINT
CPEFile::ReadPEHeader(VOID),
÷èòàåò PE Header.
 ìåòîäå ReadPEHeader ñîäåðæèòñÿ âûçîâ åù¸ îäíîãî ìåòîäà, LONG
CPEFile::SeekToPEHeader(VOID),
êîòîðûé óñòàíàâëèâàåò óêàçàòåëü â ôàéëå íà PE Header è âîçâðàùàåò ïîçèöèþ PE Header-à.
Ìåòîä BOOL CPEFile::IsPEFile(VOID),
ïðîâåðÿåò íà íàëè÷èå PE ñèãíàòóðû â ôàéëå.
Ìåòîä LONG CPEFile::SeekToObjectEntry(VOID), óñòàíàâëèâàåò óêàçàòåëü â
ôàéëå íà ïåðâóþ ñåêöèþ â ôàéëå.
Âíèìàíèå! Èñïîëüçóéòå SeekToObjectEntry òîëüêî 1 ðàç ïðè ÷òåíèè/çàïèñè ñåêöèé.
Ïðèìåð
èñïîëüçîâàíèÿ êëàññà CPEFile
CPEFile m_PEFile;
m_PEFile.Open(“C:\\Test.exe”); //Îòêðûâàåì ôàéë
m_PEFile.ReadPEHeader(); //×èòàåì PE Header, è çàïîëíÿåì ñòðóêòóðó PEHeader äàííûìè
m_PEFile.Close(); //Çàêðûâàåì ôàéë
PE Editor áûë íàïèñàí è ïðîòåñòèðîâàí â Microsoft Visual C++ 6.0 Service Pack 6.4. Âîçìîæíî îíè áóäóò ðàáîòàòü è â ïðåäûäóùèõ âåðñèÿõ MSVC++ è MFC.
Ëèöåíçèÿ
Ïðîãðàììà ðàñïðîñòðàíÿåòñÿ ñâîáîäíî, áåç îãðàíè÷åíèÿ ïðàâà
êîïèðîâàíèÿ.
Ìîè êîîðäèíàòû
Åñëè ó âàñ åñòü êàêèå-íèáóäü êîíñòðóêòèâíûå ïðåäëîæåíèÿ, ìîæåòå ïèñàòü
ìíå ïî àäðåñó: NEOx@Pisem.net.
Íà ìîåé ñòðàíè÷êå http://www.KS-Soft.boom.ru âû ìîæåòå íàéòè íîâûå âåðñèè PE Editor-à. Íî îíà ïîêà â ðàçðàáîòêå.