Редактирование PE файла.Вопросы.

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

  1. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    да ему про это уже написали :) Только он не поймет, в какую сторону и как менять эти рва
     
  2. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    В PE формате столько всего.Аж крыша едет.Спасибо за полезную инфу теперь я знаю как получать указатель на нужные секции.Только это настолько запутанный формат что он сбил меня с ума разума.Вообщем нахожу секцию ресурсов,выделяю под неё память копирую туда а VS матерится что указатель на блок памяти не валиден :dntknw: Я уж совсем в потеряшках,секция то находится ипамять под неё выделяется,и копирую её туда.Но что то не то :dntknw:
    Код (Text):
    1. bool PatchReses(char *source,char *target)
    2. {
    3.     HANDLE src=CreateFileA(source,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
    4.     _IMAGE_NT_HEADERS *srcimage=new _IMAGE_NT_HEADERS;
    5.     _IMAGE_NT_HEADERS *targetimage=new _IMAGE_NT_HEADERS;
    6.     DWORD srcressz=0;
    7.     char *srcreses;
    8.     if(src!=INVALID_HANDLE_VALUE)
    9.     {
    10.         LARGE_INTEGER SZ;
    11.         ZeroMemory(&SZ,sizeof(SZ));
    12.         GetFileSizeEx(src,&SZ);
    13.         char *buf=new char[SZ.QuadPart+1024];
    14.         memset(buf,NULL,SZ.QuadPart+1024);
    15.         DWORD rb;
    16.         ReadFile(src,buf,SZ.QuadPart,&rb,0);
    17.         CloseHandle(src);
    18.         _IMAGE_DOS_HEADER stub;
    19.         memcpy(&stub,buf,sizeof(_IMAGE_DOS_HEADER));
    20.         buf+=stub.e_lfanew;
    21.         memcpy(srcimage,buf,sizeof(_IMAGE_NT_HEADERS));
    22.         _IMAGE_SECTION_HEADER *sections=new _IMAGE_SECTION_HEADER[srcimage->FileHeader.NumberOfSections];
    23.         buf+=sizeof(_IMAGE_NT_HEADERS);
    24.         memcpy(sections,buf,(srcimage->FileHeader.NumberOfSections*sizeof(_IMAGE_SECTION_HEADER)));
    25.         buf-=sizeof(_IMAGE_NT_HEADERS);
    26.         buf-=stub.e_lfanew;
    27.         for(int i=0;i<srcimage->FileHeader.NumberOfSections;i++)
    28.         {
    29.             //printf("%.8s\n",sections[i].Name);
    30.             if(srcimage->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress==sections[i].VirtualAddress)
    31.             {
    32.                 srcreses=new char[sections[i].SizeOfRawData];
    33.                 buf+=sections[i].PointerToRawData;
    34.                 memcpy(srcreses,buf,sections[i].SizeOfRawData);
    35.                 buf-=sections[i].PointerToRawData;
    36.                 srcressz=sections[i].SizeOfRawData;
    37.             }
    38.         }
    39.         delete []buf;
    40.     }
    41.     else
    42.     {
    43.         printf("Error open source exe\n");
    44.         return(false);
    45.     }
    46.     HANDLE tg=CreateFileA(target,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
    47.     if(tg!=INVALID_HANDLE_VALUE)
    48.     {
    49.         LARGE_INTEGER SZ;
    50.         ZeroMemory(&SZ,sizeof(SZ));
    51.         GetFileSizeEx(tg,&SZ);
    52.         char *buf=new char[SZ.QuadPart+1024];
    53.         memset(buf,NULL,SZ.QuadPart+1024);
    54.         DWORD rb;
    55.         ReadFile(tg,buf,SZ.QuadPart,&rb,0);
    56.         CloseHandle(tg);
    57.         _IMAGE_DOS_HEADER stub;
    58.         memcpy(&stub,buf,sizeof(_IMAGE_DOS_HEADER));
    59.         buf+=stub.e_lfanew;
    60.         memcpy(targetimage,buf,sizeof(_IMAGE_NT_HEADERS));
    61.         _IMAGE_SECTION_HEADER *sections=new _IMAGE_SECTION_HEADER[targetimage->FileHeader.NumberOfSections];
    62.         buf+=sizeof(_IMAGE_NT_HEADERS);
    63.         memcpy(sections,buf,(targetimage->FileHeader.NumberOfSections*sizeof(_IMAGE_SECTION_HEADER)));
    64.         buf-=sizeof(_IMAGE_NT_HEADERS);
    65.         buf-=stub.e_lfanew;
    66.         DWORD resesDelta=0;
    67.         for(int i=0;i<targetimage->FileHeader.NumberOfSections;i++)
    68.         {
    69.             if(targetimage->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress==sections[i].VirtualAddress)
    70.             {
    71.                 resesDelta=srcressz-sections[i].SizeOfRawData;
    72.             }
    73.         }
    74.         char *newexe=new char[SZ.QuadPart+resesDelta];
    75.         for(int i=0;i<targetimage->FileHeader.NumberOfSections;i++)
    76.         {
    77.             if(targetimage->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress==sections[i].VirtualAddress)
    78.             {
    79.                 DWORD irdsz=sizeof(_IMAGE_RESOURCE_DIRECTORY),irdEsz=sizeof(_IMAGE_RESOURCE_DIRECTORY_ENTRY),resdatsz=sizeof(_IMAGE_RESOURCE_DATA_ENTRY);
    80.                 DWORD acum=irdsz;
    81.                 _IMAGE_RESOURCE_DATA_ENTRY dataE;
    82.                 //printf("%d",srcressz);
    83.                 srcreses+=irdsz;
    84.                 for(;;)
    85.                 {
    86.                     ZeroMemory(&dataE,resdatsz);
    87.                     srcreses+=irdEsz;
    88.                     memcpy(&dataE,srcreses,resdatsz);//тут еррор
    89.                     acum=acum+irdEsz+resdatsz;
    90.                     dataE.OffsetToData=/*dataE.Size+*/acum+sections[i].PointerToRawData;//calculate new RVA
    91.                     memcpy(srcreses,&dataE,resdatsz);
    92.                     srcreses+=(resdatsz+dataE.Size);
    93.                     acum=acum+resdatsz+dataE.Size;
    94.                     if(acum==srcressz){break;}
    95.                 }
    96.                 srcreses-=srcressz;
    97.                 printf("!");
    98.                 ////////////////////////////////////////////////////////////
    99.                 memcpy(newexe,buf,sections[i].PointerToRawData);
    100.                 newexe+=sections[i].PointerToRawData;
    101.                 memcpy(newexe,srcreses,srcressz);
    102.                 newexe+=srcressz;
    103.                 DWORD totalseek=0;
    104.                 _IMAGE_SECTION_HEADER *fixedsections=new _IMAGE_SECTION_HEADER[targetimage->FileHeader.NumberOfSections];
    105.                 memcpy(fixedsections,sections,(targetimage->FileHeader.NumberOfSections*sizeof(_IMAGE_SECTION_HEADER)));
    106.                 fixedsections[i].SizeOfRawData=srcressz;
    107.                 i++;
    108.                 for(int j=i;j<targetimage->FileHeader.NumberOfSections;j++)
    109.                 {
    110.                     buf+=sections[j].PointerToRawData;
    111.                     memcpy(newexe,buf,sections[j].SizeOfRawData);
    112.                     fixedsections[j].PointerToRawData=sections[j].PointerToRawData+resesDelta;
    113.                     fixedsections[j].VirtualAddress=sections[j].VirtualAddress+resesDelta;
    114.                     newexe+=sections[j].SizeOfRawData;
    115.                     totalseek=totalseek+sections[j].SizeOfRawData;
    116.                 }
    117.                 newexe-=totalseek;
    118.                 newexe-=sections[i-1].PointerToRawData;
    119.                 newexe-=srcressz;
    120.                 _IMAGE_DOS_HEADER stubN;
    121.                 memcpy(&stubN,newexe,sizeof(_IMAGE_DOS_HEADER));
    122.                 newexe+=stubN.e_lfanew;
    123.                 newexe+=sizeof(_IMAGE_NT_HEADERS);
    124.                 memcpy(newexe,fixedsections,(targetimage->FileHeader.NumberOfSections*sizeof(_IMAGE_SECTION_HEADER)));
    125.                 newexe-=stubN.e_lfanew+sizeof(_IMAGE_NT_HEADERS);
    126.                 HANDLE out=CreateFileA(target,GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
    127.                 DWORD wb;
    128.                 WriteFile(out,newexe,SZ.QuadPart+resesDelta,&wb,0);
    129.                 CloseHandle(out);
    130.                 break;
    131.             }
    132.         }
    133.     }
    134.     else
    135.     {
    136.         printf("Error open target exe");
    137.     }
    138.     delete srcimage;
    139.     delete targetimage;
    140.     delete []srcreses;
    141.     return(true);
    142. }
    Надеюсь найдется добрый человек который покажет мне мою ошибку работы с памятью.
     
  3. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    ну ты хотя бы строку указывай, на которую у тебя студия ругается. Мой тебе совет: а) пиши все на апишках, а не этих вот макросах; б) хотя бы ентерами разделяй части кода (например, один блок - чтение, второй - подготовка, третий - запись, четвертый - корректировка). Иначе ты не только себе мозг сломаешь таким кодом
     
  4. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Строка в каментах указанна.Немогу понять почему студия ругается на блок памяти с скопированной секцией как на несуществующий указатель О_о,я наверно что топропустил очевидное :dntknw: Но немогу понять что :dntknw:
     
  5. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Где можно найти внятное описание секции ресурсов?
     
  6. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    _nic

    Вроде бы можно найти исходники ResHacker'а (или другого редактора - уже не помню), они на Делфи и там многое сделано через виндовые АПИ... лучше не знаю, sorry.
     
  7. sysexit

    sysexit New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2010
    Сообщения:
    176
    Что конкретно по ресурсам не понятно? Какую имено цель прислудуете, RVA поправить? Я уже сказал как.
     
  8. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    И дальше там же. Мало?
     
  9. n0name

    n0name New Member

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

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    внятного нету :) даже в официальном черт ногу сломит :)
     
  11. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Я немогу понять что находится за _IMAGE_RESOURCE_DIRECTORY_ENTRY :dntknw: когда я делаю сдвиг на sizeof(_IMAGE_RESOURCE_DIRECTORY_ENTRY) то не попадаю на _IMAGE_RESOURCE_DATA_ENTRY.
     
  12. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    так не бывает. Они идут подряд. Покажи код. У меня ощущение, что ты в студии к указателю прибавляешь размер струткуры, а не 1
     
  13. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Вот для теста написал
    Код (Text):
    1.                 DWORD irdsz=sizeof(_IMAGE_RESOURCE_DIRECTORY),irdEsz=sizeof(_IMAGE_RESOURCE_DIRECTORY_ENTRY),resdatsz=sizeof(_IMAGE_RESOURCE_DATA_ENTRY);
    2.                 DWORD acum=irdsz;
    3.                 _IMAGE_RESOURCE_DATA_ENTRY *dataE=new _IMAGE_RESOURCE_DATA_ENTRY;
    4.                 _IMAGE_RESOURCE_DIRECTORY ird;
    5.                 _IMAGE_RESOURCE_DIRECTORY_ENTRY erde;
    6.                 ZeroMemory(&ird,irdsz);
    7.                 memcpy(&ird,srcreses,irdsz);
    8.                 printf("%d:%d\n",ird.NumberOfIdEntries,ird.NumberOfNamedEntries);
    9.                 srcreses+=irdsz;
    10.                 ZeroMemory(&erde,irdsz);
    11.                 memcpy(&erde,srcreses,irdEsz);
    12.                 printf("%d:%d\n",erde.Id,erde.OffsetToDirectory);
    13.                 srcreses+=irdEsz;
    14.                 ZeroMemory(dataE,resdatsz);
    15.                 memcpy(dataE,srcreses,resdatsz);
    16.                 printf("%d\n",dataE->Size);
    17.                 getch();
    А вот что оно выводит:
     
  14. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    Код (Text):
    1.   printf("%d:%d\n",erde.Id,erde.OffsetToDirectory);
    2. замени на
    3.   printf("%d:%d, is a _directory_ = %u\n",erde.Id,erde.OffsetToDirectory, erde.DataIsDirectory));
    4. и подумай, что не так
     
  15. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Так что может идти за этой структурой??
     
  16. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    За ней следующая IMAGE_RESOURCE_DIRECTORY_ENTRY, что же ещё там может находиться, раз их у тебя 5+1 штук. Личку глянь, ну и попытайся всё же прочитать два абзаца комментариев в winnt.h, которые всё объясняют.
     
  17. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    ВОбщем перпелил ф-цию для обхода дерева,с целью посмотреть что то за фигня творится
    Код (Text):
    1. DWORD fixResRVA(char *res,//буфер с секцией
    2.                 DWORD stoff//текущей смещение буфера
    3.                 )
    4. {
    5.     DWORD irdsz=sizeof(_IMAGE_RESOURCE_DIRECTORY),irdEsz=sizeof(_IMAGE_RESOURCE_DIRECTORY_ENTRY),resdatsz=sizeof(_IMAGE_RESOURCE_DATA_ENTRY);
    6.     _IMAGE_RESOURCE_DIRECTORY ird;
    7.     _IMAGE_RESOURCE_DATA_ENTRY dataE;
    8.     ZeroMemory(&dataE,resdatsz);
    9.     res+=stoff;
    10.     ZeroMemory(&ird,irdsz);
    11.     memcpy(&ird,res,irdsz);
    12.     printf("dirs num: %d\n",ird.NumberOfNamedEntries+ird.NumberOfIdEntries);
    13.     res+=irdsz;
    14.     stoff=stoff+irdsz;
    15.     _IMAGE_RESOURCE_DIRECTORY_ENTRY *erde=new _IMAGE_RESOURCE_DIRECTORY_ENTRY[ird.NumberOfNamedEntries+ird.NumberOfIdEntries];
    16.     memset(erde,NULL,sizeof(_IMAGE_RESOURCE_DIRECTORY_ENTRY)*ird.NumberOfNamedEntries+ird.NumberOfIdEntries);
    17.     memcpy(erde,res,sizeof(_IMAGE_RESOURCE_DIRECTORY_ENTRY)*ird.NumberOfNamedEntries+ird.NumberOfIdEntries);
    18.     for(int i=0;i<ird.NumberOfNamedEntries+ird.NumberOfIdEntries;i++)
    19.     {
    20.         printf("erde[i].DataIsDirectory - %d\n",erde[i].DataIsDirectory);
    21.         if(erde[i].DataIsDirectory==1)
    22.         {
    23.             printf("diroffset: %d\n",erde[i].OffsetToDirectory);
    24.             res-=stoff;
    25.             stoff=fixResRVA(res,erde[i].OffsetToDirectory);
    26.         }
    27.         if(erde[i].DataIsDirectory==0)
    28.         {
    29.             res-=stoff;
    30.             res+=erde[i].OffsetToData;
    31.             ZeroMemory(&dataE,resdatsz);
    32.             memcpy(&dataE,res,resdatsz);
    33.             printf("%d\n",dataE.OffsetToData);
    34.         }
    35.     }
    36.     return(stoff);
    37. }
    Получаю вылет с таким интересным выводом:

    Обьясните плз откуда дакой бредовый офсет у 1й ветки дерева???
    ЗЫ:ресурсы из стандартного виндового блокнота ,из 32х битной 7ки