PE файл.Обработка импорта.

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

  1. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    1.Если IMAGE_IMPORT_DESCRIPTOR.TimeDateStamp==0 То что надо делать со структурой находящейся по адресу FirstThunk?В IMAGE_THUNK_DATA.Function писать адрес нужной ф-ции WinAPI ??А где мне взять тогда имя ф-ции?Из IMAGE_IMPORT_BY_NAME?
    2.А если IMAGE_IMPORT_DESCRIPTOR.TimeDateStamp==-1.То надо обработать список массив структур по адресу DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].Ну что с ними делать??У Крис Касперский пишет что если IMAGE_BOUND_IMPORT_DESCRIPTOR.TimeDateStamp структуры и дллки совпадают то делать ничего ненадо.И из какого места дллки вытаскивать этот TimeDateStamp?А что делать если не совпадают?
     
  2. MSoft

    MSoft New Member

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

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Нет там такого :dntknw:
     
  4. MSoft

    MSoft New Member

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

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Это главный признак.Когда оно -1, FirstThunk указывает в никуда.
    Кто то может обьяснить что это "загрузчик просто проецирует ее на адресное пространство процесса, не настраивая таблицу адресов IAT" означает?Что значит спроектировать дллку на адресное пространство процесса?Это что делает LoadLibrary или это совершенно другое?
     
  6. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    кинь ссылку, где ты это вычитал
     
  7. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    "Если она равна -1, то загрузчик не смотрит на массивы OriginalFirstThunk и FirstThunk, а полагает, что данная библиотека импортируется через Bound-импорт"
    http://www.wasm.ru/article.php?article=green2red02#_Toc100906491
    Если б при TimeDateStamp равному -1 загрузчик туда смотрел бы он бы скорей всего б скрашился.
     
  8. MSoft

    MSoft New Member

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

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    А если баунды есть,что с ними делать?
     
  10. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    _nic,

    Можно проверить на корректность и использовать, если всё верно. Можно тупо игнорировать и обрабатывать импорты как обычно. За подробностями — к тов. Bernd Luevelsmeyer и Matt Pietrek.
     
  11. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
  12. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Нельзя их обрабатывать как обычно.В 7ке к примеру у всяких блокнотов,калькуляторов и консолей Thunk'и указывают в никуда.И TimeDateStamp конечно же ==-1.
     
  13. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    _nic,

    «В никуда» — это за пределы образа? Ничего странного. Смысл привязки в том и состоит, что в IAT находятся готовые адреса соответствующих функций. OriginalFirstThunk должен быть заполнен адресами имён, иначе клин.

    Если таймстэмп не 0 и не -1, это время из заголовка соответствующей .DLL; если -1 — см. указанное в IMAGE_OPTIONAL_HEADER.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT]. Ну и Питрек/Лювельсмайер.

    Готов признать неправоту. Присылай хитрые блокноты и калькуляторы.
     
  14. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    можешь залить эти файлики на спейс? я смотрю сейчас блокнот и калькулятор от семерки. Там действительно есть баунды и все такое, но thunk'и есть и они корректные
     
  15. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Да нет в пределах образа.Но если оттудого читать то выходит ошибочка,как бе память неможет быть read.Ничего не утверждаю но показывает, оно на какие то странные места секции кода.Файлы: http://dump.ru/file/4919134
     
  16. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Да вроде все нормально, нормальные thunkи. Ты ж не путаешь rva и va? Или хоть покажи, как читаешь.
     
  17. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    У меня 1й thunk тоже на 4096 показывает,но если я оттудого пытаюсь прочитать IMAGE_THUNK_DATA,то моя программа выпадает с ошибкой доступа к памяти :dntknw:
    Код (Text):
    1. void processimport(DWORD adr,DWORD base,DWORD bound)
    2. {
    3.     IMAGE_IMPORT_DESCRIPTOR iid;
    4.     ZeroMemory(&iid,sizeof(IMAGE_IMPORT_DESCRIPTOR));
    5.     memcpy(&iid,(void*)adr,sizeof(IMAGE_IMPORT_DESCRIPTOR));
    6.     DWORD nameadr=adr;
    7.     for(;;)
    8.     {
    9.         if(iid.Name==NULL){break;}
    10.         printf("Name: %s tds:%d \n",(char*)((void*)(iid.Name+base)),iid.TimeDateStamp);
    11.         /*if(iid.TimeDateStamp==-1)
    12.         {
    13.             //IMAGE_THUNK_DATA
    14.             //IMAGE_IMPORT_BY_NAME
    15.             IMAGE_BOUND_IMPORT_DESCRIPTOR ibi;
    16.             ZeroMemory(&ibi,sizeof(IMAGE_BOUND_IMPORT_DESCRIPTOR));
    17.             memcpy(&ibi,(void*)bound,sizeof(IMAGE_BOUND_IMPORT_DESCRIPTOR));
    18.             DWORD boundadr=bound;
    19.             //printf("BN%s\n",(char*)(bound+ibi.OffsetModuleName));
    20.             for(;;)
    21.             {
    22.                 if(strcmp((char*)(base+iid.Name),(char*)(bound+ibi.OffsetModuleName))==0)
    23.                 {
    24.                     printf("bound tds: %d\n",ibi.TimeDateStamp);
    25.                     break;
    26.                 }
    27.                 boundadr=boundadr+sizeof(IMAGE_BOUND_IMPORT_DESCRIPTOR);
    28.                 memcpy(&ibi,(void*)boundadr,sizeof(IMAGE_BOUND_IMPORT_DESCRIPTOR));
    29.             }
    30.         }*/
    31.         printf("%d\n",iid.FirstThunk);
    32.         IMAGE_THUNK_DATA itd;
    33.         IMAGE_IMPORT_BY_NAME ibn;
    34.         memcpy(&itd,(void*)(base+iid.FirstThunk),sizeof(IMAGE_THUNK_DATA));
    35.         ZeroMemory(&ibn,sizeof(IMAGE_IMPORT_BY_NAME));
    36.         memcpy(&ibn,(void*)(base+itd.u1.AddressOfData),sizeof(IMAGE_IMPORT_BY_NAME));
    37.         printf("%d\n",ibn.Name);getch();
    38.         nameadr=nameadr+sizeof(IMAGE_IMPORT_DESCRIPTOR);
    39.         ZeroMemory(&iid,sizeof(IMAGE_IMPORT_DESCRIPTOR));
    40.         memcpy(&iid,(void*)nameadr,sizeof(IMAGE_IMPORT_DESCRIPTOR));
    41.     }
    42.     getch();
    43. }
    44. DWORD Load(char *patch)
    45. {
    46.     HANDLE f=CreateFileA(patch,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
    47.     if(f==INVALID_HANDLE_VALUE)
    48.     {
    49.         printf("error open file");
    50.         return 0;
    51.     }
    52.     LARGE_INTEGER sz;
    53.     GetFileSizeEx(f,&sz);
    54.     char *buf=new char[sz.QuadPart+1024];
    55.     DWORD r;
    56.     ReadFile(f,buf,sz.QuadPart,&r,0);
    57.     CloseHandle(f);
    58.     IMAGE_DOS_HEADER stub;
    59.     memcpy(&stub,buf,sizeof(IMAGE_DOS_HEADER));
    60.     buf+=stub.e_lfanew;
    61.     IMAGE_NT_HEADERS image;
    62.     memcpy(&image,buf,sizeof(IMAGE_NT_HEADERS));
    63.     IMAGE_OPTIONAL_HEADER options=image.OptionalHeader;
    64.     DWORD apadr=(DWORD)VirtualAlloc(0,options.SizeOfImage , MEM_COMMIT | MEM_RESERVE | MEM_TOP_DOWN, PAGE_EXECUTE_READWRITE);
    65.     //buf-=stub.e_lfanew;
    66.     //buf+=stub.e_lfanew;
    67.     buf+=sizeof(IMAGE_NT_HEADERS);
    68.     IMAGE_SECTION_HEADER *sections=new IMAGE_SECTION_HEADER[image.FileHeader.NumberOfSections];
    69.     memcpy(sections,buf,image.FileHeader.NumberOfSections*sizeof(IMAGE_SECTION_HEADER));
    70.     buf-=stub.e_lfanew;
    71.     buf-=sizeof(IMAGE_NT_HEADERS);
    72.     memcpy((void*)apadr,buf,options.SizeOfHeaders);
    73.     for(int i=0;i<image.FileHeader.NumberOfSections;i++)
    74.     {
    75.         buf+=sections[i].PointerToRawData;
    76.         memcpy((void*)(apadr+sections[i].VirtualAddress),buf,sections[i].SizeOfRawData);
    77.         buf-=sections[i].PointerToRawData;
    78.     }
    79.     processimport(apadr+options.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress,apadr,apadr+options.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].VirtualAddress);
    80.     return(apadr+options.AddressOfEntryPoint);
    81. }
     
  18. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    _nic,

    Ещё раз: в привязанном PE элементы IAT (таблицы, RVA которой находится в IMAGE_IMPORT_DESCRIPTOR.FirstThunk) содержат не IMAGE_THUNK_DATA а конкретные адреса, экспортируемые соответствующей .DLL. Если нужны импортируемые имена/ординалы — используй IMAGE_IMPORT_DESCRIPTOR.OriginalFirstThunk, который ссылается на ILT.
     
  19. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Этого нигде нет :dntknw: Можешь описать структуры по FirstThunk ?
     
  20. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    _nic,

    «Не может быть!» :derisive:
    Ещё раз: Matt Pietrek и Bernd Luevelsmeyer. У них всё расписано (Питрек ещё и с картинками).