Доступ к памяти

Discussion in 'WASM.WIN32' started by IDIV, Mar 25, 2007.

  1. IDIV

    IDIV New Member

    Blog Posts:
    0
    Joined:
    Feb 15, 2007
    Messages:
    7
    Упражняюсь в манипуляциях с PE файлами, и возникает такая проблема:
    внедряю свой код в последнюю секцию, расштряю ее, все дела, запускаю файл и получается, что некоторые работают, а некоторые нет. Выяснил, что не работают, те, у которых на том участке памяти куда внедрем код стоит аттребут NO ACESS. Можно ли как нибудь сделать так, чтобы память в этом регионе стала readeble, желательно статично, тоесть оформить это в экзешнике, а не динамически?
     
  2. wasm_test

    wasm_test wasm test user

    Blog Posts:
    0
    Joined:
    Nov 24, 2006
    Messages:
    5,582
    атрибуты секции смотри.
     
  3. IDIV

    IDIV New Member

    Blog Posts:
    0
    Joined:
    Feb 15, 2007
    Messages:
    7
    В атрибутах стоит read write execute.
     
  4. wasm_test

    wasm_test wasm test user

    Blog Posts:
    0
    Joined:
    Nov 24, 2006
    Messages:
    5,582
    а фигли тогда стоит PAGE_NOACCESS ?
     
  5. IDIV

    IDIV New Member

    Blog Posts:
    0
    Joined:
    Feb 15, 2007
    Messages:
    7
    NO_ACESS стоит на уже загруженном образе.
     
  6. asd

    asd New Member

    Blog Posts:
    0
    Joined:
    Mar 12, 2005
    Messages:
    952
    Location:
    Russia
    IDIV
    Атрибуты для страниц берутся из атрибутов секций. Ищи баг при добавлении. Покажи код.
     
  7. IDIV

    IDIV New Member

    Blog Posts:
    0
    Joined:
    Feb 15, 2007
    Messages:
    7
    Code (Text):
    1. void SetAllSectionsWriteble(char* fname,IMAGE_DOS_HEADER* idh,IMAGE_NT_HEADERS* inh)
    2. {
    3.     HANDLE hf;
    4.     OFSTRUCT of;
    5.     DWORD wr;
    6.     DWORD ic=0;
    7.     IMAGE_SECTION_HEADER ish;
    8.     hf=(HANDLE)OpenFile(fname,&of,OF_READWRITE);
    9.     while(ic<inh->FileHeader.NumberOfSections)
    10.     {
    11.         SetFilePointer(hf,idh->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*ic,NULL,FILE_BEGIN);
    12.         ReadFile(hf,&ish,sizeof(IMAGE_SECTION_HEADER),&wr,NULL);
    13.         //MessageBox(NULL,ish.Name,"Sec",0);
    14.         ish.Characteristics=0xA0000020;
    15.         SetFilePointer(hf,idh->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*ic,NULL,FILE_BEGIN);
    16.         WriteFile(hf,&ish,sizeof(IMAGE_SECTION_HEADER),&wr,NULL);
    17.         ic++;
    18.     }
    19.     CloseHandle(hf);
    20. }
    [​IMG]
    Вот скрин того, что дает PeTools.
    Запарывается он именно на адресе 429000, тоесть точно начиная с того адреса куда был добавлен код.
     
  8. IDIV

    IDIV New Member

    Blog Posts:
    0
    Joined:
    Feb 15, 2007
    Messages:
    7
    Вот опятным путём выяснил, что если увеличивать VirtualSize секции не на размер кода кооторый внедрил, а в несколько раз больше, то работает.
     
  9. asd

    asd New Member

    Blog Posts:
    0
    Joined:
    Mar 12, 2005
    Messages:
    952
    Location:
    Russia
    VirtualOffset(27000)+VirtualSize(1eae)+ImageBase(400000) = 429000. Нужно увеличивать VirtualSize. Странно то, что этот кусок вообще мапится(а маппится ли?)

    Уже понял да:) В данном конкретном файле размер на диске > размера в памяти. В таких случаях надо брать размер на диске и писать его в VirtualSize
     
  10. IDIV

    IDIV New Member

    Blog Posts:
    0
    Joined:
    Feb 15, 2007
    Messages:
    7
    А можно поподробней? Размер на диске чего?
     
  11. asd

    asd New Member

    Blog Posts:
    0
    Joined:
    Mar 12, 2005
    Messages:
    952
    Location:
    Russia
    Поле RawSize - размер секции на диске. Если он > чем VirtualSize - значит в память будет отображена только часть секции. Подробнее - кури пе-формат.

    з.ы. Снимать атрибут чтения с секции чревато.
     
  12. Freeman

    Freeman New Member

    Blog Posts:
    0
    Joined:
    Feb 10, 2005
    Messages:
    1,385
    Location:
    Ukraine
    Еще не забудь увеличить тогда и ImageSize
     
  13. Cr4sh

    Cr4sh New Member

    Blog Posts:
    0
    Joined:
    Apr 17, 2006
    Messages:
    668
    >> Еще не забудь увеличить тогда и ImageSize
    угу, он должен быть равен VirtualAddress + VirtualSize последней секции
     
  14. IDIV

    IDIV New Member

    Blog Posts:
    0
    Joined:
    Feb 15, 2007
    Messages:
    7
    Спасибо всем, вроде разобрался.