- Dynamic Link Library
- ¸ñ·Ï
- Load Library ÆíÇÏ°Ô ¾²±â
- DLL Rebasing
- Delay Loading DLL
- ¸µÅ©
1 Dynamic Link Library
À©µµ¿ìÁî°èÀÇ µ¿Àû ¶óÀ̺귯¸®
2 ¸ñ·Ï
2.1 Load Library ÆíÇÏ°Ô ¾²±â
struct PDLL
{
HMODULE hDLL;
PDLL(LPCTSTR filename)
{
memset(this, 0, sizeof(PDLL));
hDLL = LoadLibrary(filename);
}
~PDLL()
{
if (hDLL != NULL)
FreeLibrary(hDLL);
}
};
#define DECLARE_DLL_CLASS(CLASSNAME, DLLNAME) \
public: \
CLASSNAME() : PDLL(DLLNAME) {} \
~CLASSNAME() {}
#define DECLARE_FUNCTION0(RETVAL, FNAME) \
typedef RETVAL (CALLBACK* PFN_##FNAME)(VOID); \
RETVAL FNAME(VOID) \
{ \
if (hDLL == NULL) return (RETVAL)0; \
static PFN_##FNAME s_pfn##FNAME = NULL; \
if (s_pfn##FNAME == NULL) \
s_pfn##FNAME = (PFN_##FNAME)GetProcAddress(hDLL, #FNAME); \
return (s_pfn##FNAME != NULL) ?\
(s_pfn##FNAME)() : (RETVAL)0; \
}
#define DECLARE_FUNCTION1(RETVAL, FNAME, P1) \
typedef RETVAL (CALLBACK* PFN_##FNAME)(P1); \
RETVAL FNAME(P1 _1) \
{ \
if (hDLL == NULL) return (RETVAL)0; \
static PFN_##FNAME s_pfn##FNAME = NULL; \
if (s_pfn##FNAME == NULL) \
s_pfn##FNAME = (PFN_##FNAME)GetProcAddress(hDLL, #FNAME); \
return (s_pfn##FNAME != NULL) ?\
s_pfn##FNAME(_1) : (RETVAL)0; \
}
#define DECLARE_FUNCTION2(RETVAL, FNAME, P1, P2) \
typedef RETVAL (CALLBACK* PFN_##FNAME)(P1, P2); \
RETVAL FNAME(P1 _1, P2 _2) \
{ \
if (hDLL == NULL) return (RETVAL)0; \
static PFN_##FNAME s_pfn##FNAME = NULL; \
if (s_pfn##FNAME == NULL) \
s_pfn##FNAME = (PFN_##FNAME)GetProcAddress(hDLL, #FNAME); \
return (s_pfn##FNAME != NULL) ?\
s_pfn##FNAME(_1, _2) : (RETVAL)0; \
}
#define DECLARE_FUNCTION3(RETVAL, FNAME, P1, P2, P3) \
typedef RETVAL (CALLBACK* PFN_##FNAME)(P1, P2, P3); \
RETVAL FNAME(P1 _1, P2 _2, P3 _3) \
{ \
if (hDLL == NULL) return (RETVAL)0; \
static PFN_##FNAME s_pfn##FNAME = NULL; \
if (s_pfn##FNAME == NULL) \
s_pfn##FNAME = (PFN_##FNAME)GetProcAddress(hDLL, #FNAME); \
return (s_pfn##FNAME != NULL) ?\
s_pfn##FNAME(_1, _2, _3) : (RETVAL)0; \
}
...
#include "PDLL.h"
class DbgHelp : public PDLL
{
DECLARE_DLL_CLASS(DbgHelp, "dbghelp.dll")
DECLARE_FUNCTION0(DWORD, SymGetOptions);
DECLARE_FUNCTION3(BOOL, SymInitialize, HANDLE, PSTR, BOOL);
};
class Toolhelp32 : public PDLL
{
DECLARE_DLL_CLASS(Toolhelp32, "tlhelp32.dll");
DECLARE_FUNCTION2(BOOL, CreateToolhelp32Snapshot, DWORD, DWORD);
};
void DllTest()
{
DbgHelp dbghelp;
Toolhelp32 toolhelp;
DWORD o = dbghelp.SymGetOptions();
BOOL r1 = dbghelp.SymInitialize(NULL, NULL, FALSE);
BOOL r2 = toolhelp.CreateToolhelp32Snapshot(0, 0);
} º°·Î ÆíÇÏÁöµµ ¾ÊÀº°¡...?
2.2 DLL Rebasing
DLL RebasingÀ̶õ DLLÀÌ ÃÖÃÊ¿¡ ·ÎµåµÇ´Â ±âº» ÁÖ¼Ò¸¦ ¿À¹ö¶óÀ̵åÇØÁÖ´Â ÀÏÀ» ¸»ÇÑ´Ù.
ÀÌ·± ÀÏÀÌ ÇÊ¿äÇÑ ÀÌÀ¯´Â ´ëºÎºÐÀÇ DLLÀÌ °°Àº ±âº» ÁÖ¼Ò(0x10000000)¸¦ °¡Áö´Â µ¥¼ ±âÀÎÇÑ´Ù. DLLÀ» ·ÎµåÇßÀ» ¶§, ±× DLLÀÌ µé¾î°¡¾ßÇÒ ÁÖ¼Ò¸¦ ´Ù¸¥ DLLÀÌ ÀÌ¹Ì Â÷ÁöÇϰí ÀÖ´Â °æ¿ì, Ä¿³ÎÀÌ ´Ù¸¥ ÁÖ¼Ò¸¦ ¾Ë¾Æ¼ ã¾ÆÁÖ°Ô µÇ´Âµ¥, ÀÌ ÀÛ¾÷ÀÌ ²Ï³ª ¿À¹öÇìµå¸¦ Â÷ÁöÇÑ´Ù´Â °ÍÀÌ´Ù.
±×·¸´Ù¸é ¾î¶² ±âÁØÀ¸·Î DLLÀÌ µé¾î°¥ ÁÖ¼Ò¸¦ Á¤ÇØÁÙ °ÍÀΰ¡? ¾÷°è Ç¥ÁØ(-_-)ÀûÀÎ ¾ÆÀ̵ð¾î´Â DLL ÆÄÀÏÀÇ ¾ËÆÄºª ¸íĪÀ» ÀÌ¿ëÇÏ´Â °ÍÀÌ´Ù.
| DLL À̸§ ¾ËÆÄºª ù±ÛÀÚ | ½ÃÀÛ ÁÖ¼Ò |
| A-C | 0x60000000 |
| D-F | 0x61000000 |
| G-I | 0x62000000 |
| J-L | 0x63000000 |
| M-O | 0x64000000 |
| P-R | 0x65000000 |
| S-U | 0x66000000 |
| V-X | 0x67000000 |
| Y-Z | 0x68000000 |
À§¿Í °°Àº ½ÄÀ¸·Î ±âº» ÁÖ¼Ò¸¦ Á¤Çϰí, ÇØ´çÇÏ´Â DLLµéÀ» ÇϳªÇϳª ¸ÅÄ¡½ÃÄѳª°¡´Â °ÍÀÌ´Ù. ¿¹¸¦ µé¾î A1.DLL D1.DLL, D2.DLLÀÌ ÀÖ´Ù¸é...
| DLL À̸§ | ÁÖ¼Ò |
| A1.DLL | 0x60000000 |
| D1.DLL | 0x61000000 |
| D2.DLL | 0x61100000 |
ÀÌ·± ½ÄÀ¸·Î ÁÖ¼Ò¸¦ Á¤ÇØÁØ´Ù. ÁÖ¼Ò´Â ÇÁ·ÎÁ§Æ® ¼¼ÆÃÀÇ ¸µÄ¿ÅÇ¿¡ °¡¸é °£´ÜÈ÷ ÁöÁ¤ÇØÁÙ ¼ö ÀÖ´Ù. ÀÚ½ÅÀÌ ¸¸µç DLLÀÌ ¾Æ´Ï¶ó¸é, ºñÁê¾ó ½ºÆ©µð¿À³ª Ç÷§Æû SDK¿¡ µû¶ó¿À´Â Rebase.exe À¯Æ¿¸®Æ¼¸¦ ÀÌ¿ëÇϱ⠹ٶõ´Ù.
2003 ¹öÀüÀÇ °æ¿ì´Â ...\Microsoft Visual Studio .NET 2003\Common7\Tools\Bin µð·ºÅ丮¿¡ ÀÖ´Ù.
ÀÌ À¯Æ¿¸®Æ¼¸¦ »ç¿ëÇÏ´Â ±âº»ÀûÀÎ ¹æ¹ýÀº ´ÙÀ½°ú °°´Ù.
rebase /b 0x60000000 A1.DLL
rebase /b 0x61000000 D1.DLL
rebase /b 0x61000000 D1.DLL D2.DLL
¸¶Áö¸· ¶óÀÎ °°Àº °æ¿ì, ¿©·¯ °³ÀÇ DLL¿¡´Ù ÇѲ¨¹ø¿¡ ÁÖ¼Ò¸¦ ÁÖ±â À§ÇÑ ±â´ÉÀε¥, ÁÖ¼Ò°¡ ³Ê¹« °¡±î¿öÁú ¿ì·Á°¡ ÀÖÀ¸¹Ç·Î ±ÍÂú´õ¶óµµ ¼öµ¿À¸·Î Çϳª¾¿ Çϱ⠹ٶõ´Ù. Á» ´õ Ãß°¡ÀûÀÎ ±â´ÉµéÀº ÀÚü ¸Å´º¾óÀ» Âü°íÇϱ⠹ٶõ´Ù.
Âü°í
2.3 Delay Loading DLL
ÇÁ·Î±×·¥À» ½ÇÇàÇÒ ¶§, À©µµ¿ìÁî´Â ½ÇÇà ÆÄÀÏÀÇ ÀÓÆ÷Æ® ¿µ¿ª¿¡ ÀÖ´Â DLLµéÀ» ÀüºÎ ·ÎµåÇÏ°Ô µÈ´Ù. ¹®Á¦´Â ÀÌ DLL ÆÄÀÏÀÌ Á¸ÀçÇÏÁö ¾Ê´Â °æ¿ì, ¹«½¼¹«½¼ DLLÀÌ ¾ø´Ù°í ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇÁöµµ ¾Ê´Â´Ù´Â Á¡ÀÌ´Ù. ÇØ´çÇÏ´Â DLLÀÌ ¾ø¾îµµ ÀÏ´Ü ÇÁ·Î±×·¥À» ½ÇÇàÇÏ°í ³ ´ÙÀ½, ¾î¶² 󸮸¦ ÇÏ°í ½ÍÀ» ¶§ ¾µ ¼ö ÀÖ´Â °ÍÀÌ DllDelayLoadingÀ̶ó´Â °³³äÀÌ´Ù.
3 ¸µÅ©
SeriousMoin v1 (koMoinMoin 1.0a4 Modified)