
هر فایل اجرایی بغیر از کد ها و داده های خود میتواند اطلاعات را از خارج از خود و از dll بگیرد . در هر فایل pe بخشی از هدر فایل ، شامل آدرس جدول آدرس ایمپورت ها میشود که اطلاعات موجود در آن ، آدرس توابعی که از dll ها فراخوانی میشود را در خود نگه داری میکنند( البته این آدرس ها با بیس آدرس dll ترکیب میشوند که در تصویر دوم هم قابل مشاهده است ).
عکس زیر خلاصه ای ار هدر فایلهایی با ساختار PE میباشد . در این عکس import adress table حاوی آدرس iat در برنامه میباشد .

شکل زیر یک توضیح کلی تر و بهتر در اختیار ما میگذارد . در این شکل میتوان iat را بین دو سکشن کد و دیتا ببینید ( لزوما جای iat اینجا نمیباشد ) .

نمونه ای از فراخوانی یکی از dll ها رو کد زیر میتوان مشاهده کرد . این تصویر دیس اسمبل شده یک برنامه میباشد .

مثال های کاربردی :
مثال اول:
در مثال اول یک dll ساخته و آن را با rundll32.exe اجرا میکنیم .
از قسمت نیو پراجکت در قسمت سی پلاس پلاس پروژه ای از نوع win32project میسازیم . در صفحه باز شده نکست را میزنیم . dll را انتخاب کرده و سپس تیک فینیش را میزنیم .
سپس به پروژه خود یک فایل cpp اضافه میکنیم و کد های زیر را در آن مینویسیم :
//[dll01.dll]برنامه را کامپایل میکنیم .
#include <windows.h>extern "C" __declspec (dllexport) void
__cdecl hello()
{
::MessageBox(0, L"hello world", 0, 0);
}BOOL APIENTRY Dll(HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
return TRUE;
}
c:rundll32.exe dll01.dll,hello
RUNDLL32.EXE <dllname>,<entrypoint> <optional arguments>
#include <windows.h>
#include <stdio.h>typedef void(__cdecl *MYPROC)(/*LPWSTR*/);
int main(void)
{
HINSTANCE hinstLib;
MYPROC ProcAdd;
BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;// Get a handle to the DLL module.
hinstLib = LoadLibrary(TEXT("c://dll01.dll"));// If the handle is valid, try to get the function address.
if (hinstLib != NULL)
{
ProcAdd = (MYPROC)GetProcAddress(hinstLib, "hello");// If the function address is valid, call the function.
if (NULL != ProcAdd)
{
printf("dll is loadedn");
fRunTimeLinkSuccess = TRUE;
(ProcAdd)();
}// Free the DLL module.
fFreeResult = FreeLibrary(hinstLib);if (fFreeResult && ProcAdd)
{
printf("dll is Unloadedn");
}
else if (!fFreeResult && ProcAdd)
{
printf("error , dll is not Unloadn");
}
}// If unable to call the DLL function, use an alternative.
if (!fRunTimeLinkSuccess)
{
printf("Message printed from executablen");
}system("pause");
return 0;
}
برچسب:
نویسنده: لیلا مرادی