Чтение промэппированного файла

Тема в разделе "WASM.BEGINNERS", создана пользователем steelfactor, 11 июл 2007.

  1. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Каким образом можно считать данные (найти последовательность байт) с exeшника, промэппированного в память? Запускать процесс нежелательно.
    Пытаюсь выделить память alloc'om под буфер и скопировать в него нужную часть файла (секцию .text) memcpy для дальнейшей работы, но чёт не работает...
    В буфер пишется мусор или вообщем ничего не пишется
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    код?
     
  3. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    зачем дополнительно выделять/копировать память под файл, если файл уже спроецирован в память?
    просто сканируй память на наличие нужных байт и всё.
     
  4. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Возможно, имелось ввиду (магический шар треснул, поэтому могу ошибаться), что была вызвана только CreateFileMapping без MapViewOfFile. И как результат - мусор. Иначе, дополнительный буфер действительно не нужен. Еще, как вариант (определил по звездам), были спутаны физ. и вирт. смещения. 3-й вариант (гадал на кофейной гуще): файл закриптован, оттого и мусор.
     
  5. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Код (Text):
    1.    PBYTE mapping;
    2.    char *file = "file.exe";
    3.    HANDLE pFile, pMap;
    4.    
    5.    pFile = CreateFile(file, GENERIC_WRITE|GENERIC_READ, 0, 0,  OPEN_EXISTING, 0, 0);
    6.    pMap = CreateFileMapping(pFile, 0, PAGE_READWRITE, 0, GetFileSize(pFile, 0), 0);
    7.    mapping = (PBYTE)MapViewOfFile(pMap, FILE_MAP_READ|FILE_MAP_WRITE, 0, 0, GetFileSize(pFile, 0));
    8.    
    9.    PIMAGE_DOS_HEADER dos = (PIMAGE_DOS_HEADER)mapping;
    10.    PIMAGE_NT_HEADERS nt = (PIMAGE_NT_HEADERS)(mapping + dos->e_lfanew);
    11.    PIMAGE_SECTION_HEADER section = (PIMAGE_SECTION_HEADER)((DWORD)nt + sizeof(IMAGE_NT_HEADERS));
    12.    
    13.    PBYTE massiv = (PBYTE)malloc(section->SizeOfRawData);
    14.    memcpy(&massiv, &dos + section->PointerToRawData, section->SizeOfRawData);
    Ногами только сильно не пинайте...
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    memcpy(massiv, mapping + section->PointerToRawData, section->SizeOfRawData);
     
  7. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    [deleted]
    сорри, глючу
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    коряво, правильно:
    memcpy(massiv, (PBYTE)dos + section->PointerToRawData, section->SizeOfRawData);
     
  9. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Спасибо всем, разобрался... :))
    кстати, обратил внимание, что компилятор Dev-Cpp данный код несколько раз сдампил часть файла "MZ + section->SizeOfRawData", т.е. не саму секцию .text а на то, что лежало от MZ + section->SizeOfRawData, т.е. 0x200 байт от начала файла.
    Шайтан, однако...
    Затем все заработало так, как требовалось