Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 сентября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Программисты долго мучаются с кодом прогаммы, изучают С++, WinAPI функции, MSDN. Потом пишут банальную систему защиты или навешивают банальный протектор, а крэкеры и реверсеры справляются с такой защитой за 5 минут. В итоге, продажи программы почти нулевые. Чтобы такого не допустить, тут самому надо немного поднабрать опыта отладки, реверсинга, тот же отладчик Ollydbg изучить или дизассемблер IDA Pro. Но где искать по крохам эти знания? Нет, конечно можно годами "методом тыка" разбираться, но куда быстрее видеокурс специальный посмотреть. Вот тут он есть: ссылка. Автор курса с большим опытом и объясняет понятно, я из этого курса много узнал про то как работает компьютер, процессор, про инструменты специальные и как с ними работать. Мои коллеги программисты на работе ничего такого и не знают, теперь я им нос утру.

Динамические библиотеки. Общие положения


Использование динамических библиотек (по-другому – библиотек динамической компоновки) – это способ осуществления модульности в период выполнения программы. Динамическая библиотека (DLL)упростить и саму разработку программного обеспечения. Вместо того чтобы каждый раз перекомпилировать огромные EXE-программы, достаточно перекомпилировать лишь отдельный динамический модуль. Кроме того, доступ к динамической библиотеке возможен сразу из нескольких исполняемых модулей, что делает многозначность более гибкой. Структура DLL-модуля практически такая же, как и EXE-модуля. Тот, кто программировал под MSDOS, должен быть знаком с понятием оверлея. По своей функциональности динамическая библиотека очень похожа на оверлей, но название «динамическая библиотека» Более удачно. Динамическая библиотека это еще и возможность разработки приложений на разных языках. Динамическая библиотека, написанная, скажем, на Visual C++, может вызываться из программ, написанных на любых языках.

Динамическая библиотека проецируется на адресное пространство вызывающего процесса. В результате она становится частью этого процесса. Если динамическая библиотека резервирует динамическую память, то этот блок памяти принадлежит процессу. При удалении библиотеки из памяти блок остается и будет удален только процессом.

При создании Динамических библиотек вам придется указывать экспортируемые функции. Делается это следующим образом:

_declspec(dllexport)int Func(char * s);

В программе, вызывающей эту функцию, следует ввести следующую строку:

_declspec(dllimport) int Func(char * s);

Для того чтобы двигаться дальше, введем такое понятие, как связывание. Во время трансляции связываются имена, указанные в программе как внешние, с соответствующими именами из библиотек. Такое связывание называется ранним (или стратегическим). Напротив, в случае с динамической библиотекой связывание происходит во время выполнения модуля. Такое связывание называется поздним (или динамическим). При этом позднее связывание может происходить в автоматическом режиме в начале запуска программы и при помощи специальных API-функций (см. ниже) по желанию программиста. При этом говорят о явном и неявном связывании. Сказанное иллюстрирует рисунок ниже. Заметим также, что использование динамических библиотек экономит дисковое пространство, т. к. процедура из такой библиотеки помещается в модуль лишь один раз, в отличие от процедур. Помещаемых в модули из стратегических библиотек.

В среде Windows практикуются два механизма связывания: по символьным именам и порядковым номерам. В первом случае функция, определенная в динамической библиотеке, идентифицируется по ее имени, во втором – по порядковому номеру в основном практиковалось в старой операционной системе Windows 3.x. На наш взгляд, связывание по имени – более удобный механизм.

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

В любой динамической библиотеке следует определить точку ввода (процедура ввода). При загрузке динамической библиотеки и выгрузке динамической библиотеки автоматически вызывается процедура ввода. Заметим при этом, что каким бы способом ни була загружена динамическая библиотека (явно или неявно), выгрузка динамической библиотеки из памяти будет происходить автоматически при закрытиии процесса или потока. В принципе, процедура входа может быть использована для некоторой начальной инициализации динамических переменных. Довольно часто эта процедура остается пустой. При вызове процедуры входа в нее помещаются три параметра:

Первый параметр - идентификатор DLL-модуля.
Второй параметр - причина вызова (см. ниже).
Третий параметр - резерв.
Рассмотрим подробнее второй параметр процедуры ввода. Вот четыре возможных значения этого параметра:

DLL_PROCESS_DETACH = 0
DLL_PROCESS_ATTACH = 1
DLL_PROCESS_ATTACH = 2
DLL_PROCESS_DETACH = 3

  • DLL_PROCESS_ATTACH - Сообщает, что динамическая библиотека загружена в адресное пространство вызывающего процесса.
  • DLL_PROCESS_ATTACH - Сообщает, что текущий процесс создает новый поток. Такое сообщение посылается всем динамическим библиотекам, загруженным к это мувремени процессом.
  • DLL_PROCESS_DETACH - Сообщает, что динамическая библиотека выгружается из адресного пространства процесса.
  • DLL_PROCESS_DETACH - Сообщает, что некий поток, созданный данным процессом, в адресное пространство которого загружена данная динамическая библиотека, уничтожается.

Для того чтобы продемонстрировать, как это работает, создадим простую динамическую библиотеку, содержащую только простейшую обработку точки входа и никаких экспортируемых функций. Для этого создадим проект WIN32 Project с именем dll32 и выберем опцию DLL. Дополним модуль dll32.cpp следующим образом:

//dll32.cpp : Defines the entry point for
 
 //the DLL application.
 
 //
 
 
 
 #include "stdafx.h"
 
 BOLL APIENTRY DLLMain ( HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
 
 {
 
 switch( ul_reason_for­­_call, ) {
 
 
 
         case DLL_PROCESS_ATTACH:
 
             MessageBox(0,"загрузка библиотеки","",MB_OK);
 
             break;
 
 case DLL_THREAD_ATTACH:
 
 break;
 
 case DLL_THREAD_DETACH:
 
 break;
 
 case DLL_THREAD_DETACH:
 
             MessageBox(0,"выгрузка библиотеки","",MB_OK);
 
             break;
 
 }
 
     return true;
 
 }

Таким образом, мы обрабатываем начало и конец работы с динамической библиотекой. Чтобы проверить, как все это сработает, создадим программу с одной лишь единственной функцией, которая загружает динамическую библиотеку. Проще всего для этих целей взять консольную программу (назовем проект dllexec). Вот текст модуля dllexec.cpp:

#include "stdafx.h"
 
 #include <windows.h>
 
 int _tmain(int argc, _TCHAR* argv [])
 
 {
 
     HMODULE h; //дескриптор библиотеки
 
     h=loadlibrary ("..\\..\\dll32\\release\\dll32.dll");
 
     return 0;
 
 }

Загрузка динамической билиотеки осуществляется функцией API loadLibrary, единственным аргументом которой является строка, содержащая полное имя динамической библиотеки. При неудачном выполнении функции она возращает NULL, в противном случае возвращается дескриптор загруженного модуля. При запуске данной программы появится в начале сообщение Загрузка библиотеки, а затем Выгрузка библтотеки. Как вы несоиненно, догадались, выгрузка динамической библиотеки осуществляется автоматически при выгрузке вызывающей программы. Если ваша программа работает с несколькими динамическими библиотеками, может появиться необходимость выгрузки той или иной библиотеки еще до окончания работы основной программы. Эта операция осущетвляется функцией FreeLibrary, аргументом которой является дескриптор динамической библиотеки, загруженной в память (модуля).

Продолжим наши изыскания и усовершенствуем нашу динамическую библиотеку и программу, ее возвышащую. Пусть динамическая библиотека содержит всего одну экспортируемую функцию fact - вычисление факториала. Тут следует напомнить читателю, что C++ по умолчанию заведомо делает добавку к именам функций так, чтобы различать функции с разным количеством и типом параметров. Чтобы можно было вызывать фунцию из другого модуля по ее обычному имени, следует объявить ее как extern "C"



<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS