Вот разбираюсь с форматом PE файла. Хочу проверить, действительно ли файл является PE. Написал программу: Код (Text): #include <iostream> #include <fstream> #include <windows.h> int main( int argc, char *argv[] ) { PIMAGE_DOS_HEADER pDOSHeader; PIMAGE_NT_HEADERS pNTHeader; char *fileBuffer; size_t fileSize = 0; std::fstream inFile( "C:\\WINDOWS\\notepad.exe", std::ios::in | std::ios::binary ); if( !inFile ) { std::cerr << "Cannot Open File...\n"; return 1; } inFile.seekg( 0, std::ios::end ); fileSize = inFile.tellg(); inFile.seekg( 0, std::ios::beg ); fileBuffer = new char[ fileSize + 1 ]; char symbol; for( int i = 0; !inFile.eof(); i++ ) { inFile >> symbol; fileBuffer[ i ] = symbol; } pDOSHeader = (PIMAGE_DOS_HEADER)fileBuffer; if( pDOSHeader->e_magic == IMAGE_DOS_SIGNATURE ) { std::cout << "It's a DOS signature\n"; std::cout << "Offset:" << pDOSHeader->e_lfanew << std::endl; } char *tempPtr =( fileBuffer + pDOSHeader->e_lfanew ); pNTHeader = (PIMAGE_NT_HEADERS)fileBuffer; std::cout << pNTHeader->Signature << " : " << IMAGE_DOS_SIGNATURE; return 0; } Но не могу понять, почему у меня в Signature абсолютно непонятное значение.
bug1z А переменнная tempPtr для чего? Код (Text): char *tempPtr =( fileBuffer + pDOSHeader->e_lfanew ); // pNTHeader = (PIMAGE_NT_HEADERS)fileBuffer; // error pNTHeader = (PIMAGE_NT_HEADERS)tempPtr;
Да, это во время редактирования так вышло. Исправил. Код (Text): #include <iostream> #include <fstream> #include <windows.h> int main( int argc, char *argv[] ) { PIMAGE_DOS_HEADER pDOSHeader; PIMAGE_NT_HEADERS pNTHeader; char *fileBuffer; size_t fileSize = 0; std::fstream inFile( "C:\\WINDOWS\\notepad.exe", std::ios::in | std::ios::binary ); if( !inFile ) { std::cerr << "Cannot Open File...\n"; return 1; } inFile.seekg( 0, std::ios::end ); fileSize = inFile.tellg(); inFile.seekg( 0, std::ios::beg ); fileBuffer = new char[ fileSize + 1 ]; char symbol; for( int i = 0; !inFile.eof(); i++ ) { inFile >> symbol; fileBuffer[ i ] = symbol; } pDOSHeader = (PIMAGE_DOS_HEADER)fileBuffer; if( pDOSHeader->e_magic == IMAGE_DOS_SIGNATURE ) { std::cout << "It's a DOS signature\n"; std::cout << "Offset:" << pDOSHeader->e_lfanew << std::endl; } char *tempPtr =( fileBuffer + pDOSHeader->e_lfanew ); pNTHeader = (PIMAGE_NT_HEADERS)tempPtr; std::cout << pNTHeader->Signature << " : " << IMAGE_DOS_SIGNATURE; return 0; } Но все равно pNTHeader->Signature иIMAGE_DOS_SIGNATURE отличаются.
Кто же читает файлы побайтно... Можно так: Код (Text): ifstream PEStream; ... PEStream.open(....); ... FileBuffPtr = new BYTE [PEFileLength]; PEStream.read(FileBuffPtr, PEFileLength); Выучи азы C++ сначала и смени ник.
Во первых - std::cout << pNTHeader->Signature << " : " << IMAGE_NT_SIGNATURE; Во вторых использовать форматный вывод это бяка, так как он не выводит пробелы. Из-за этого буфер тупо неверно считывается.