Форум программистов, компьютерный форум, киберфорум
FASM
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
Другие темы раздела
FASM Вечная ошибка https://www.cyberforum.ru/ fasm/ thread2339645.html
Почему вылезает такая ошибка? перепробовала что могла, но я ничего не смогла =(
Посимвольная очистка буфера клавиатуры FASM
Помогите как сделать чтобы при нажатии backpace удалялся символ из буфера дальше продолжался ввод с этого места.format MZ mov ah, 0 mov al, 3 int 10h start: mov ax, 0b800h ; задаём адрес страницы mov es, ax ; помещаем его в сегмент mov ax, 0x0040 ; задаём адрес указателей mov fs, ax ; помещаем в сегмент
FASM Очистка кольцевого буфера клавиатуры https://www.cyberforum.ru/ fasm/ thread2339369.html
Пытался работать с буфером клавиатуры, и совсем не могу его очистить по нажатию клавиши backspace. Пытался делать через приправнивание головы и хвоста mov ax, mov ,ax Но как то совсем не получилось. Вот мелкий код, в asm разбираюсь очень неочень, тапками сильно не бейте ^^" org 100h go: mov ah, 0 mov al, 3 int 10h mov ax, 0b800h
FASM Рисование кривой линии при нажатой ЛКМ Сабж. Нужно отрисовывать кривую линию при нажатой ЛКМ. Видеорежим: 320х200 (13h). Беру координаты курсора с помощью функции 3h прерывания 33h (cx - x, dx - y). При зажатой ЛКМ отрисовка идёт почти как и надо, за исключением того, что есть небольшая область слева, в которой отрисовка не идёт совсем, и того, что по горизонтали линия начинает убегать от курсора. Читал, что в режиме 13h,... https://www.cyberforum.ru/ fasm/ thread2336098.html
Работа с ОЗУ FASM
Здравствуйте! При ассемблировании кода в строке: mov , bx Происходит ошибка: error: reserved word used as symbol. Как записать в память значение регистра bx?
FASM Заполнение, обмен значений элементов массива. Ошибка при компиляции. Вот задание: Разработать и ввести исходный текст простейшей программы, которая 1) выводит на экран вашу фамилию; 2) резервирует память для таблицы элементов длиной равной 16 (N-номер варианта) со следующим типом элементов: четные варианты-байт; нечетные-слово (2 байта); 3) заполняет таблицу целыми числами, начиная с номера вашего варианта; 4) обнуляет элемент таблицы cо значением равным... https://www.cyberforum.ru/ fasm/ thread2317578.html
FASM Parallel.For, хочу посоветоваться https://www.cyberforum.ru/ fasm/ thread2284167.html
Всем привет! Решил написать небольшой include для fasm под Windows, который будет позволять выполнять параллельные вычисления для for-циклов по аналогии с TParallel.For в Delphi или Parallel.For в C#, но без таких заморочек, как там, а что-то простенькое (строк на 500 асм-кода, ну может, чуть больше). Результат потом выложу. Кто не в теме – схема такая. Запускается функция инициализации,...
Резидентный обработчик 21h прерывания (из 10-й главы Калашникова) FASM
Имеется вот такой код резидентного обработчика прерываний, написанный предположительно на MASM данная программа должна после выполнения оставить часть себя в оперативной памяти подписать ее на прерывание 21h я изучаю ассемблер с компилятором FASM и не совсем могу понять реализацию данного примера по этому прошу помочь мне перевести этот код с MASM на FASM CSEG segment assume cs:CSEG,...
FASM Чтение и запись файлов у меня возникла проблема с реализацией чтения файлов в сети полно примеров по этой теме, но в основном они написаны c под компиляторы MASM, NASM и пр., в то время как я использую FASM корень проблемы заключается в том что я не могу понять, как корректно объявить переменную-буфер в которую буду считывать файл в найденных мною примерах буфер объявлялся так Buffer equ $ или так Buffer DB... https://www.cyberforum.ru/ fasm/ thread2274156.html FASM Резидентный обработчик: перехват нажатия "F1" и после этого запись в буфер клавиатуры символа "о" я пытаюсь разобраться с написанием обработчика и созданием резидентных программ на просторах сети нашел такой пример, который, по идее должен перехватывать нажатие "F1" и после этого записывать в в буфер клавиатуры символ "о" format mz jmp init old_09 dw 0, 0 new_09: push ax in al,60h cmp al, 3bh https://www.cyberforum.ru/ fasm/ thread2271116.html
Как остановить кулеры? FASM
Доброе время суток! Делаю программу на подобии SpeedFan, для остановки кулеров. Есть ли в Windows встроенный функции для работы с кулером? Какое делать прерывание? Где есть та функция, что управляет кулером?
FASM Как подключить include к flat компилятору Здравствуйте,как подключить include к flat компилятору?Требуется подключить include 'win32a.inc' к проекту.win32a.inc лежит в папке "include" компилятора. https://www.cyberforum.ru/ fasm/ thread2265992.html
Эксперт Hardware
Эксперт Hardware
6160 / 2397 / 398
Регистрация: 29.07.2014
Сообщений: 3,143
Записей в блоге: 4
0

Пишем DLL на FASM'e - FASM - Ответ 12999244

25.10.2018, 00:16. Показов 33947. Ответов 17
Метки (Все метки)

Author24 — интернет-сервис помощи студентам
Всё описанное здесь - это личное видение,
если не оговорено обратное.

Если вас мучает вопрос: "Как создать DLL-библиотеку?", то вы пришли по адресу.
Небольшой ликбез для новичков позволит разобраться с такими вопросами как:
  1. Что такое DLL и зачем они нужны.
  2. Системная поддержка и проецирование в память.
  3. Точка входа в DLL-библиотеку.
  4. Пример простейшей DDL на FASM.
  5. Подводные камни при их создании.
  6. Заключение.
--------------------------------------------------

Dynamic Link Library в простонародье DLL - часть исполняемого файла в виде внешнего модуля. Модуль представляет из-себя библиотеку уникальных процедур и функций, которых нет в составе системных WinAPI, но необходимых нашей программе. Разделение исполняемого файла на подгружаемые модули позволяет эффективно использовать память, т.к. услугами одной библиотеки могут пользоваться сразу несколько приложений.

По своей природе, DLL не отличается от EXE.. те-же секции кода/данных/импорта, только добавляется ещё одна - секция экспорта, благодаря которой приложения могут импортировать из библиотеки имеющиеся в ней функции. Есть и ещё одно/важное отличие *dll от *exe - они не способны сами исполнять код, поскольку каждый участок обёрнут в отдельную процедуру. Эти процедуры просто ждут своего часа, пока exe-модуль (или другая dll) не запросит какую-нибудь из них.


Системная поддержка и проецирование в память

Когда система запускает юзерский процесс, ядро проделывает огромную работу. Помимо прочего, это выделение памяти для юзерской кучи TLS - Thread Local Storage, и создание в этой куче служебных структур типа PEB - Process Environment Block (блок окружения процесса), и дочернюю к РЕВ структуру TEB - Thread Environment Block (блок окружения основного потока). Это т.н. "процесс инициализации приложения", подготавливающий юзерский контекст и окружение. Занимается этим "загрузчик образа", который находится в Ntdll.dll.

Поскольку процедура инициализации стартует до нашего приложения, алгоритм её действий остаётся для нас прозрачным. Однако после загрузки exe, в стеке кое-что остаётся и если прокрутить его в отладчике назад (в сторону меньших адресов), то можно найти там много интересного. Инструкции POP и RET не затирают данные в стеке, а просто смещают указатель ESP, в результате чего всё тайны всплывают наружу.

Проделав глобальную работу, загрузчик приступает к разбору таблицы импорта нашего EXE-модуля, чтобы подтянуть в юзерскую память внешние библиотеки, динамически скомпонованные во время компиляции EXE. Каждая импортируемая DLL может иметь свою/собственную таблицу импорта, поэтому эта операция будет продолжаться в рекурсивном режиме до тех пор, пока не будет найден весь импорт. По мере загрузки каждой DLL, загрузчик будет сохранять её информацию в виде базы, в структурах PEB и TEB.

В поисках библиотек, загрузчик сначала открывает в реестре ветку:
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
где прописаны системные либы пользовательского режима. Если в таблице импорта нашего exe имеются и сторонние (по-факту самописные) dll'ки, то загрузчик ищет их в следующих директориях:

1. Текущий каталог, от куда запускается приложение;
2. C:\Windows\system32;
3. C:\Windows\system (для 16-бит приложений, но находит и 32-бит).

Другими словами, мы можем располагать свои DLL в любую из указанных диров и загрузчик подхватит их на-лету, спроецировав на нашу память.

Добавлено через 3 минуты
База данных загруженных модулей

Загрузчик ведёт список всех модулей, которые были загружены нашим процессом. Инфа хранится в структуре PEB, ..а именно в её подструктуре PEB_LDR_DATA. В ней загрузчик ведёт три списка 'list', в которых содержится одинаковые, но по разному выстроенные листы: по порядку загрузки(Load), по размещению в памяти(Memory) и в порядке инициализации(Init):
Код
typedef struct _PEB_LDR_DATA {
  ULONG               Length;
  BOOLEAN             Initialized;
  PVOID               SsHandle;
  LIST_ENTRY          InLoadOrderModuleList;
  LIST_ENTRY          InMemoryOrderModuleList;
  LIST_ENTRY          InInitializationOrderModuleList;
} PEB_LDR_DATA, *PPEB_LDR_DATA;
Эти списки представляют из-себя дочерние структуры LDR_MODULE, в которых и хранится инфа о каждом/подгружаемом модуле (для всех импортируемых DLL создаётся свой лист). Посмотрим на эти поля и дадим им короткие пояснения:
Код
typedef struct _LDR_MODULE {
  LIST_ENTRY          LoadOrderList     ; см. PEB_LDR_DATA
  LIST_ENTRY          MemoryOrderList   ;  ...
  LIST_ENTRY          InitOrderList     ;    ...
  PVOID               BaseAddress       ; Базовый адрес загрузки в память
  PVOID               EntryPoint        ; Указатель на точку-входа в библиотеку
  ULONG               SizeOfImage       ; Её размер в памяти
  UNICODE_STRING      FullDllName       ; Полный путь к либе
  UNICODE_STRING      BaseDllName       ; Имя без пути
  ULONG               Flags             ; Атрибуты доступа
  SHORT               LoadCount         ; Важно! кол-во обращений к DLL
  SHORT               TlsIndex          ; Слот либы в юзерской куче
  LIST_ENTRY          HashTableEntry    ; Хеш для быстрого запуска/остановки
  ULONG               TimeDateStamp     ;
} LDR_MODULE, *PLDR_MODULE;
Нужно сказать, что это детали загрузчика пользовательского режима в системной Ntdll.dll. Ядро использует свой/собственный загрузчик для нативных драйверов и зависимых к ним DLL, с похожей структурой записей. Важно понять, что РЕВ создаётся загрузчиком для каждой задачи (процесса) в отдельности: сколько процессов - столько и структур РЕВ.

Посмотрим, чем занимается загрузчик на финальном этапе, после настройки окружения:
  1. Загружает каждую DLL, на которую есть линк в таблице импорта EXE-модуля.
  2. Проверяет в базе LDR_MODULE, не была-ли DLL уже загружена (поле LoadCount). Если нет, загрузчик создает структуру для этой DLL и вставляет её в базу данных РЕВ.
  3. При поиске, загрузчик сначала проверяет DDL на соответсвие Known (в реестре). Попадание означает, что DLL уже в памяти и была загружена системой при запуске. Если в реестре прописки нет, то ищется рядом с EXE или в папках System.
  4. После того как DLL найдена, загрузчик передаёт управление ядерной функции LdrLoadDLL() для её загрузки в память. Эта fn. возвращает управление опять загрузчику, который проверяет, не загрузило-ли ядро нашу DLL'ку в какое-нибудь другое место - механизм перемещения, или Relocation.
  5. Если загрузчик обнаружит перемещение проекции файла от базового значения, он проводит анализ секции ".reloc" в DLL-модуле и выполняет поправки в структурах РЕВ. Если инфа о перемещении в либе отсутствует, встречаем сбой загрузки DLL.
  6. Теперь загрузчик проводит анализ IAT (таблицы импорта) для поиска конкретных функций по их именам или ординалам (порядковым номерам).
  7. На этом загрузчик завершает свою работу и передаёт управление на точку входа в EXE-приложение, которая находится в стеке. Процесс запускается.. но загрузчик не уходит в тень, а всегда ожидает нас на низком старте. К его услугам мы обращаемся всякий раз, когда динамически вызываем функции DLL-библиотек, например через LoadLibrary(). Загрузчику приходится повторять все/перечисленные пункты сначала, что сказывается на времени выполнения программы.

Добавлено через 1 минуту
Точка входа в DLL-библиотеку

Когда EXE-модуль вызывает какую-нибудь функцию из DLL, системный загрузчик прибегает к услугам API LdrLoadDLL() из либы ntdll. Эта-же API принимает управление от функций динамического вызова процедур LoadLibrary(), GetModuleFileName() etc, ожидающих получить дескрипторы модулей. Вот её прототип:
Код
LdrLoadDll(
   IN PWCHAR               PathToFile OPTIONAL,
   IN ULONG                Flags OPTIONAL,
   IN PUNICODE_STRING      ModuleFileName,
  OUT PHANDLE              ModuleHandle );
Запрос от LdrLoadDLL() принимает на грудь необязательная функция DllEntryPoint() (аналог DllMain), которая по-факту является точкой-входа в любую библиотеку. Необязательная она тем, что мы можем игнорировать её аргументы и это не приведёт к краху. Однако чего нельзя ингорить, так это возвращаемое ею значение TRUE в регистре EAX, поскольку LdrLoadDLL() рассчитывает его получить. Ldr передаёт в DllEntryPoint() три аргумента в таком порядке, а обрабатывать их или нет - дело хозяйское, ..главное вернуть EAX=1:
Код
DllEntryPoint (
***IN HINSTANCE            hinstDLL,
***IN DWORD                fdwReason,
***IN LPVOID               lpvReserved *);
  1. hinstDLL - в теории дескриптор DLL, а в реале - её VA-база в памяти.
  2. fdwReason - одна из четырёх причин вызова точки входа:
    • DLL_PROCESS_ATTACH - модуль подключается к пространству текущего процесса при его запуске.
    • DLL_PROCESS_DETACH - модуль удаляется из адресного пространства процесса.
    • DLL_THREAD_ATTACH - процесс создаёт новый поток, причем на основной поток процесса это не распространяется.
    • DLL_THREAD_DETACH - созданный поток отработал своё и завершается.
  3. lpvReserved - резерв для системных нужд.
Здесь видно, что интересным является лишь параметр fdwReason, который передаёт нам LdrLoadDLL(). Благодаря ему мы можем провести какие-нибудь подготовительные операции init, перед вызовом конкретной функции из нашей тушки. Но повторюсь, что никто нас к этому не принуждает и мы можем просто вернуть единицу и всё. Нужно сказать и о том, что Ldr ожидает TRUE только при обращение к DDL'ке с флагом 'DLL_PROCESS_ATTACH', а в остальных случаях возврат не критичен.

Кроме этого нужно учитывать, что на входе либа ещё не определена, и фактически мы находимся внутри обработчика LdrLoadDLL(). Такая картина накладывает определённые ограничения на вызов некоторых/вложенных Win-API внутри DllEntryPoint(), пока не выйдем из точки-входа по RET. Не сбрасывайте это со-счетов!

С деталями можно ознакомиться в статье КК:
"Динамические библиотеки для гурманов" - http://citforum.ru/book/cook/dll1.shtml

Вернуться к обсуждению:
Пишем DLL на FASM'e FASM
3
Заказать работу у эксперта

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.10.2018, 00:16
Готовые ответы и решения:

Обсуждение статьи "Пишем DLL на FASM'e"
R71MT, на сам знаешь каком сайте в разделе ARTICLES моя статья "Import x64", посмотри, может...

Пишем DLL для работы с регистром.
Добрый день. Пишу DLL для работы с регистром и столкнулся со следующей проблемой при записи...

Ошибка об отсутствии MSVCP140D.dll, ucrtbased.dll, CONCRT140D.dll, VCRUNTIME140D.dll
Добрый день, товарищи. Возникла проблема. Делаю программу с использованием openCV 3.1 на Visual...

Кто может поделиться файлами ogg.dll, vorbis.dll и vorbisfile.dll - 32-х и 64-битными версиями?
Движок перевожу на платформу Win64 и нужно, чтобы разрядность ЕХЕ и DLL совпадали, а в интернете...

17
25.10.2018, 00:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.10.2018, 00:16
Помогаю со студенческими работами здесь

Затупил, скажите где взять libmysqld.dll, libmysqld50.dll, libmysqld51.dll
Вечер добрый, ставлю ZEOS на Delphi 7, и для нормальной работы нужны файлы libmysqld.dll,...

Сборка Qt: отучение Qt от mingw10.dll, libgcc_s_dw2-1.dll и других Qt***.dll
В связи с тем, что часто возникают одни и те же вопросы, а в нете копаться никто не любит привожу...

Пишем патч на C++
Обясните как мне написать патч на C++, в asm естественно. Данные: 1) есть файл с именем Prog.exe...

Пишем брут
Кто знает возможно ли написать брут другвокруг

Пишем поисковик
Возникла идея написать поисковик файлов на компьютере, но не простой. Поисковик будет работать в...

ПИшем читалку
Мне надо сделать прогу для отображения текста в многостраничном формате(чтоб можно было ходить по...

0
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru