Увожаемые программисты! Подскажите как можно вызвать функцию из dll? только без использованием GetProcAddress! Есть какой нибудь альтернативный вариант?
1) Например по шаблону найти байты соответствующие коду функции (как это делают некоторые пакеры и защиты). 2) Хардкодить, если это твоя DLL. Вычислив дельту и отталкиваясь от Modulebase 3) Перебрать таблицу экспорта интересующей dll (создать свой аналог GetProcAddress) 4) Воспользоваться "int 2e" Всё. Лично у меня фантазия кончилась.
Структура PE-header исполняемого файла тебе знакома? В сети куча инфы по этому, разные вьюверы. Разница будет лишь в том, что работа происходит с памятью. Для начала получаешь таблицу экспорта нужного модуля, дальше ищешь функцию по имены и получаешь её адрес. Только с заманглеными имена может возникнуть трудность - но это поправимо в виде ординала (это смотря какая функция тебе нужна).
Нужны API функции! я бы конечно мог заранее узнать адреса этих функций и юзать их, но тогда возникает проблема с разными виндами... короче говоря у каждой винды свои адреса функций
Недопонял. Ты вообще хочешь отказаться от таблицы импорта своего модуля? Речь о вирусе или пакере/протекторе?
реч идет вообще о граф программе... вот к примеру в дельфи можно так 1 hlib := loadlibrarya(lib); addr := getprocaddress(hlib, 'createfile'); где addr адрес нашей функции 2 а можно и так createfile(filename: pchar; ....): dword; external 'kernel32.dll'; есть что нибудь подобное на асме? то есть я хочу вообще отказаться от либов
Если я буду пользоваться гетпрок тогда нужно будет подключать кернел либ и т. д. мне надо найти адреса функций и не подключать либы
Quantum Это не совсем одно и тоже В первом случае имеем динамическую линковку, а во втором - статическую. 3DManiac Ты всех запутал, 4 одинаковых темы зачем-то создал и вопрос толком не можешь сфомулировать ( В чем разница твоих методов 1) и 2) ? В том, что в 1) функции CreateFile нет в таблице импорта твоей проги и ты определяешь ее адрес динамически во время выполнения, а в 2) ты даешь указание компилятору включить CreateFile в таблицу импорта, которая будет автоматически заполнена при загрузке программы Не знаю как в масме без либов обойтись, а в фасме твой вариант 2) эквивалентен строчкам library kernel32,'kernel32.dll' import kernel32, CreateFile,'CreateFileA' Не понятно, чего ты так либ боишься. Вручную тебе придется каждую функцию так объявлять, а в либах и инках они уже все собраны вместе и компилятор выберет из них, те которые ты использовал в проге
leo Всё равно кто-то вызовет GetProcAddress (сам код, RTL или загрузчик). 3DManiac Без kernel32 в импорте (или другой либы, использующей kernel32) твоя прога вообще не запустится.
Quantum > "Всё равно кто-то вызовет GetProcAddress" Ну батенька, это уже философия Также можно утверждать что неинициализированные статические переменные (секции .data? или .bss) и динамические это одно и тоже - все равно "кто-то вызовет" VirtualAlloc )
3DManiac Существует такая хрень, короче, как таблица импорта, она указывает, какие функции из какой библиотеки загрузить до выполнения любого кода программы. Это и есть статическая связь наподобие дельфовской с "external". Пользуйся include-файлами из готовой папки в фасме (ещё можешь свои include писать). Разница между динамическим и статическим методом заключается в том, что динамический используется программой во время выполнения работы, она указывает сама, что подгрузить, при статическом эти данные записаны в exe, анализируя PE-файл система загружает необходимые библиотеки и возвращает адреса функций. Макросы "library" и "import" упрощают процесс создания таблицы импорта, я ими, например, не пользуюсь, а прописываю вручную. Этот вопрос надо поместить в FAQ. Я уж и не знаю, как тут ответить.
3DManiac Ты не ответил на главный вопрос - почему ты в своем масме не желаешь использовать либы ? Я тонкостей масма не знаю, но думается что объявить импорт кроме как через includelib нельзя, если только ручками - как советует NullSessiOn в соседней ветке, ну или переходи на фасм )
leo В масме нет возможности строить импорт вручную как в фасме. Правда, несколько либ импорта можно обьединить в одну с помощью link.exe (kernel32.lib + user32.lib = myimport32.lib). Я тоже давно жду ответа на этот вопрос.
Quantum > "В масме нет возможности строить импорт вручную как в фасме" В принципе то наверное можно, если повторить структуру .idata и затем ручками забить адреса и размеры IT и IAT в PE-заголовок, вот только ради чего такая морока ) Или в масме такое в принципе невозможо ?