самой метки, а адрес со смещением?
речь про getprocaddress?
Чего-чего? Начнём с того, что в DLL нет никаких меток))
Стикер
Ну типа беру я принтф, а хочу принтф+2 получить
mov eax, dword[printf] add eax, 2
Чтобы сразу достать адрес из dll printf+2
push printf_str push dll_handle call dword[GetProcAddress] add eax, 2
А через таблицу импорта?
Ну, находишь таблицу импорта, цикл по именам функций, когда находишь - получаешь RVA из таблицы адресов, и получаешь адрес.
Блин, я говорю о той штуке, которая через library/import
Это макрос, какое отношение он к DLL имеет?
Ну они же из dll импортят функции
Импортирует функцию загрузчик. А макрос просто указывает адрес, куда загрузчик должен положить адрес на функцию.
Хорошо, я могу как-то сказать загрузчику, чтобы он загрузил этот адрес сразу увеличенным на 8 например
Нет, он функцию находит по имени, в таблице адресов внутри библиотеки написан конкретный RVA, и ты никак его не изменишь. Можешь только сам изменить во время исполнения в главном коде, или через TLS.-
Да. Или пропатчить библиотеку, но с системной не прокатит.
ThreadLocalStorage, (одна из фишек - ) функция которую загрузчик будет вызывать каждый раз при создании\закрытии потока.
Типа я могу такую функцию объявить и он её исполнит ещё до мейна?
штука через fs работающая в винде и маке
Mov [eax+2], dword [printf]
Ээээ ты что делаешь, это незаконно
не обращай внимания
если надо прям до entry запустить, то подсели к проге ещё одну либу с dllentry, она раньше чем основной вызовется
Зачем, если можно просто подселить к программе ещё одну программу, и попросить пользователя её запустить перед запуском основной?
Так можно де , транзистор?
dll проще и у антивируса лишних дум на твою прогу не будет
😁 У антивируса по-умолчанию будет дума, если у программы нет CRTStartup. И нет, DLL не проще. DLL это аж целых минимум строк 20, а TLS - обычная структурка на 5-7 строк.
+ потом можно в либу ещё что-то добавить
Как и в TLS... Вредные советы раздаёшь)
я придерживаюсь подхода к разработке по с использованием большого числа модулей, и по этому библиотека для меня(в данном подходе) это чуть ли не база
Ну хз, динамическая библиотека это по сути прога, которая постоянно висит в памяти
В импорт и экспорт придётся прописать, таскать с собой постоянно, лишний код тупо, когда можно 5 строк на TLS потратить, и уже есть функция, которая будет запускаться каждый раз до создания потока (в том числе, перед запуском главного кода).
А где про это TLS почитать можно
На MSDN, естественно. Но мне не очень нравится там формат описания, поэтому вот статья на WASM: https://wasm.in/blogs/tls-iznutri.453/ А вот как обьявлять на FASM: .tls_callback: ; Вызывается каждый раз при создании потока ret 4*3 ; Аргументы как у DllMain data 9 dd 0 dd 0 dd .tls_index dd .tls_callbacks dd 0 dd 0 .tls_index dd 0 .tls_callbacks dd .tls_callback, 0 end data
В .tls_callbacks можешь сколько угодно добавить функций.
А в документации fasm описания нет? А то меня напрягает data 9
data начинает определение специальных данных PE, за директивой должен следоваь один из идентификаторов данных (export, import, resource или fixups) или номер записи данных в заголовке PE. Данные должны быть определены на следующих строках и заканчиваться директивой end data. Если выбрано определение настроек адресов, они генерируются автоматически, и никаких данных определять больше не требуется. То же самое относится к ресурсам, если за идентификатором resourse следует оператор from и имя файла в кавычках - в этом случае данные берутся из этого файла ресурсов.
Сразу видно, что с TLS никогда не работал.
О, так он может много калбеков вызывать
А на х64 правила для ret меняются?
ну в винде да, не работал, но по мне это уже перебор какой-то
Не знаю, не смотрел.
Перебор это писать DLL, чтобы просто свой PE поправить в памяти до запуска главного кода 😁 Хотя, как s54820 выше написал - лучше в main и править, тут даже TLS не нужен, но раз уж хочется - то лучше TLS, библиотека перебор.
А эта штука вызывается уже после импорта библиотек или до?
Если не ошибаюсь, после.
Обсуждают сегодня