Проблема с определением PE файла.

Тема в разделе "WASM.BEGINNERS", создана пользователем bug1z, 8 фев 2011.

  1. bug1z

    bug1z New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2008
    Сообщения:
    228
    Вот разбираюсь с форматом PE файла. Хочу проверить, действительно ли файл является PE.
    Написал программу:

    Код (Text):
    1. #include <iostream>
    2. #include <fstream>
    3. #include <windows.h>
    4.  
    5. int main( int argc, char *argv[] )
    6. {
    7.     PIMAGE_DOS_HEADER pDOSHeader;
    8.     PIMAGE_NT_HEADERS pNTHeader;
    9.     char *fileBuffer;
    10.     size_t fileSize = 0;
    11.  
    12.     std::fstream inFile( "C:\\WINDOWS\\notepad.exe", std::ios::in | std::ios::binary );
    13.  
    14.     if( !inFile )
    15.     {
    16.         std::cerr << "Cannot Open File...\n";
    17.         return 1;
    18.     }
    19.  
    20.     inFile.seekg( 0, std::ios::end );
    21.     fileSize = inFile.tellg();
    22.     inFile.seekg( 0, std::ios::beg );
    23.  
    24.     fileBuffer = new char[ fileSize + 1 ];
    25.     char symbol;
    26.  
    27.     for( int i = 0; !inFile.eof(); i++ )
    28.     {
    29.         inFile >> symbol;
    30.         fileBuffer[ i ] = symbol;
    31.     }
    32.  
    33.     pDOSHeader = (PIMAGE_DOS_HEADER)fileBuffer;
    34.  
    35.     if( pDOSHeader->e_magic == IMAGE_DOS_SIGNATURE )
    36.     {
    37.         std::cout << "It's a DOS signature\n";
    38.         std::cout << "Offset:" << pDOSHeader->e_lfanew << std::endl;
    39.     }
    40.  
    41.     char *tempPtr =( fileBuffer + pDOSHeader->e_lfanew );
    42.  
    43.     pNTHeader = (PIMAGE_NT_HEADERS)fileBuffer;
    44.  
    45.     std::cout << pNTHeader->Signature << " : " << IMAGE_DOS_SIGNATURE;
    46.  
    47.     return 0;
    48. }
    Но не могу понять, почему у меня в Signature абсолютно непонятное значение.
     
  2. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    bug1z
    А переменнная tempPtr для чего?

    Код (Text):
    1.     char *tempPtr =( fileBuffer + pDOSHeader->e_lfanew );
    2.  
    3. //  pNTHeader = (PIMAGE_NT_HEADERS)fileBuffer; // error
    4.     pNTHeader = (PIMAGE_NT_HEADERS)tempPtr;
     
  3. bug1z

    bug1z New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2008
    Сообщения:
    228
    Да, это во время редактирования так вышло. Исправил.

    Код (Text):
    1. #include <iostream>
    2. #include <fstream>
    3. #include <windows.h>
    4.  
    5. int main( int argc, char *argv[] )
    6. {
    7.     PIMAGE_DOS_HEADER pDOSHeader;
    8.     PIMAGE_NT_HEADERS pNTHeader;
    9.     char *fileBuffer;
    10.     size_t fileSize = 0;
    11.  
    12.     std::fstream inFile( "C:\\WINDOWS\\notepad.exe", std::ios::in | std::ios::binary );
    13.  
    14.     if( !inFile )
    15.     {
    16.         std::cerr << "Cannot Open File...\n";
    17.         return 1;
    18.     }
    19.  
    20.     inFile.seekg( 0, std::ios::end );
    21.     fileSize = inFile.tellg();
    22.     inFile.seekg( 0, std::ios::beg );
    23.  
    24.     fileBuffer = new char[ fileSize + 1 ];
    25.     char symbol;
    26.  
    27.     for( int i = 0; !inFile.eof(); i++ )
    28.     {
    29.         inFile >> symbol;
    30.         fileBuffer[ i ] = symbol;
    31.     }
    32.  
    33.     pDOSHeader = (PIMAGE_DOS_HEADER)fileBuffer;
    34.  
    35.     if( pDOSHeader->e_magic == IMAGE_DOS_SIGNATURE )
    36.     {
    37.         std::cout << "It's a DOS signature\n";
    38.         std::cout << "Offset:" << pDOSHeader->e_lfanew << std::endl;
    39.     }
    40.  
    41.     char *tempPtr =( fileBuffer + pDOSHeader->e_lfanew );
    42.  
    43.     pNTHeader = (PIMAGE_NT_HEADERS)tempPtr;
    44.  
    45.     std::cout << pNTHeader->Signature << " : " << IMAGE_DOS_SIGNATURE;
    46.  
    47.     return 0;
    48. }
    Но все равно pNTHeader->Signature иIMAGE_DOS_SIGNATURE отличаются.
     
  4. kernel16

    kernel16 Human Vl

    Публикаций:
    0
    Регистрация:
    29 окт 2010
    Сообщения:
    316
    Переписал бы на асм, я бы посмотрел. си++ не понимаю
     
  5. letopisec

    letopisec New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2004
    Сообщения:
    228
    bug1z

    Юзай
    inFile.read(fileBuffer,fileSize);
    вместо оператора
    >>
     
  6. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Кто же читает файлы побайтно...
    Можно так:
    Код (Text):
    1. ifstream PEStream;
    2. ...
    3. PEStream.open(....);
    4. ...
    5. FileBuffPtr = new BYTE [PEFileLength];
    6. PEStream.read(FileBuffPtr, PEFileLength);
    Выучи азы C++ сначала и смени ник.
     
  7. kernel16

    kernel16 Human Vl

    Публикаций:
    0
    Регистрация:
    29 окт 2010
    Сообщения:
    316
    NoName
    Си потом, когда надо будет. Ник менять - не. он мне нравится
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Во первых - std::cout << pNTHeader->Signature << " : " << IMAGE_NT_SIGNATURE;
    Во вторых использовать форматный вывод это бяка, так как он не выводит пробелы. Из-за этого буфер тупо неверно считывается.
     
  9. bug1z

    bug1z New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2008
    Сообщения:
    228
    Благодарю, проблема действительно была в форматном выводе.