Почему нельзя на куче работать с образом PE файла?

Тема в разделе "WASM.BEGINNERS", создана пользователем _nic, 3 мар 2012.

  1. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Код (Text):
    1. int _tmain(int argc, _TCHAR* argv[])
    2. {
    3.     HANDLE f=CreateFile(patch,GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
    4.     HANDLE map=CreateFileMapping(f,NULL,PAGE_READWRITE | SEC_IMAGE,0,0,NULL);
    5.     DWORD simpAdr=(DWORD)MapViewOfFile(map,FILE_MAP_ALL_ACCESS,0,0,0);
    6.     IMAGE_NT_HEADERS *image=(IMAGE_NT_HEADERS *)(simpAdr+ ((IMAGE_DOS_HEADER*)simpAdr)->e_lfanew);
    7.     char *buf=(char*)malloc(image->OptionalHeader.SizeOfImage);
    8.     memcpy(buf,(void*)simpAdr,image->OptionalHeader.SizeOfImage);
    9.     IMAGE_IMPORT_DESCRIPTOR *iid;
    10.     iid=(IMAGE_IMPORT_DESCRIPTOR *)(simpAdr+image->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
    11.     printf("%s\n",(char*)(simpAdr+iid->Name));
    12.     UnmapViewOfFile((void*)simpAdr);
    13.     DWORD testAdr=(DWORD)buf;
    14.     printf("%s\n",(char*)testAdr);
    15.     printf("%s\n",(char*)(testAdr+iid->Name));//вот тут ошибка чтения
    16.     free(buf);
    17.     CloseHandle(map);
    18.     CloseHandle(f);
    19.     getch();
    20.     return 0;
    21. }
    От чего так происходит?Какая то фишка с дефрагментацией памяти?Или не что другое?
     
  2. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    И что это было, декстрометорфан или не ?
     
  3. SConstruct

    SConstruct New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2012
    Сообщения:
    5
    у вас ошибка в коде, вот вы получили указатель iid отнносительно simpAddr
    Код (Text):
    1.     iid=(IMAGE_IMPORT_DESCRIPTOR *)(simpAdr+image->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
    далее вы делаете
    Код (Text):
    1. UnmapViewOfFile((void*)simpAdr);
    и читаете iid->Name
    Код (Text):
    1. printf("%s\n",(char*)(testAdr+iid->Name));//вот тут ошибка чтения
    конечно не будет работать.
     
  4. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Точно проглядел(