Подскажите, как экспортировать адреса данных(переменных) из exe-файла в dll.Желательно под fasm, хотя не критично.Спасибо.
chugun Для масма - это директивы PUBLIC, EXTERN, GLOBAL. Метка, объявленная директивой PUBLIC, становится доступной для других модулей программы. EXTERN описывает метку, определенную в другом модуле (с помощью PUBLIC). Директива GLOBAL действует, как PUBLIC и EXTERN одновременно. Зубков. Чё то я прогнал...ты же про экспорт спрашивал...
chugun А если поконкретней, то в чем проблема? Переменные в экспорт прописать? Можено экспортировать также как и адреса функций, только их истинный адрес будет на 3 байта дальше, потому как в таблице импорта сначала идет jmp dword ptr.
так же как и функции пишешь def-файл следующего содержания LIBRARY YourExe (только имя. Без расширения) EXPORTS Somevar1 EXPORTS SomeVar2 Далее указываешь линкеру путь к деф-файлу /DEF:YourFile.def и собираешь проект подробнее ищи в ФАКе на васме
При этом при обращении к переменной из длл у тебя возникнут проблемы, про которые я писал выше. Когда мне было нужно решить подобный вопрос, я пользовал макрос, который при обращении к переменной прибавлял к адресу в импорите 2 байта, чтобы исключить ненужный джамп. Код (Text): ia MACRO var mov eax, dword ptr [var+2] mov eax, dword ptr [eax] exitm <eax> ENDM Сам попробовал, прежде чем отослать?
В .DEF-файле написать. Код (Text): LIBRARY Mylib.dll EXPORTS MyVariable DATA И не нужно добавлять никаких двух байтов.
За советы спасибо, но в fasme не получается, пока чтобы идти дальше я в отладчике взял адреса нужных данных в exe и прописал их в dll-ке, всё работает, но хотелось бы легальным путём, подскажите.
chugun Если честно, не понимаю, в чем проблема. Пример на фасме (5.exe экспортирует MyValue для 6.dll): код файла 5.asm Код (Text): format PE GUI 4.0 entry EntryPoint include 'win32a.inc' section '.code' code readable writable executable EntryPoint: invoke MessageBox,0,MyValue,msgTitle,0 invoke LoadLibrary,libName invoke ExitProcess,0 section '.data' data readable writeable MyValue db 'MyValue',0 libName db '6.dll',0 msgTitle db 'EXE message box',0 section '.idata' import data readable writeable library kernel,'KERNEL32.DLL',\ user,'USER32.DLL' import kernel,\ LoadLibrary,'LoadLibraryA',\ ExitProcess,'ExitProcess' import user,\ MessageBox,'MessageBoxA' section '.edata' export data readable export '5.exe',\ MyValue,'MyValue' код файла 6.asm Код (Text): format PE GUI 4.0 DLL entry DllEntryPoint include 'win32a.inc' section '.code' code readable writable executable DllEntryPoint: cmp DWORD[ESP+8h],DLL_PROCESS_ATTACH jne @F invoke MessageBox,0,[MyValue],msgTitle,0 @@: mov eax,TRUE ret 0Ch section '.data' data readable writeable msgTitle db 'DLL message box',0 section '.idata' import data readable writeable library kernel,'KERNEL32.DLL',\ user,'USER32.DLL',\ exeFile,'5.exe' import kernel,\ ExitProcess,'ExitProcess' import user,\ MessageBox,'MessageBoxA' import exeFile,\ MyValue,'MyValue' section '.reloc' fixups data discardable Aspire Впервые слышу как про jmp в начале таблицы импорта, так и про трехбайтовые jmp. Никакой коррекции не нужно.
Про трехбайтовый джамп я исправился (см выше). Про таблицу импорта зачем лупанул - не знаю. Имел ввиду сцылки на IAT в конце секции кода, которые выглядят как jmp dword ptr [адрес по которому лежит адрес]. Может, в фасме никакой коррекции и не нужно - не пробовал. А масме, если экспортировать переменную так же как и функцию...попробуйте что получится.. Большое спасибо, reverser, за подсказку. Век живи, век учись..
Aspire Это Вы исправились там, где два байта? С каких это пор косвенный переход два байта занимает? Да... насчет "впервые слышу про трехбайтовые jmp"... разумеется, имеется в виду 32-битный режим. Честно говоря, тоже впервые слышу. Ссылка на IAT хранится в Data Directory. В конце секции кода просто так, насколько мне известно, ничего не пишется. Сомневаюсь, что у меня вообще что-то получится на MASM'е. Тем не менее не верю, т.к. в таблице импорта указывается адрес начала экспортируемых данных (будь то функция или переменная).
Aspire Посмотрел код, сформированный масмом. Думал, что такие мостики выставляют только пакеры... ну или в принципе код, которому необходимо динамическое формирование вызовов экспортируемых dll-ками функций. Теперь ясно, что MASM пытается таким образом по байту на каждом вызове выиграть. Для небольших программ эта "оптимизация" только увеличит размер кода. Понятно, откуда у двух байтов ноги растут.
Всем большое спасибо, особо - l_inc, объяснил предметно, конкретно - дорогого стоит.Ещё раз спасибо, тема снята.