данные dll-exe

Тема в разделе "WASM.BEGINNERS", создана пользователем chugun, 21 авг 2008.

  1. chugun

    chugun New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2007
    Сообщения:
    7
    Подскажите, как экспортировать адреса данных(переменных) из exe-файла в dll.Желательно под fasm, хотя не критично.Спасибо.
     
  2. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    chugun
    Для масма - это директивы PUBLIC, EXTERN, GLOBAL.
    Метка, объявленная директивой PUBLIC, становится доступной для других модулей программы.
    EXTERN описывает метку, определенную в другом модуле (с помощью PUBLIC).
    Директива GLOBAL действует, как PUBLIC и EXTERN одновременно.

    Зубков.

    Чё то я прогнал...ты же про экспорт спрашивал...
     
  3. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    chugun
    А если поконкретней, то в чем проблема? Переменные в экспорт прописать? Можено экспортировать также как и адреса функций, только их истинный адрес будет на 3 байта дальше, потому как в таблице импорта сначала идет jmp dword ptr.
     
  4. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    так же как и функции

    пишешь def-файл следующего содержания

    LIBRARY YourExe (только имя. Без расширения)
    EXPORTS Somevar1
    EXPORTS SomeVar2


    Далее указываешь линкеру путь к деф-файлу

    /DEF:YourFile.def


    и собираешь проект
    подробнее ищи в ФАКе на васме
     
  5. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    При этом при обращении к переменной из длл у тебя возникнут проблемы, про которые я писал выше. Когда мне было нужно решить подобный вопрос, я пользовал макрос, который при обращении к переменной прибавлял к адресу в импорите 2 байта, чтобы исключить ненужный джамп.
    Код (Text):
    1. ia MACRO var
    2. mov eax, dword ptr [var+2]
    3. mov eax, dword ptr [eax]
    4. exitm <eax>
    5. ENDM
    Сам попробовал, прежде чем отослать?
     
  6. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    В .DEF-файле написать.
    Код (Text):
    1. LIBRARY Mylib.dll
    2. EXPORTS
    3.   MyVariable DATA
    И не нужно добавлять никаких двух байтов.
     
  7. chugun

    chugun New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2007
    Сообщения:
    7
    За советы спасибо, но в fasme не получается, пока чтобы идти дальше я в отладчике взял адреса нужных данных в exe и прописал их в dll-ке, всё работает, но хотелось бы легальным путём, подскажите.
     
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    chugun
    Если честно, не понимаю, в чем проблема. Пример на фасме (5.exe экспортирует MyValue для 6.dll):
    код файла 5.asm
    Код (Text):
    1. format PE GUI 4.0
    2. entry EntryPoint
    3.  
    4. include 'win32a.inc'
    5.  
    6. section '.code' code readable writable executable
    7. EntryPoint:
    8.     invoke MessageBox,0,MyValue,msgTitle,0
    9.     invoke LoadLibrary,libName
    10. invoke ExitProcess,0
    11.  
    12. section '.data' data readable writeable
    13.     MyValue db 'MyValue',0
    14.     libName db '6.dll',0
    15.     msgTitle db 'EXE message box',0
    16.  
    17. section '.idata' import data readable writeable
    18.  
    19.   library kernel,'KERNEL32.DLL',\
    20.           user,'USER32.DLL'
    21.  
    22.   import kernel,\
    23.          LoadLibrary,'LoadLibraryA',\
    24.          ExitProcess,'ExitProcess'
    25.  
    26.   import user,\
    27.          MessageBox,'MessageBoxA'
    28.  
    29.  
    30. section '.edata' export data readable
    31.  
    32.   export '5.exe',\
    33.          MyValue,'MyValue'
    код файла 6.asm
    Код (Text):
    1. format PE GUI 4.0 DLL
    2. entry DllEntryPoint
    3.  
    4. include 'win32a.inc'
    5.  
    6. section '.code' code readable writable executable
    7. DllEntryPoint:
    8.    cmp DWORD[ESP+8h],DLL_PROCESS_ATTACH
    9.    jne @F
    10.       invoke MessageBox,0,[MyValue],msgTitle,0
    11.    @@:
    12.    mov eax,TRUE
    13. ret 0Ch
    14.  
    15. section '.data' data readable writeable
    16.     msgTitle db 'DLL message box',0
    17.  
    18. section '.idata' import data readable writeable
    19.  
    20.   library kernel,'KERNEL32.DLL',\
    21.           user,'USER32.DLL',\
    22.           exeFile,'5.exe'
    23.  
    24.   import kernel,\
    25.          ExitProcess,'ExitProcess'
    26.  
    27.   import user,\
    28.          MessageBox,'MessageBoxA'
    29.  
    30.   import exeFile,\
    31.          MyValue,'MyValue'
    32.  
    33. section '.reloc' fixups data discardable
    Aspire
    Впервые слышу как про jmp в начале таблицы импорта, так и про трехбайтовые jmp. Никакой коррекции не нужно.
     
  9. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Про трехбайтовый джамп я исправился (см выше). Про таблицу импорта зачем лупанул - не знаю. Имел ввиду сцылки на IAT в конце секции кода, которые выглядят как jmp dword ptr [адрес по которому лежит адрес].
    Может, в фасме никакой коррекции и не нужно - не пробовал. А масме, если экспортировать переменную так же как и функцию...попробуйте что получится..
    Большое спасибо, reverser, за подсказку. Век живи, век учись..
     
  10. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Aspire
    Это Вы исправились там, где два байта? С каких это пор косвенный переход два байта занимает? Да... насчет "впервые слышу про трехбайтовые jmp"... разумеется, имеется в виду 32-битный режим.
    Честно говоря, тоже впервые слышу. Ссылка на IAT хранится в Data Directory. В конце секции кода просто так, насколько мне известно, ничего не пишется.
    Сомневаюсь, что у меня вообще что-то получится на MASM'е. :) Тем не менее не верю, т.к. в таблице импорта указывается адрес начала экспортируемых данных (будь то функция или переменная).
     
  11. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Aspire
    Посмотрел код, сформированный масмом. Думал, что такие мостики выставляют только пакеры... ну или в принципе код, которому необходимо динамическое формирование вызовов экспортируемых dll-ками функций. Теперь ясно, что MASM пытается таким образом по байту на каждом вызове выиграть. Для небольших программ эта "оптимизация" только увеличит размер кода.
    Понятно, откуда у двух байтов ноги растут.
     
  12. chugun

    chugun New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2007
    Сообщения:
    7
    Всем большое спасибо, особо - l_inc, объяснил предметно, конкретно - дорогого стоит.Ещё раз спасибо, тема снята.