Создание системы стандартных макросов для FASM

Тема в разделе "WASM.PROJECTS", создана пользователем Miller Rabin, 20 июл 2008.

  1. Miller Rabin

    Miller Rabin New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2006
    Сообщения:
    185
    Всем привет. Ну дорвался наконец до темы.
    Sashok
    Лишнего кода нет. В этом вся прелесть.

    Z3N
    Ну хорошо убедил. Продолжаю тему.

    Хотелось бы затронуть тему динамического формирования таблицы импорта.
    Все знают как в фасме делается таблица импорта
    Код (Text):
    1. SECTION '.idata' import data readable writeable
    2.  library kernel32,'KERNEL32.DLL'
    3.  
    4.  INCLUDE 'apiw\kernel32.inc'
    Вроде все просто. Только вот есть проблемка. Приходится контролировать таблицу импорта вручную. Включил новый модуль, для работы с новой библиотекой - изволь ручками пересобачить таблицу импорта. Хотелось бы, чтобы включил модуль вверху программы и тебе данные поместились в '.data' и код в '.code' и таблица импорта сформировалась как нужно.

    Вот сейчас я объясню как этого можно добиться. Для начала нам понадобится вспомогательный макрос препроцессора.
    Код (Text):
    1. ;Объект отвечающий за работу со списком констант на уровне препроцессора
    2. macro TConstList name
    3. {
    4. name equ
    5.  
    6. ;Добавляет элемент Item в конец списка
    7. macro name#.Append item
    8. \{
    9.     match any, name \\{ name equ name, item\\}
    10.     match , name \\{ name equ item \\}
    11. \}
    12.  
    13. ;Добавляет элемент Item в начало списка
    14. macro name#.ReverseAppend item
    15. \{
    16.     match any, name \\{ name equ  item,name\\}
    17.     match , name \\{ name equ item \\}
    18. \}
    19.  
    20. }
    Этот, так сказать, объект живет только на уровне препроцессора и занимается тем, что формирует списки строк.
    Пользоваться им так
    TConstList StringList
    StringList.Append <'Первая строка'>
    StringList.Append <'Вторая строка'>
    Если после этого написать display LibraryList, то фасм выдаст 'Первая строка, Вторая строка'

    Этот макрос мы и будем использовать для формирования таблицы импорта.

    Итак создаем список библиотек, подключаемых по-умолчанию
    TConstList LibraryList
    LibraryList.Append <kernel32,'KERNEL32.DLL'>
    LibraryList.Append <user32,'USER32.DLL'>

    Получаем запись вида kernel32,'KERNEL32.DLL', user32,'USER32.DLL' Это как раз то, что ожидает получить на своем входе library.

    Формируем макрос для подключения импортируемых функции
    macro INCLUDE_IMPORT_W
    {
    INCLUDE 'apiw\kernel32.inc'
    INCLUDE 'apiw\user32.inc'
    }

    Ну и заключением является макрос, формирующий таблицу импорта
    macro CreateImportSectionW
    {
    SECTION '.idata' import data readable writeable

    match any, LibraryList
    \{
    library any
    \}

    INCLUDE_IMPORT_W
    }
    Теперь все готово для демонстрации техники
     
  2. Miller Rabin

    Miller Rabin New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2006
    Сообщения:
    185
    Создаем проект пустой шаблон PE файла со стандартным заголовком
    Код (Text):
    1. FORMAT PE   GUI 4.0
    2. ENTRY   Main
    3. INCLUDE 'win32w.inc'
    4. INCLUDE 'ENCODING\win1251.inc'
    5.  
    6. INCLUDE 'System.mac' ;Наш файл в котором описаны приведеные выше макросы
    7.  
    8. proc Main
    9. ;bla bla bla
    10. ret
    11.  
    12. CreateImportSectionW   ;Вот так мы формируем секцию импорта.
    В данном файле секция импорта будет содержать две библиотеки kernel32 и user32 при условии, что их функции будут вызваны где - либо. Но что если мы напирмер захотим подключить к файлу функции из библиотеки виртуальной java-машины?

    Для этого надо подключить в таблицу импорта функции из библиотеки jvm.dll Как это сделать. Да очень просто.
    Создаем файл jvm.mac, в котором будут объявляются необходимые вам объекты.
    О том как работать с java-машиной здесь приводить не буду гугль в помощь.
    Ключевыми строками в этом файл будут
    Код (Text):
    1. LibraryList.Append <jvm,'jvm.dll'>
    2. и
    3. macro INCLUDE_IMPORT_W
    4. {
    5.   INCLUDE 'jvm.imp'; Стандартное описание импортируемых функций из jvm
    6. }
    И все. Такой файл можно подключить просто добавив
    Код (Text):
    1. FORMAT PE   GUI 4.0
    2. ENTRY   Main
    3. INCLUDE 'win32w.inc'
    4. INCLUDE 'ENCODING\win1251.inc'
    5.  
    6. INCLUDE 'System.mac'
    7. INCLUDE 'jvm.mac'       ; <------------------------СЮДА
    И таблица импорта сформируется вместе с вашими пожеланиями
     
  3. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Miller Rabin гляньте в личку.
     
  4. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.615
    Адрес:
    Russia
    Sashok
    я когда пишу в дос просто ставлю перед макросом int3
    и отладчик прям перед макросом и всплывает и я вижу что он там наколбасил и насколько это соответствует моим ожиданиям
    условное ассемблирование вооще проблемы составлять не должно, и неважно в макросе оно или нет
     
  5. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.615
    Адрес:
    Russia
    Sashok
    сколько макросов вы написали самостоятельно???
    больше опыта - меньше проблем
     
  6. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Вы меня не поняли в фасме нет масмовского аналога return в макросе.
     
  7. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Только что до меня дошло как это можно сделать :). Бывает же такое....
     
  8. Sashok

    Sashok New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2009
    Сообщения:
    52
    Чистосердечно признаюсь - ни одного.
    Опита zero.
    Литературы по написанию макросов мало,может по етому я пытаюсь
    что нибуть научится у (как я понимаю он гуру в этом вопросе) Miller Rabin.
    Прошу строго не судить.
     
  9. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    На форуме флэтассемблера много чего про макросы есть. Где-то была даже статья для новичков (вам придётся поискать). Кроме того можно прочитать мануал фасма и найти там много интересного. Также есть статьи на этом сайте, если мне не изменяет память.
     
  10. Sashok

    Sashok New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2009
    Сообщения:
    52
    Z3N
    Спасибо большое за ссылки.