Таблица импорта

Тема в разделе "MASM", создана пользователем Dimarik__, 5 янв 2012.

  1. Dimarik__

    Dimarik__ New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2011
    Сообщения:
    58
    Здравствуйте. Читаю туториалы по ассемблеру, взятые с WASM-a. Автор рассказал о массиве структур IMAGE_DATA_DIRECTORY, который состоит из 16 элементов. Во-первых, немножко непонятно. Объявлено 16 элементов
    Код (ASM):
    1. DataDirectory    IMAGE_DATA_DIRECTORY 16 dup(<>)
    А далее идёт табличка только с 15 элементами
    ПараметрИнформация
    0Символы экспоpта
    1Символы импорта
    2Ресурсы
    3Исключение
    4Безопасность
    5Base relocation
    6Отладка
    7Стpока копирайта
    8Unknown
    9Thread local storage (TLS)
    10Загрузочная информация
    11Bound Import
    12Таблица адресов импорта
    13Delay Import
    14COM descriptor
    И на странице 294 самое интересное
    Код (ASM):
    1. mov edi,pNTHdr
    2. assume edi:ptr IMAGE_NT_HEADERS
    3. mov edi, [edi].OptionalHeader.DataDirectory[sizeof
    4.     IMAGE_DATA_DIRECTORY].VirtualAddress
    Зачем здесь sizeof IMAGE_DATA_DIRECTORY
    К какому элементу массива структур мы обращаемся и почему?
    Если нам нужно получить VirtualAddress символов импорта, то почему бы просто не написать
    Код (ASM):
    1. mov edi, [edi].OptionalHeader.DataDirectory[1].VirtualAddress
     
  2. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.449
    Адрес:
    Россия
    Это что за дока покажи?
     
  3. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    16-й элемент IMAGE_DATA_DIRECTORY в массиве DataDirectory обычно "Reserved (unknown)" и он просто опущен
     
  4. Dimarik__

    Dimarik__ New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2011
    Сообщения:
    58
    http://www.wasm.ru/
    и вот тут находится:
    13. Туториалы Iczelion'а для печати [Iczelion, обработал krutan] →
     
  5. Dimarik__

    Dimarik__ New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2011
    Сообщения:
    58
    Так к какому элементу массива структур мы обращаемся и почему?
    Если нам нужно получить VirtualAddress символов импорта, то почему бы просто не написать
    mov edi, [edi].OptionalHeader.DataDirectory[1].VirtualAddress
     
  6. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Все просто, вот это выражение
    Код (ASM):
    1. mov edi, [edi].OptionalHeader.DataDirectory[1].VirtualAddress
    равносильно
    Код (ASM):
    1. mov edi, [edi].OptionalHeader.DataDirectory[sizeof IMAGE_DATA_DIRECTORY].VirtualAddress
     
  7. Dimarik__

    Dimarik__ New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2011
    Сообщения:
    58
    Почему равносильно? разве IMAGE_DATA_DIRECTORY имеет размер 1 байт и результатом выполнения операции sizeof IMAGE_DATA_DIRECTORY будет 1? О_о
    Там же есть 2 поля VirtualAddress и isize, каждое из которых является переменной типа DWORD (DD) и это означает что результатом выполнения sizeof IMAGE_DATA_DIRECTORY должна стать 8 (4+4=8)
     
  8. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.173
    Адрес:
    подполье
    Это не один байт, это умножение на единицу, тобишь адресуеца вторая от единицы и первая от нуля структура в массиве. Причем содержимое данного элемента. Так то
     
  9. Dimarik__

    Dimarik__ New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2011
    Сообщения:
    58
    Понял, спасибо большое за разъяснение.
     
  10. Dimarik__

    Dimarik__ New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2011
    Сообщения:
    58
    Эту же мануалку читаю, написал всё как говорил автор, в итоге, в этих местах ошибки:
    Код (Text):
    1. .while !(([EDI].OriginalFirstThink == 0) && ([EDI].TimeDateStamp == 0) &&
    2.                 ([EDI].ForwarderChain == 0) && ([EDI].Name1 == 0) && ([EDI].FirstThunk == 0))
    3.             invoke RVAToOffset, DD_adressOfMappingFile, EDI
    4.             ;добавляем файловое смещение к указателю на мэппированный файл и получаем искомый RVA,
    5.             ;который будет при загрузке файла PE-загрузчиком
    6.             mov EDX, EAX
    7.             add EDX, DD_adressOfMappingFile
    8.             invoke wsprintf, offset strTemp_1, offset strIDTemplate,
    9.                             [EDI].OriginalFirstThunk, [EDI].TimeDateStamp, [EDI].ForwarderChain, EDX, [EDI].FirstThunk
    10.            
    11.         .endw
    вот такие вот ошибочки выдал MASM32:
    Код (Text):
    1. Microsoft Windows [Version 6.1.7600]
    2. (c) Корпорация Майкрософт (Microsoft Corp.), 2009. Все права защищены.
    3.  
    4. C:\Users\Dimarik>cd c:/masm32/bin
    5.  
    6. c:\masm32\bin>ml /c /coff PE_1.asm
    7. Microsoft (R) Macro Assembler Version 6.14.8444
    8. Copyright (C) Microsoft Corp 1981-1997.  All rights reserved.
    9.  
    10.  Assembling: PE_1.asm
    11. PE_1.asm(394) : error A2154: syntax error in control-flow directive
    12. PE_1.asm(395) : error A2008: syntax error : (
    13. PE_1.asm(401) : error A2006: undefined symbol : FirstThunk
    14. PE_1.asm(401) : error A2114: INVOKE argument type mismatch : argument : 0
    15. PE_1.asm(401) : error A2006: undefined symbol : ForwarderChain
    16. PE_1.asm(401) : error A2006: undefined symbol : TimeDateStamp
    17. PE_1.asm(401) : error A2006: undefined symbol : OriginalFirstThunk
    18. PE_1.asm(191) : error A2006: undefined symbol : PointertoRawData
    19. PE_1.asm(57) : error A2009: syntax error in expression
    20.  
    21. c:\masm32\bin>
    строка 395 - это начало цикла
    как только я с этим .while не работал
    и так
    Код (Text):
    1.     .while !([edi].OriginalFirstThunk==0 && [edi].TimeDateStamp==0 &&
    2.         [edi].ForwarderChain==0 && [edi].Name1==0 && [edi].FirstThunk==0)
    (как собственно, изначально предлагал автор)
    и даже так:
    Код (Text):
    1.         .while ([EDI].OriginalFirstThink != 0) && ([EDI].TimeDateStamp != 0) &&
    2.                 ([EDI].ForwarderChain != 0) && ([EDI].Name1 != 0) && ([EDI].FirstThunk != 0))
    Результата никакого.
    Ещё непонятно, почему это в функции wsprintf ругается на [EDI].OriginalFirstThunk и т.п.
    Самое главное, в самом условии цикла - компилятор на эти переменные не ругался, а через несколько строк ошибку выдал.
    P.S. Хотелось бы эту проблему решить через .while без использования всяких там cmp, jnz и т.п.
    Вот полностью код http://zalil.ru/32439206
    Заранее спасибо за советы.
     
  11. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    Dimarik__
    Вам не понятно. Мне не понятно. Компилятору не понятно. Что есть Edi ?
     
  12. Dimarik__

    Dimarik__ New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2011
    Сообщения:
    58
    assume EDI:ptr IMAGE_IMPORT_DESRIPTOR
    естественно, перед этим в EDI был записан Relative Virtual Address IMAGE_IMPORT_DESRIPTOR
     
  13. Dimarik__

    Dimarik__ New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2011
    Сообщения:
    58
    разобрался с ошибками уже)) Тема закрыта))